为什么我的KISS FFT图显示在y轴上镜像重复的峰值?

3
我对FFT概念还很陌生,但我了解如果输入1024个信号,将会得到513个频率范围从0Hz到22050Hz(在44100Hz采样率的情况下)。在Cinder中使用KISS FFT时,getBinSize函数为输入的1024个信号返回了预期的513个值。我不理解的是为什么会出现重复的峰值。运行一个音频测试样本,频率按顺序从20Hz到22000Hz变化,我看到整个过程中有两个峰值。它看起来像这样: __ _ _|__ ___|__ 随着音频播放,峰值似乎向彼此移动,因此第二个峰值确实似乎是第一个峰值的镜像副本。我通过的每个例子似乎都会直接绘制所有513个值,并且它们似乎没有这种映射问题。我不确定我错过了什么。

尝试使用交替的正负信号,并在每个信号之间插入零(即1、0、-1、0、1、0、-1、0...)。对于长度为1024的实数FFT,这应该会在out[255](第256个频率bin)处给您一个单峰值。 - Mark Borgerding
谢谢马克。我做了这个,确实让我在第256个频率箱中得到了一个峰值,但我不确定这意味着什么。你能帮我理解为什么使用1024信号输入块的音轨似乎镜像,而这个构建的信号却没有出现这种情况吗? - geranyl
2个回答

9
好的,经过阅读后我找到了解决方案。镜像的原因是因为我在实数上使用FFT(快速傅里叶变换)。正常的FFT如大家所知道的,是在复数上运算的。因此,在实数FFT中,虚部被“设置”为0,导致围绕中心线(或从技术上讲,镜像围绕0和N/2)。

这里有一个详细的讨论:http://www.edaboard.com/thread144315.html (该页面已不再可用,但在archive.org上有备份)

并且请阅读本书的第238-242页(第12章)。它很棒,所以请购买。我认为作者的网站上有免费的PDF版本:http://www.dspguide.com/


1

你可能正在绘制1024长度FFT的所有1024个FFT结果bin的幅度,但是上半部分只是下半部分的镜像(因为实际输入到复杂fft的实数仅提供足够的自由度使得上半部分唯一)。

当它们关于中心对称时,峰值会向彼此移动。

另一个可能性是你的FFT某种方式只有512的长度。


我已经检查了输入长度和输出。我输入1024,却得到了513。绘制这513个值显示出一个镜像图像,这就是我不理解发生了什么的原因。 - geranyl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接