【问题标题】:Why does fft-js not give a frequency bin for fs/2为什么 fft-js 没有给出 fs/2 的频率区间
【发布时间】:2020-05-30 01:08:02
【问题描述】:

我正在使用 fft-js 对由两个简单正弦波组成的波执行 fft。样本数为 512,运行时间为 16 秒。所以采样频率为 32Hz。当查看结果频率时,它会上升到 15.9375,而不是采样频率除以二(16 Hz)。为什么会这样?有没有办法将采样频率除以二?

【问题讨论】:

  • fs / 2 处的信息通常没有用,因为它是奈奎斯特频率,并且您的抗混叠滤波器会显着降低幅度。
  • 您的问题提出得当且合法。 FFT 会给你一个你期望的结果,但这可能取决于实现(总是先尝试更高级别的环境来检查数学,比如 Mathematica、matlab、numpy)。检查您是否有 -16 Hz 的频率仓。由于 FFT 回绕,这是要使用的值。
  • 次要问题。从技术上讲,sampling rate 是 32 Sa/sec。最好不要使用术语sampling frequency,因为我们采样的最高频率是 16 Hz。
  • 16-15.9375 = 0.0625。 1/0.0625= 16。所以你怀疑是对的,程序只给了你第 (n-1) 个频率。
  • 我们只能采样低于一半采样频率的频率。恰好处于采样频率一半的信号出现混叠。

标签: javascript fft frequency


【解决方案1】:

这个简短的 Python 示例表明您寻找最高频率是正确的,而且它位于一个不直观的位置。 FFT 的奈奎斯特频率实际上在频率向量的另一端:

import numpy as np
import matplotlib.pyplot as p
%matplotlib inline

T=1 # secs
d=0.1 # secs
n=int(T/d)

t=np.arange(0,T,d)  
print(f'time : {t}')

freq=np.fft.fftfreq(n,d)
print(f' frequencies (unshifted) : {freq}')

sfreq=np.fft.fftshift(freq)
print(f' frequencies (shifted) : {sfreq}')

输出:

time : [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
 frequencies (unshifted) : [ 0.  1.  2.  3.  4. -5. -4. -3. -2. -1.]
 frequencies (shifted) : [-5. -4. -3. -2. -1.  0.  1.  2.  3.  4.]

现在 Paul 也是对的,正确使用 FFT 应该使用抗混叠措施,以便理想情况下最高频率处的能量几乎为零。

【讨论】:

  • 适当的抗混叠将使奈奎斯特的频率为零,因为该频带被采样混叠了。
  • 是的,proper antialiasing 会将奈奎斯特频率处的幅度设为零,但我还没有看到有可能实现这一点的实验案例。噪声总是会在您的过滤器之后和数字化之前发生。问题不在于奈奎斯特频率的幅度,而是在哪里可以找到奈奎斯特频率的幅度。
猜你喜欢
  • 2017-06-06
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2021-05-11
相关资源
最近更新 更多