加窗后频域均方根计算

信息处理 傅里叶变换 离散信号 fft 窗函数
2021-12-21 10:40:27

我可以根据Parseval's Theorem计算频域中的 RMS 。

但是,如果我在进行 FFT 之前应用了一个窗口函数(在我的例子中是一个 Hann 窗口)呢?现在 RMS 值不再正确。如何计算正确的 RMS 值?

3个回答

对于合理静止的时域信号,您可以假设

rms(signal*windows) = rms(signal)*rms(window)

并且可以通过这种方式估计未加窗时间信号的 RMS。对于汉宁窗,这意味着使用 Perceval 计算 RMS,然后乘以 sqrt(8/3)。这并不准确,但如果信号相对于窗口长度是静止的,则将相当接近。如果它不是固定的,则 RMS 的解释不是特别明确,这将有助于更多地了解您的应用程序以及您正在尝试做什么。

信息有损的窗口函数(隐式矩形函数除外),尤其是窗口边缘附近的瞬态信号,以及窗口中非周期性的低频静止正弦曲线。对于在孔径中具有恒定幅度和周期性的高频正弦内容,窗口函数面积对缩放幅度的近似更接近准确,但仍会随着每个正弦的相位而略有变化。

半生不熟的回答:嗯……这可能吗?如果波形由随时间交替的高频正弦波和低频正弦波组成,那么您碰巧开窗的时间会改变频谱不同部分的高度。无论何时打开频谱,频谱的整体 RMS 值是否仍然相同?如果是这样,我认为这只是通过窗口本身的能量进行缩放的问题。如果没有,我会说这是不可能的。

例子:

n = 1000
t = linspace(0, 1, n, endpoint=False)
x = sin(2*pi*t)        * sin(2*pi*100*t)
y = sin(2*pi*t + pi/2) * sin(2*pi*100*t) # just a phase shift
print(sum(abs(x)**2))          # = 250
print(sum(abs(y)**2))          # = 250
print(sum(abs(fft(x))**2)/n)   # = 250
print(sum(abs(fft(y))**2)/n)   # = 250

w = hamming(n)
print(sum(abs(fft(x*w))**2)/sum(w**2))  # = 216
print(sum(abs(fft(y*w))**2)/sum(w**2))  # = 283

x*wy*w

所以我认为这是不可能的。