Burak Nebioglu
Burak Nebioglu

Reputation: 81

Numpy fft result is unexpected

I used fft.fft(data) and plotted that result I was expecting to the frequency that I gave in data. I was expecting to see 50 hz but I got something strange.

import numpy as np
import math as m
import matplotlib.pyplot as plt


data=[]

for x in range(1000):
    data.append(m.sin(2*m.pi*50*0.001*x))


plt.plot(np.fft.fft(data)/len(data))

plt.show()

What should I do to see 50 Hz as result?

Thank you very much

Upvotes: 2

Views: 1745

Answers (2)

ebarr
ebarr

Reputation: 7842

This is really a question for the DSP stack exchange (https://dsp.stackexchange.com/).

You are doing two things that are causing the odd result:

  1. You are performing a complex to complex FFT on real data, so you will have your signal mirrored about the Nyquist frequency (Hermitian symmetry).

  2. You are dividing and plotting the complex output, not the Fourier amplitudes or powers.(Matplotlib doesn't "get" complex numbers, so this comes out looking like garbage.)

try this instead:

plt.plot(abs(np.fft.rfft(data))/(len(data)/2))

Upvotes: 0

askewchan
askewchan

Reputation: 46530

You need to specify the x axis in your plot.

First, create the data:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 1, 1000)
data = np.sin(2*np.pi*50*t)

Now, get the frequencies:

f = np.fft.fftfreq(len(data), t[1]-t[0]) # length of data, and dt

And plot the magnitude of the fft vs frequencies:

data_fft = np.abs(np.fft.fft(data)) / len(data)
plt.plot(f, data_fft)

fft

Upvotes: 4

Related Questions