我试图找出频率为 50 Hz 的信号的主要频率(以 200 Hz 采样 - 每 5 毫秒)。
我用来执行此操作的 python 代码如下(基于此):
import numpy
from numpy import sin
from math import pi
t = numpy.linspace(0, 1, 201) # 200 Hz sampling rate
y = sin(2*pi*t*50)
fourier = numpy.fft.fft(y)
frequencies = numpy.fft.fftfreq(len(t), 0.005) # where 0.005 is the inter-sample time difference
positive_frequencies = frequencies[numpy.where(frequencies > 0)]
magnitudes = abs(fourier[numpy.where(frequencies > 0)]) # magnitude spectrum
peak_frequency = numpy.argmax(magnitudes)
我得到的峰值频率是 49 Hz,而不是 50 Hz(我认为我应该得到的)。
这是计算峰值频率的正确方法吗?如果是,那么您能解释一下为什么会发生这种情况吗?我的错误在哪里?
编辑 根据 SergV 的回答修改的代码:
import numpy
from numpy import sin
from math import pi
Fs=200.
F=50.
t = [i*1./Fs for i in range(200)]
y = sin(2*pi*numpy.array(t)*F)
fourier = numpy.fft.fft(y)
frequencies = numpy.fft.fftfreq(len(t), 0.005) # where 0.005 is the inter-sample time difference
positive_frequencies = frequencies[numpy.where(frequencies > 0)]
magnitudes = abs(fourier[numpy.where(frequencies > 0)]) # magnitude spectrum
peak_frequency = numpy.argmax(magnitudes)
计算出的峰值频率仍然是 49 Hz...
编辑2:问题似乎是正频率不包括0。将代码更改为
positive_frequencies = frequencies[numpy.where(frequencies >= 0)]
magnitudes = abs(fourier[numpy.where(frequencies >= 0)])
计算出的主导频率为 50 Hz(如预期的那样)。
这是我得到的幅度谱:http: //imgur.com/JxhnNc5它表明主要频率是 50 Hz。有趣的是,即使由于该错误,计算的峰值频率为 49 Hz,幅度谱也显示了正确的主导频率(50 Hz)