我正在尝试将以下matlab代码转换为c
cX = (fft(inData, fftSize) / fftSize);
Power_X = (cX*cX')/50;
问题:
彼得
答案 0 :(得分:2)
1. Why divide the results of fft (array of fftSize complex elements) by fftSize?
因为fft中的点数增加,所以fft的“能量”(平方和)增加。除以点数“N”对其进行归一化,使得fft的平方和等于原始信号的平方和。
2. I'm not sure at all how to convert the complex conjugate transform to c, I just don't understand what that line does.
这就是实际计算平方和的原因。很容易验证cX * cX'= sum(abs(cX)^ 2),其中cX'是共轭转置。
答案 1 :(得分:2)
理想情况下,离散傅里叶变换(DFT)纯粹是一种旋转,因为它在不同的坐标系中返回相同的矢量(即,它根据频率而不是音量来描述相同的信号在抽样时间)。然而,DFT通常以快速傅里叶变换(FFT)的方式实现,这些值以各种方式加在一起,需要乘以1 / N来保持比例不变。
通常,FFT中省略了这些乘法以节省计算时间,并且因为许多应用程序不关心比例变化。无论比例如何,得到的FFT数据仍然包含所需的数据和关系,因此省略乘法不会引起任何问题。另外,校正乘法有时可以与应用程序中的其他操作组合,因此单独执行它们没有意义。 (例如,如果应用程序执行FFT,进行一些操作,并执行逆FFT,那么组合的乘法可以在过程中执行一次,而不是在FFT中执行一次,在FFT中执行一次。)
< / LI>我不熟悉Matlab语法,但是,如果Stuart’s answer是正确的,cX*cX'
正在计算数组中值的大小的平方和,那么我做没有看到执行FFT的重点。你应该可以直接从iData
以相同的方式计算总能量。变换只是一个不改变能量的坐标变换,除了上面描述的缩放。