3

我正在使用 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 之间)

如果我通过一个简单的 240hz 正弦波(持续 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

如果我除以持续时间并乘以 100,这接近 1 是否正常?

为什么当我乘以幅度时声音会中断?我的 FFT 是坏了还是我错过了什么?

谢谢你的帮助

编辑:我当然使用 OLA

杰夫

4

1 回答 1

2

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,请乘以该乘积的倒数。

于 2013-08-09T18:55:31.633 回答