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