为什么在FFT中会出现频谱泄漏?


18

我已经尝试使用谷歌搜索和维基百科了,但是除了“这是因为输入信号的频率位于两个区间之间”之外,我没有得到任何答案。

我知道这是原因,但是我不明白的是为什么泄漏似乎扩展到几个相邻的容器,而不是仅一个相邻的容器。

为了说明我在说什么,这里有一些模拟数据(文章末尾的代码): 频率10

上面是频率为10的正弦波的FFT频谱(按对数标绘)。采样率为1,采样数为100。该图已进行FFT移位。显然在bin 10处只有一个峰值,其余的则处于数值误差的数量级左右。

频率10_

这是产生的频率为10.1的频谱。显然,与直接相邻的垃圾箱相比,存在更多的垃圾箱“泄漏”。

freq_10_5

这是频率为10.5的图。

问题:为什么会出现这种泄漏,为什么会泄漏到所有其他垃圾箱,而不是直接相邻的垃圾箱?


代码,适合任何有兴趣的人(Python代码)

import numpy as np
import matplotlib.pyplot as plt

xFreq = 10.5
xSize = 100.0
xPeriod = xSize/xFreq
x = np.linspace(1,xSize,xSize)

data = np.sin(2*np.pi*x/xPeriod)
fft = np.fft.fft(data)
fft = np.fft.fftshift(fft)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(abs(fft), "o")
ax.set_yscale('log')
plt.show()

我将xFreq值从更改10.010.5,等等。


当您将信号包裹起来时,任何不完全适合FFT窗口长度的信号都会产生不连续性。不连续性(如脉冲或阶跃函数)包含所有频率中的一些。
endlith 2013年

Answers:


12

FFT具有有限的长度,因此构成了数据流上的默认矩形窗口。时域中的窗口会随着窗口的变换而在频域中产生卷积。请注意,矩形窗口的变换是Sinc函数(sin(x)/ x),具有无限的宽度。它的宽度不仅仅是2个垃圾箱。因此,Sinc函数的波动将显示为“泄漏”,远离任何在FFT长度上不是完美周期性的频谱峰值。

下图显示了Sinc函数的频率响应的一部分。当音调集中在两个音轨之一上时,所有其他点都与频率响应中的零点对齐。如果它不在一个音柱上居中,那就像是在改变整个频率响应,这会使其他音柱落在频率重起的非零部分上。

在此处输入图片说明

另一种看待它的方法是,FFT只是一个滤波器组,其中每个滤波器的阻带底限都有很多纹波,并且在距中心频率超过1 bin处的衰减中肯定不是无限的。除矩形外,有些窗户(冯·汉恩(von Hann)等)的阻带较低,这是其广泛使用的原因之一。


1
请注意,所谓的频谱“泄漏”不会出现在以bin为中心的周期性输入的FFT中,因为在所有其他bin中心频率(与那些滤波器内核完全正交,并且FFT基本向量)。
hotpaw2

希望您不要介意编辑。如果您不喜欢,可以随意扔它。
吉姆·克莱

@Jim Clay:感谢您添加的图表。我不知道如何从我的iPhone提交一个。
hotpaw2

1
谢谢你,谢谢你,谢谢你。感谢您没有通过说“ FFT假定其输入序列是周期性的” 来解释泄漏。可悲的是,“假定周期性”这一愚蠢的概念在DSP文献中经常被重复。[-Rick-]

例如,有时在进行FFT帧长度的轴旋转同步采样(或创建教室综合示例)时,输入周期性的假设很有用。但是对于音频(等)而言,与任何周期性长度无关的分段和开窗数据帧更为常见,这使得对于这些领域的工作通常是错误的。
hotpaw2

0

hotpaw2的答案很好,但我想对user5133的评论进行详细说明:

感谢您没有通过说“ FFT假定其输入序列是周期性的”来解释泄漏。可悲的是,“假定的周期性”这一愚蠢的概念在DSP文献中经常被重复出现。

同时也回答这个问题。请注意,我注意到该领域的专家---随时发表评论,更正或确认。

ž{1个2ñ}

Xω=ñ=-X[ñ]Ë-一世ωñ

ññž

Xķ =定义 ñ=0ñ-1个XñË-2π一世ķñ/ñķž
X2πķ/ññ{1个2ñ}X[ñ]w[ñ]wñ{1个ñ}

但是产品的傅立叶变换是傅立叶变换的卷积:

F{FG}=F{F}F{G}

辛克

-wFË-ĴωŤdŤ=-ττË-ĴωŤdŤ=2τ辛克ωτ

辛克


看起来@ user5133不再挂了。但是Rick的感激之词是错误的:“谢谢您不要通过说'FFT假设其输入序列是周期性的'来解释泄漏。” 可悲的是,“假定的周期性”这一愚蠢的概念在DSP文献中经常被重复。” 他弄错了 DFT最肯定会定期扩展传递给它的有限长度数据。DFT 确实假定传递给它的数据是周期序列的一个周期。
罗伯特·布里斯托
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.