【问题标题】:Python: Compute largest Fourier coefficient of a signalPython:计算信号的最大傅立叶系数
【发布时间】:2015-07-16 12:38:31
【问题描述】:

我正在尝试确定信号的最主要频率。然而,当人为地创建一个 50 Hz 信号并应用足够的零填充来提高 fft 分辨率时,我得到了 49,997 Hz 的最高频率。对于我的应用程序,这是一个显着的差异。我在这里做错了吗?

import numpy as np
import matplotlib.pyplot as plt

fs = 2**12

x = np.linspace(0,1,fs+1)

signal = np.sin(50*2*np.pi*x)
spect = abs(np.fft.fft(np.append(signal,np.zeros(999*fs))))

plt.figure('Four Coef')
plt.plot(spect)
plt.axis([49995,49999,2048.01,2048.05])

plt.show()

请注意,由于零填充,系数 49997 对应于 49,997 Hz 的频率。

编辑:该数组正好代表 1 秒的 50 Hz 信号。最后 999 秒为零,以便将 fft“分辨率”提高到 1 mHz。我只有 1 秒的可用信号,我需要最高频率,精确到 mHz

更改采样率fs = 2**8 给出的最大值为 49.999,所以我认为这里的采样方式很关键...

【问题讨论】:

  • 使用 signal = np.sin(50*2*np.pi*x) 估计实际上返回 0.837 Hz 而不是 1 Hz

标签: python numpy signal-processing fft frequency-analysis


【解决方案1】:

您没有对 50 Hz 波进行 1000 秒的 FFT:您传递给 np.fft.fft 的数组是 1 秒的信号,然后是 999 秒的静音零)。所以你的削波信号 FFT 变成了一个时髦的多峰信号。

当我对连续信号执行以下操作时,我在索引 50000 处看到了预期的峰值:

import numpy as np
import matplotlib.pyplot as plt

fs = 2**12

x = np.linspace(0,1000,fs*1000)

signal = np.sin(50*2*np.pi*x)
spect = abs(np.fft.fft(signal))

plt.figure('Four Coef')
plt.plot(spect)
print np.argmax(spect), np.max(spect)

plt.show()

输出:

50000 2047497.79244

NB1/ 只是重复你的数组也不能正常工作,因为两端不会“匹配”(信号将从一个 1 s 数组的末尾跳到下一个数组的开头)。

NB2/ 您可以考虑使用rfftrfftfreq 来获取此处的频率。

【讨论】:

  • 999 秒的静默对于以 mHz 分辨率进行调查至关重要。不幸的是,我必须处理只有 1 秒的信号,而不是 1000 秒。时髦的峰值称为光谱泄漏。
  • 啊——那我误解了你在做什么。您可能会寻找其他答案。顺便说一句,linspace(0,1,fs+1) 将返回一个由fs+1 点组成的数组,这可能(也可能不是)你想要的。
  • @xnx 对于fs 的采样率,linspace(0, 1, fs+1) 是正确的。或者,可以使用linspace(0, 1, fs, endpoint=False)
  • 我注意到我应该解释得更好,谢谢!事实上,我想要fs+1,因为端点也包括在内。
【解决方案2】:

如果 FFT 的长度是信号频率周期的精确整数倍,则峰值幅度 FFT 结果箱的频率将指示信号的频率。对于任何其他频率,请尝试使用频率估计算法(例如 FFT 结果的抛物线或 Sinc 插值,但还有许多其他估计方法),而不仅仅是原始单峰值幅度 bin 频率。

【讨论】:

  • 使用二次插值技术我得到了相同的结果。为简单起见,我故意将其省略。
  • 将您的 fft 的长度打印为数字。
  • spect 的长度是 2048001。索引 0 表示 0 Hz,索引 2048000 是 2048 Hz,正好是 fs/2 作为矩阵向量乘法的更简单的 DFT 实现产生相同的结果,无论有没有二次插值。
  • 尝试 FFT 长度 N=2048000,其中索引 N/2 表示 Fs/2,索引 0 是 Fs(和 DC)。该长度将是 50 Hz 周期的整数倍。
  • 没有区别。此外,当使用 1 Hz 信号而不是 50 赫兹时,估计误差大约大 50 倍。也许这些信息有帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2019-12-28
  • 1970-01-01
  • 2019-07-02
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多