我已经尝试使用Google搜索和Wikipedia-ing,但是除了“这是因为输入信号的频率位于两个垃圾箱之间”之外,我没有得到任何答案。

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

为了演示我在说什么,这里有一些模拟数据(文章末尾的代码):频率为10的正弦波的对数比例绘制。采样率为1,采样数为100。该图已进行FFT移位。显然在bin 10处只有一个峰值,其余的都处于数值误差的阶次左右。



这是生成频率处的频谱的10.1。
显然,“泄漏”到的垃圾箱多于紧邻的垃圾箱。



这是频率为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.0更改为10.5,等等。

评论

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

#1 楼

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

下图显示了Sinc函数的频率响应的一部分。当音调位于两个音轨之一上时,所有其他点都与频率响应中的零点对齐。如果它不在某个频率仓的中心,则就像移动整个频率响应,这将导致其他频率档落在频率响应的非零部分上。



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

评论


$ \ begingroup $
请注意,所谓的频谱“泄漏”不会出现在以bin为中心的周期输入的FFT中,因为Sinc函数在所有其他bin中心频率(完全正交于)上正好为零(在符号变化之间)。那些滤波器内核和FFT基本向量)。
$ \ endgroup $
– hotpaw2
13年7月29日在18:13



$ \ begingroup $
希望您不要介意编辑。如果您不喜欢,可以随意扔。
$ \ endgroup $
–吉姆·克莱(Jim Clay)
13年7月29日在18:40

$ \ begingroup $
@Jim Clay:感谢您添加图表。我不知道如何从我的iPhone提交一个。
$ \ endgroup $
– hotpaw2
13年7月29日在18:56

$ \ begingroup $
谢谢,谢谢,谢谢。感谢您没有通过说“ FFT假定其输入序列是周期性的”来解释泄漏。可悲的是,“假定的周期性”这一愚蠢的概念在DSP文献中经常被重复。 [-Rick-]
$ \ endgroup $
–user5133
13年7月29日在22:10

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



#2 楼

hotpaw2的回答很好,但我想对user5133的注释进行一些详细说明:


感谢您没有通过说“ FFT假定其输入序列来解释泄漏”是周期性的。”可悲的是,“假定的周期性”这一愚蠢的概念在DSP的文献中经常被重复使用,同时也回答了这个问题。请注意,我注意到该领域的专家---可以随意评论,纠正或确认。

离散时间傅立叶变换(DTFT)定义为$ \ mathbb {Z} $(而不仅仅是$ \ {1,2,\ dots,N \} $!)由

$$ X(\ omega)= \ sum _ {n =-\ infty} ^ {\ infty } x [n] \,e ^ {-i \ omega n}。$$

实际上,测量信号是有限的;用$ N $表示长度。有限信号可以通过$ N $-周期扩展到$ \ mathbb {Z} $之上。离散傅立叶变换(DFT)由
$$ {\ displaystyle X_ {k} \ {\ stackrel {\ text {def}} {=}} \ \ sum _ {n = 0} ^ {N定义-1} x_ {n} \ cdot e ^ {-2 \ pi ikn / N},\ quad k \ in \ mathbb {Z} \,} $$
对应于离散频率$ X(2 \ pi k / N)$的DTFT,除非$ n $不在$ \ {1,2,\ dots,N \} $中。换句话说,它对应于$ x [n] w [n] $的DTFT,其中$ w $是一个矩形函数,当$ n \ in \ {1,\ dots,N \} $到处都是0时等于1 else。

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

$$ \ mathcal {F} \ {f \ cdot g \} = \ mathcal {F} \ {f \} * \ mathcal {F} \ {g \} $$

,以便原始信号的DFT是其“周期性”版本的DTFT的卷积使用矩形窗口的傅立叶变换...这是$ \ text {sinc} $,因为(在连续框架中,以0为中心以简化...):

$$ \ int_ {-\ infty} ^ \ infty w(f)e ^ {-j \ omega t} dt = \ int _ {-tau} ^ {\ tau} e ^ {-j \ omega t} dt = 2 \ tau \ text {sinc}(\ omega \ tau)$$

与$ \ text {sinc} $的卷积产生观察到的旁瓣(在某些特定情况下除外)。

评论


$ \ begingroup $
好像@ user5133不再徘徊了。但是Rick的感激之词是错位的:“谢谢您不要通过说'FFT假设其输入序列是周期性的'来解释泄漏。”可悲的是,“假定的周期性”这一愚蠢的概念在DSP文献中经常被重复。”他弄错了DFT最肯定会定期扩展传递给它的有限长度数据。 DFT确实假定传递给它的数据是周期序列的一个周期。
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
16 Sep 17'2:05