Search code examples
pythonsignal-processing

Aliasing in Python even though under Nyquist rate


From my understanding, the following code creates a 1 second long sine wave sampled at 256 Hz, meaning a Nyquist rate of 128 Hz. So if a sine wave is having a frequency of 100 Hz, it should not experience aliasing.

t = np.linspace(0,1,256)
x = np.sin(2*np.pi*100*t)
plt.plot(t,x)

However, the plot looks something like this, with what I believe is aliasing?

enter image description here

Is there anything I'm doing wrong? what's the reason for this?


Solution

  • First, your code is incorrect. You are sampling at 255Hz, not 256. To fix,

    t = np.linspace(0, 1, 256, endpoint=False)
    

    OR

    t = np.linspace(0, 1, 257)
    

    Here is a zoomed-in version of your (corrected) plot, with the sine wave shown at a much higher sampling frequency:

    t = np.linspace(0, 1, 256, endpoint=False)
    x = np.sin(2 * np.pi * 100 * t)
    plt.plot(t, x)
    plt.plot(t2 := np.linspace(0, 1, 10000), np.sin(2 * np.pi * 100 * t2), 'r:')
    

    enter image description here

    You are getting at least one point per half-cycle, which means that you can estimate the true frequency meaningfully from this data. Here is a similar dataset sampled at exactly Nyquist (200Hz):

    enter image description here

    Sampling with a different phase will move the line up and down, but it won't allow you to find meaningful information about the input signal.

    Aliasing looks like this (sampling at 45Hz):

    enter image description here

    Since the sampling frequency is so much lower than the signal frequency, you end up with an estimate that is much lower.