了解aurioTouch2中的FFT

Fra*_*y I 12 audio fft ios

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

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

hoo*_*oop 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)总是必然为零.因此,通过将实数[512](奈奎斯特频率仓的实部)放置在虚[0]并遗忘虚[512] - 总是为零并且可以推断出,将结果打包到1024(n)长度的缓冲区中.

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

unpackedVal = imaginary[0]
real[512]=unpackedVal, imaginary[512]=0
imaginary[0] = 0
Run Code Online (Sandbox Code Playgroud)

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

UsingFourierTransforms文档解释了打包

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 ......我不确定.我可能完全错了,或者可能是......艺术执照?