我正在使用Ooura的FFT来分析一些白噪声(持续时间为75368 smp和44100个噪声样本)。我得到的结果是非常奇怪的:即使除以样本数,我的结果也不到1.0,这是怎么回事?
我用的是RDFT和逆RDFT
实际上,我有类似的震级结果,例如:
m1 3.47157
m1 8.50726
m1 29.0233
m1 9.64618
m1 43.2969
m1 60.7396
m1 48.3495
m1 35.8336
m1 32.7611
m1 24.1925
m1 26.8244
m1 17.9448
m1 29.7936
m1 23.1585
m1 15.1243
m1 8.89132
m1 14.6676
m1 18.1515
m1 27.5357
m1 5.6661
m1 19.0589其FFT大小为4096,峰值为79.119。
我希望只得到接近一个数字的结果(比如1.0或其他)
和,如果我应用一个简单的乘法(如一个体积)的幅度,声音被改变像一个奇怪的过滤器.
下面是我用来将re/im转换为量值/相位的函数:
double SuperFFT::_GetPhase(double real, double imaginary)
{
return atan2(imaginary, real);
}
double SuperFFT::_GetMagnitude(double real, double imaginary)
{
return sqrt((real * real) + (imaginary * imaginary));
} 这个阶段看起来不错(停留在-PI和PI之间)
如果我在240赫兹(持续时间为75368个样本)通过一个简单的正弦波,我就有这些震级。
m1 0.262643
m1 0.369384
m1 0.543982
m1 0.851133
m1 1.44518
m1 2.76168
m1 6.37861
m1 21.2081
m1 239.998
m1 775.211
m1 585.819
m1 63.0807
m1 12.06
m1 4.37815
m1 2.07803
m1 1.14897
m1 0.701917
m1 0.460003
m1 0.317885
m1 0.228747这是接近1,如果我除以时间,乘以100,这是正常的吗?
,为什么当我乘以量值时,声音就坏了?我的FFT是坏了还是遗漏了什么?
谢谢你的帮助
编辑:我当然使用OLA。
杰夫
发布于 2013-08-09 18:55:31
FFT实现通常忽略缩放,允许在FFT期间发生一些“自然”的值倍增。这是因为缩放通常是不重要的(例如,您计算出来的相位不随比例变化,而且信号的某些方面之间的关系不依赖于尺度),而且可能更有效地在操作的某一点上调整缩放,而不是在每个FFT、反向FFT和其他操作中。
您可以通过在第一个元素中将输入数组设置为1,在所有其他元素中设置为0,并执行FFT并检查结果,从而找到您正在使用的FFT所造成的缩放。在每个输出元素的真实部分中很可能有一个1。在这种情况下,输入的总“能量”乘以N,其中N是输入元素的数目。
(因为你似乎在做一个从实到复的转换,这里有一些微妙之处:n个实际输入产生N个复杂输出。然而,它们是对称的。对于其中的两个,元素是它自己的复共轭,这迫使它是真实的。对于剩下的N-2,其中一半是另一半的共轭物。因此,大多数FFT实现只返回两个实元素和N/2-1复杂元素。其余的结果是:两个缺失的虚分量为零,而缺失的N/2-1复元素是返回元素的共轭。在计算信号的总能量时,我指的是从所有N个结果中计算出来的能量,而不仅仅是那些显式返回的结果。
任何一个输出元件可能具有的最大可能大小是所有输入的总能量。当输入是一个完美的正弦波(与任何相位)时,就会发生这种情况:它的所有能量都在一个频率上,而没有一个在其他频率上。
因此,要计算任何输出元素可能具有的最大值,将输入的最大能量乘以FFT的缩放。然后,将输出规范化,使输出在量值上不超过1,乘以该乘积的倒数。
https://stackoverflow.com/questions/18152648
复制相似问题