了解aurioTouch2中的FFT

时间:2012-01-13 03:29:05

标签: ios audio fft

我一直在查看Apple的示例代码(found here)中的aurioTouch 2。在一天结束时,我想自己分析频率。现在我想了解一些正在发生的事情。我很抱歉,如果这是微不足道的,只是试图了解一些未经注释的魔术数字在某些来源中浮动。我现在面临的主要困惑是:

  1. 为什么他们将FFTBufferManager :: ComputeFFT中的nyquist值清零?这个价值真的可以扔掉吗? (~FFTBufferManager.cpp的第112行)。
  2. 他们将所有内容缩小-128db,所以我假设结果因此在(-128,0)的范围内。但是,稍后在aurioTouchAppDelegate.mm(〜第807行)中,他们通过添加80并除以64将其转换为0到1之间的值,然后将其钳制为0和1.为什么模糊?另外,我是否正确假设价值将在(-128,0)附近?

1 个答案:

答案 0 :(得分:13)

嗯,这对我来说也不算微不足道,但这就是我理解它的方式。如果我已经过度简化,那纯粹是为了我的利益,我不是故意要光顾。

将对应于奈奎斯特频率的结果归零:

我假设我们正在计算1024个输入样本的正向FFT。在44100hz输入这通常是我的情况(但不是AurioTouch正在做的,我觉得有点奇怪,但我不是专家)。我更容易理解具体的价值观。

给定1024(n)个输入样本,根据需要排列(偶数索引'首先是奇数索引'{在[0],[2],[4],...,在1,在[ 3],在[5]中,...})(使用vDSP_ctoz()命令输入)

FFT 1024 (n)输入样本的输出是 513 ((n / 2)+1)个复数值。即 513个真实组件和 513个虚构组件,总共 1026 值。

然而,虚[0] 虚[512] (n / 2)总是必然。因此,将 real [512] (奈奎斯特频率仓的实部)置于虚[0] 并忘记虚[512] - 它总是为零并且可以推断,结果被打包到 1024 (n)长度的缓冲区中。

因此,要使返回的结果有效,您必须至少将 imaginary [0] 设置为零。如果您需要所有 513 ((n / 2)+1)个频率分档,则需要在结果中附加另一个复杂值并进行设置..

unpackedVal = imaginary[0]
real[512]=unpackedVal, imaginary[512]=0
imaginary[0] = 0

在AurioTouch中我总是认为他们只是不打扰。 n / 2结果显然更方便使用,你几乎无法从可视化器中看出: - “哦,看,它在奈奎斯特频率上缺少一个幅度

The UsingFourierTransforms docs explain the packing

NB特定值1024,513,512等是示例,而不是来自AurioTouch的n,(n / 2)+ 1,n / 2的实际值。

他们按-128db缩小所有内容

不完全是,输出值的范围是相对于输入样本的数量,因此必须进行标准化。比例为1.0 /(2 * inNumberFrames)。

缩放后,范围 -1.0 - > 1.0 即可。然后获取复矢量的大小(忽略相位),给出 0和1.0 之间每个频率仓的标量值

然后将此值解释为 -128和0 之间的分贝值

绘画的东西...... +80 / 64. ... * 120 ......我不确定。我可能完全错了,或者可能是......艺术执照?