我在获取两组值之间相关性的正确结果时遇到问题(我知道结果是错误的,因为我已尝试计算Octave中的相关性)(我也计算得像post说。 我一直在使用我发现用C编写的图书馆:http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
它的文档相当稀少,我在计算FFT方面没有多少经验。
该计划的结果示例和Octave的结果如下:
这两个载体是: a = [1 2 1 1 0 0 0 0],b = [0 0 0 0 1 3 1 1]
八度音向量a和b的fft结果为:
虽然相同向量的fft结果(分为实数和虚数):
该函数的输出最初是:
5 -1 1.70711 3.12132 0 1 0.292893 1.12132
(划分为实数和虚数的数字是如何在文档中指定的)
现在我的问题开始于我乘以(我使用逐元素乘法)包含DFT结果的两个向量(我使用Real DFT),因为Octave的结果不同于我的计划结果
我的乘法代码是:
for (j = 0; j < n; j++) {
a[j] = a[j] * b[j];
}
结果是:
这就是我现在陷入困境的地步。
答案 0 :(得分:2)
主要问题在于......鼓号......乘法(因为你已经猜到了你的&#34;我的问题在我乘以&#34;语句时开始)!
时域中的卷积(具有足够的零填充)在频域中等效于光谱的复数倍增。在Octave中,*
运算符的作用。对于C或C ++中的float
或double
数组,*
运算符仅将实部或虚部相乘。
要将频谱的复数乘以指定的数据包装顺序,您可以使用:
a[0] = a[0] * b[0]; // a[0] corresponds to real-valued bin 0
a[1] = a[1] * b[1]; // a[1] corresponds to real-valued bin n/2
for (j = 1; j < n/2; j++) {
tmp = (a[2*j]*b[2*j] - a[2*j+1]*b[2*j+1]); // real-part
a[2*j+1] = (a[2*j]*b[2*j+1] + a[2*j+1]*b[2*j]); // imaginary-part
a[2*j] = tmp;
}
备注: