3

我是 FFT 概念的初学者,所以我的理解是,如果我输入 1024 个信号,我将得到 513 个从 0hz 到 22050Hz 的 bin(在 44100Hz 采样率的情况下)。在 Cinder 中使用 KISS FFT,getBinSize 函数返回 1024 个信号输入的预期 513 个值。我不明白为什么会出现重复的峰。运行一个经过 20Hz 到 22000Hz 频率(按顺序)的测试音频样本,我一直看到两个峰值。它看起来像:

__ _ __ |__ _ __ _ __ |_ _ __

随着音频的播放,峰似乎相互靠近,因此第二个峰确实似乎是第一个峰的镜像副本。我经历过的每个示例似乎都只是继续绘制所有 513 值,而且它们似乎没有这个镜像问题。我不确定我错过了什么。

4

2 回答 2

9

好的,在阅读完这篇文章后,我找到了解决方案。镜像的原因是因为我对实数使用 FFT(实数 FFT)。众所周知,普通的 FFT 适用于复数。因此,在实际 FFT 中,虚部“设置”为 0,从而导致中间出现镜像(或者从技术上讲,镜像在 0 和 N/2 附近)。

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

并阅读本书第 238 - 242 页(第 12 章)。太棒了,所以买它。我想作者的网站上有免费的pdf版本:http ://www.dspguide.com/

于 2012-05-24T19:55:40.813 回答
1

您可能正在绘制 1024 长度 FFT 的所有 1024 FFT 结果箱的大小,但上半部分只是下半部分的镜像(因为仅实数输入到复数 fft 不能提供足够的自由度来使上半部分独一无二)。

当围绕中心相互镜像时,峰将相互移动。

另一种可能性是您的 FFT 不知何故只有 512 的长度。

于 2012-01-17T02:38:29.043 回答