gpt4 book ai didi

c++ - FFT 噩梦)

转载 作者:太空狗 更新时间:2023-10-29 21:45:13 25 4
gpt4 key购买 nike

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

杰夫

最佳答案

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

关于c++ - FFT 噩梦),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com