ios – 了解aurioTouch2中的FFT

前端之家收集整理的这篇文章主要介绍了ios – 了解aurioTouch2中的FFT前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从Apple的示例代码( found here)一直在看aurioTouch 2.在一天结束时,我想自己分析频率.现在我想了解这里发生的一些事情.我很抱歉,如果这是微不足道的,只是想了解一些没有注释的魔术数字在一些源头上浮动.我现在的主要困惑是:

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

解决方法

那么对我来说这不是微不足道的,但这是我如何理解的.如果我已经过度简化,纯粹是为了我的利益,我不是要光顾.

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

我想假设我们正在计算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)长的缓冲区.

因此,为了使返回的结果有效,您至少必须将虚拟[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

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

猜你在找的iOS相关文章