理解aurioTouch2中的FFT

12

我一直在研究苹果的示例代码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个回答

13

嗯,这对我来说也不是那么简单,但这就是我理解的方式。如果我过于简化了它,那只是为了我的好处,我并不是要居高临下。

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

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

给定1024(n)个输入样本,按需要排列(先是偶数索引,然后是奇数索引{in[0],in[2],in[4],…,in1,in[3],in[5],…})(使用vDSP_ctoz()来排序您的输入)

FFT 1024(n)个输入样本的输出是513((n/2)+1)个复数值,即513个实部和513个虚部,总共有1026个值。但是,imaginary [0]和imaginary [512](n / 2)始终为零。因此,通过将Nyquist频率bin的实部real [512]放置在imaginary [0]处并忽略imaginary [512] - 它始终为零且可以推断出,结果被打包成1024(n)长度的缓冲区。因此,要使返回的结果有效,您至少必须将imaginary [0]设置回零。如果您需要所有513((n/2)+1)个频率bin,则需要将另一个复数值附加到结果中,并将其设置如下...
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缩小所有东西的比例。 并不完全如此,输出值的范围是相对于输入样本数量的,因此必须进行归一化。比例尺为1.0 /(2 * inNumberFrames)。
缩放后的范围为-1.0 –> +1.0。然后取复向量的幅值(忽略相位),为每个频率bin给出一个标量值,介于0和1.0之间。
这个值被解释为介于-128到0之间的分贝值
绘图部分... +80 / 64. ... *120... 我不确定。我可能完全错误,或者这可能是艺术许可?

非常感谢您抽出时间向我解释这个问题。 - Francisco Ryan Tolmasky I

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接