FFT 噩梦

3
我将使用Ooura的FFT来分析一些白噪声(持续时间为75368个样本,每个样本有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或其他),并且尽可能接近这个数字。

如果我对幅度进行简单的乘法运算(如音量),声音会像受到奇怪的滤波器的影响一样发生变化...

以下是我用于将实部/虚部转换为幅度/相位的函数:

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。

杰夫


RDFT = 实离散傅里叶变换。它是一种将简单的(double*声音)输入并作为结果得到实部和虚部交错的变换。 - IonOne
为不太熟悉的术语或缩写提供参考链接是个好主意(快速测试:谷歌一下,看看维基百科条目是否出现在前10项中)。 - leonbloy
结果是我得到了像m1 0.440782,m2 2.8018这样的随机数。m1代表幅度,m2代表相位。 - IonOne
1
往返结果?整个往返中宽度为1的信号结果?宽度为2的信号呢?为什么要从长信号开始测试? - Yakk - Adam Nevraumont
我不理解你的回答。你是指一个数值为 y = 2 的单个 DC 吗? - IonOne
显示剩余2条评论
1个回答

2

FFT实现通常忽略缩放,允许在FFT期间发生一些“自然”的值乘法。这是因为缩放通常不重要(例如,您计算的相位不随缩放变化而变化,并且信号的某些方面之间的关系不取决于比例),并且在每个单独的FFT、逆FFT和其他操作中调整缩放可能更有效率。

您可以通过将输入数组设置为第一个元素为1,所有其他元素为0,执行FFT并检查结果来找到FFT引起的缩放。最有可能的情况是每个输出元素的实部都有一个1。在这种情况下,输入的总“能量”乘以输入元素的数量N。

(由于似乎正在进行实对复转换,这里有一些微妙之处:N个实输入产生N个复杂输出。但它们是对称的。对于其中的两个元素,该元素是其自己的复共轭,这迫使其成为实数。对于其余的N-2个元素中的一半,它们是另一半的共轭。因此,大多数FFT实现仅返回两个实数和N/2-1个复数元素。其余的结果是暗示的:两个缺失的虚部分量为零,而缺失的N/2-1个复数元素是返回元素的共轭。计算信号的总能量时,我的意思是从所有N个结果计算出的能量,而不仅仅是显式返回的那些)。

任何一个输出元素可能具有的最大可能幅度是所有输入的总能量。当输入是完美正弦波(任何相位)时,所有能量都在一个频率上,没有在其他任何地方。

因此,要计算任何输出元素可能具有的最大值,请将您的输入可能具有的最大能量乘以FFT的缩放系数。然后,为了使输出归一化,使其不超过幅值为1,请乘以该产品的倒数。


是的,但为什么当我归一化幅度时声音会变得破碎?如果我不这样做,就能得到完美匹配,但通过重新采样声音会发生改变,为什么会这样呢? - IonOne
@IonOne:很可能你还有其他错误。你是以何种方式重采样音频的?你是播放FFT结果,还是执行逆FFT并播放该结果?除了缩放之外,在FFT和逆FFT之间你还做了什么? - Eric Postpischil
我是说重新缩放而不是重采样,抱歉...当然我会进行反向FFT,两者之间除了重新缩放什么也不做。我想我会尝试一个简单的一对一FFT / IFFT和幅度缩放,看看是否有其他部分的代码修改了声音,你是正确的。 - IonOne
我做了一个简单的FFT / IFFT和幅度缩放,它完美地工作,所以问题必须出在其他地方。搜索 - 搜索 - IonOne
谢谢你,你对重新缩放的回答很有帮助,指引我走向正确的方向。恭喜你!- Jeff - IonOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接