了解aurioTouch2中的FFT

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

  1. 为什么它们将FFTBufferManager :: ComputeFFT中的nyquist值清零? 这个价值真的可以被抛弃吗? (FFTBufferManager.cpp的第112行)。
  2. 他们把所有的东西都缩小了-128db,所以我假设结果是在(-128,0)的范围内。 然而,稍后在aurioTouchAppDelegate.mm(〜行807)中,它们将这个值转换为0到1之间的值,加上80,然后除以64,然后钳位到0和1.为什么模糊? 另外,我正确的价值将在(-128,0)附近?

那么,这对我来说也不是微不足道,但这是我的理解。 如果我简化了它,纯粹是为了我的利益,我并不意味着要光顾。

对奈奎斯特频率对应的结果进行归零:

我假设我们正在计算1024个input采样的正向FFT。 在44100赫兹input这通常是真实的在我的情况(但不是什么AurioTouch正在做,我觉得有点奇怪,但我不是专家)。 用特定的价值理解我会更容易。

给定1024(n)个input样本,根据需要进行排列(即使是索引的第一个奇数索引{in [0],in [2],[4],…,in 1 ,in [3],[5] ,…})(使用vDSP_ctoz()来订购你的input)

FFT 1024 (n)input采样的输出是513 ((n / 2)+1)个复数值。 即513个实数分量和513个虚数分量,总共1026个数值。

然而, 虚数[0]虚数[512] (n / 2)总是必然为零 。 因此,通过将实数[512] (奈奎斯特频率仓的实数分量)置于虚数[0]并忘记虚数[512] (其始终为零并且可被推断),结果被打包到1024 (n)长的缓冲器。

因此,要使返回的结果有效,您至less必须将虚构的[0]设置回零。 如果您需要全部513 ((n / 2)+1)频率分档,则需要将另一个复数值附加到结果中,然后进行设置。

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

在AurioTouch中,我总是认为他们不用担心。 n / 2的结果显然更方便处理,你很难从可视化器中看出来:“ 哦,看,它在奈奎斯特频率处丢失了一个量级

UsingFourierTransforms文档解释包装

注意,具体值1024,513,512等是不是来自AurioTouch的n,(n / 2)+1,n / 2的实际值的示例。

他们缩小了一切-128db

不完全是,输出值的范围是相对于input样本的数量,所以它必须被归一化。 比例是1.0 /(2 * inNumberFrames)。

缩放后,范围是-1.0 – > +1.0 。 然后取得复数vector的大小(相位被忽略),给出0到1.0之间的每个频率点的标量值

这个值然后被解释为-128和0之间的分贝值

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