我一直在查看Apple的示例代码(found here)中的aurioTouch 2。在一天结束时,我想自己分析频率。现在我想了解一些正在发生的事情。我很抱歉,如果这是微不足道的,只是试图了解一些未经注释的魔术数字在某些来源中浮动。我现在面临的主要困惑是:
答案 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 ......我不确定。我可能完全错了,或者可能是......艺术执照?