我可以根据Parseval's Theorem计算频域中的 RMS 。
但是,如果我在进行 FFT 之前应用了一个窗口函数(在我的例子中是一个 Hann 窗口)呢?现在 RMS 值不再正确。如何计算正确的 RMS 值?
我可以根据Parseval's Theorem计算频域中的 RMS 。
但是,如果我在进行 FFT 之前应用了一个窗口函数(在我的例子中是一个 Hann 窗口)呢?现在 RMS 值不再正确。如何计算正确的 RMS 值?
对于合理静止的时域信号,您可以假设
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
所以我认为这是不可能的。