【问题标题】:Scaling Amplitude After Windowing FFT to Recover Correct Amplitude开窗 FFT 后缩放幅度以恢复正确幅度
【发布时间】:2014-12-02 22:49:20
【问题描述】:

我正在尝试将 Hann 窗应用于正弦信号,其想法是应用 FFT 来恢复频率和幅度。这是我创建的一个典型案例,以在我开始处理我的数据(我想要准确确定频率内容和幅度的实时信号)之前增加我的理解。在下面的代码中,我需要乘以 2.0 的附加因子来恢复幅度。我理解乘以 2/N,但现在我乘以 4/N。有没有人遇到过这个,或者任何人都可以解释为什么会这样?这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

# first create the time signal, which has two frequencies 13.2 hz and 43.9 hz
f_s = 100.0 # Hz  sampling frequency
f = 1.0 # Hz
time = np.arange(0.0, 10.0, 1/f_s)
x = 5 * np.sin(13.2 * 2 * np.pi * f * time) + 3 * np.sin(43.9 * 2 * np.pi * f * time)
x = x + np.random.randn(len(time)) #inject some noise

# apply hann window and take the FFT
win = np.hanning(len(x))
FFT = np.fft.fft(win * x) * 2.0  # IT SEEMS I NEED AN ADDITIONAL FACTOR OF 2 TO RECOVER THE AMPLITUDES
n = len(FFT)
freq_hanned = np.fft.fftfreq(n, 1/f_s)  
half_n = np.ceil(n/2.0)
fft_hanned_half = (2.0 / n) * FFT[:half_n]
freq_hanned_half = freq_hanned[:half_n]

# and plot
plt.plot(freq_hanned_half, np.abs(fft_hanned_half))
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")

【问题讨论】:

  • 这不会有太大帮助,但我只想说 FFT 规范化可能会让人感到困惑,尤其是因为不是每个人都以相同的方式进行。有些人喜欢正向变换中的“2”,但不喜欢反向变换。有些人喜欢反向但不喜欢正向。一些“拆分” 2,将 $\sqrt{2}$ 放在正向和反向。我只是建议非常仔细地阅读 np.fft 文档,特别注意它关于规范化的内容。
  • 感谢您的评论。我同意它会有点毛茸茸。我的问题与 Hann Window 有更多关系。如果我不使用 Hann Window 而只使用 np.fft.fft(x),那么我只需要乘以 2/n(这对我来说很有意义)。只有在窗口中我实际上需要乘以 4/n,但我不确定为什么。

标签: python numpy signal-processing fft


【解决方案1】:

von Hann 窗口的平均值是(大约)0.5,对于 N=1000 你有

>>> N=1000 ; print sum(np.hanning(N))/N
0.4995
>>> 

这是否解释了乘以 2 来恢复离散幅度的必要性?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2020-08-25
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多