计算两个信号之间的FFT相关性

时间:2016-02-25 11:33:26

标签: c++ c fft

我在获取两组值之间相关性的正确结果时遇到问题(我知道结果是错误的,因为我已尝试计算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-octave

虽然相同向量的fft结果(分为实数和虚数):

result from C lib function

该函数的输出最初是:

5 -1 1.70711 3.12132 0 1 0.292893 1.12132

(划分为实数和虚数的数字是如何在文档中指定的)

enter image description here

现在我的问题开始于我乘以(我使用逐元素乘法)包含DFT结果的两个向量(我使用Real DFT),因为Octave的结果不同于我的计划结果

Octave result

我的乘法代码是:

for (j = 0; j < n; j++) {
    a[j] = a[j] * b[j];
}

结果是:

multiplication of output of rdft function from lib

formatted result

这就是我现在陷入困境的地步。

1 个答案:

答案 0 :(得分:2)

主要问题在于......鼓号......乘法(因为你已经猜到了你的&#34;我的问题在我乘以&#34;语句时开始)!

时域中的卷积(具有足够的零填充)在频域中等效于光谱的复数倍增。在Octave中,*运算符的作用。对于C或C ++中的floatdouble数组,*运算符仅将实部或虚部相乘。

要将频谱的复数乘以指定的数据包装顺序,您可以使用:

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;
}

备注

  • C FFT implementation采用实值输入,仅返回频谱的非冗余下半部分(上半部分可以通过对称获得)。逆变换将相应地采用频谱的非冗余下半部分并计算相应的实值序列(因此在这种情况下,只处理一半频谱不是问题)。
  • 另外,您可能已经注意到,您使用的C FFT implementation基于DFT的不同定义(使用带有正参数的指数)而不是Octave。只要您也使用一致的逆变换(即指数具有负参数的变换),这不是问题。为了进行比较,您使用C FFT implementation的结果对应于Octave结果的复共轭。