“清晰”的 50 Hz 信号中的主导频率

信息处理 fft 傅里叶变换 频谱 频率 Python
2022-02-06 21:24:12

我试图找出频率为 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)

2个回答

要获得 FFT 结果 bin 的频率,您需要将 bin 编号乘以采样率除以 FFT 的长度。

请注意,FFT 结果箱之间频率的正弦曲线将使其能量分布在几个 FFT 结果箱中,而不仅仅是具有峰值幅度或最接近的一个。所以可能需要一些插值。

的大小是的是 201。所以 fft 的频率区间不是 1 Hz。更改计算代码

Fs=200.
F=50.
t = [i*1./Fs for i in range(200)]

现在您在 50 Hz 上只有 1 个峰值。

附言

  • 绘制幅度谱
  • 尝试修改 F (49, 49.5, 49.67)。享受!

欢迎来到 DSP 和新问题!