了解aurioTouch2中的FFT
我一直在从Apple的示例代码( 在这里find )看aurioTouch 2。 在一天结束的时候,我想自己分析一下频率。 现在我正试图理解这里发生的一些事情。 我很抱歉,如果这是微不足道的,只是试图了解一些未注释的魔术数字在一些来源浮动。 我现在主要的困惑是:
- 为什么它们将FFTBufferManager :: ComputeFFT中的nyquist值清零? 这个价值真的可以被抛弃吗? (FFTBufferManager.cpp的第112行)。
- 他们把所有的东西都缩小了-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 … …我不确定。 我可能完全错了,或者可能是……艺术执照?