IFFT通过采用FFT结果的共轭来使用FFT

时间:2014-04-10 12:34:46

标签: math signal-processing fft

我正在使用C语言在8bit pic微分机上进行定点FFT,我能够从我采用的样本中得到FFT结果,但是当我对FFT结果进行IFFT时输出错误。

我正在做的程序流程如下

  1. 对8个样本进行FFT示例:实际值为(1,0,0,0,0,0,0,0),虚数值为(0,0,0,0,0,0,0, 0)
  2. FFT的输出为(1,1,1,1,1,1,1,1),虚数值为(0,0,0,0,0,0,0,0)
  3. 然后取FFT输出的共轭
  4. 对共轭结果进行FFT
  5. 再次采用第二次FFT结果的共轭
  6. 最后除以8得到时域中的原始样本 输出为Real值为(1,0,0,0,0,0,0,0),Imaginary值为(0,-0,-0,-0,-0,-0,-0,-0 );
  7. 但如果我对Real值(1,2,3,4,5,6,7,8)和虚数值(0,0,0,0,0,0,0,0)应用相同的i在IFFT之后得到错误的结果,例如实际值(1,2,4,7,4,5,4,5)和虚数值是(-0,-3,-1,-0,1,0,0) ,2)

    请帮助我,我做错了什么......

2 个答案:

答案 0 :(得分:1)

FFT解决了插值问题,IFFT解决了相应的多点评估问题

FFT的结果是多项式p(z)的系数,其中p(w k )= x k ,w是与维度相关联的单位根FFT的D。

用p s表示,k (z)由p(z)的系数子序列形成的多项式以k开始并以索引距离s间隔开。

如果D = 2N是偶数,从值到系数的一般想法是使用w N = - 1和分解

  

p(z)= p 2,0 (z²)+ z * p 2,1 (z²)

中的关系

  

x k = p(w k )= p 2,0 (w 2k )+ w k * p 2,1 (w k

     

x N + k = p(w N + k )= p(-w k

     

= p 2,0 (w 2k ) - w k * p 2,1 (w 2K

将大插值问题减少为两个大小的子问题,

  

2 * p 2,0 (w 2k )= x k + x N + k < / p>      

2 * p 2,1 (w 2k )= w -k *(x k - X <子> N + K

在下一步中,

  • p 2,0 减少为p 4,0 和p 4,2
  • p 2,1 被简化为p 4,1 和p 4,3

等。


对于8个输入的序列,第一步得到w =(1 + i)/ sqrt(2)和w 2 = i

  • x 1,0 = 2 * p 2,0 (1)= x 0 + x 4
  • x 1,2 = 2 * p 2,0 (i)= x 1 + x 5
  • x 1,4 = 2 * p 2,0 ( - 1)= x 2 + x 6
  • x 1,6 = 2 * p 2,0 ( - i)= x 3 + x 7

...

  • x 1,1 = 2 * p 2,1 (1)=(x 0 - x 4 )* 1
  • x 1,3 = 2 * p 2,1 (i)=(x 1 - x 5 )*(1-I)/ SQRT(2)
  • x 1,5 = 2 * p 2,1 ( - 1)=(x 2 - x 6 < /子>)*( - I)
  • x 1,7 = 2 * p 2,1 ( - i)=(x 3 - x 7 < /子>)*( - 1-i)的/ SQRT(2)

在下一步中,一个得到w = i而w 2 = - 1

  • x 2,0 = 4 * p 4,0 (1)= x 1,0 + x 1, 4
  • x 2,4 = 4 * p 4,0 ( - 1)= x 1,2 + x 1 ,6

...

  • x 2,2 = 4 * p 4,2 (1)=(x 1,0 - x 1 ,4 )* 1
  • x 2,6 = 4 * p 4,2 ( - 1)=(x 1,2 - x 1,6 )*( - i)

-

  • x 2,1 = 4 * p 4,1 (1)= x 1,1 + x 1, 5
  • x 2,5 = 4 * p 4,1 ( - 1)= x 1,3 + x 1 7

...

  • x 2,3 = 4 * p 4,3 (1)=(x 1,1 - x 1 ,5 )* 1
  • x 2,7 = 4 * p 4,3 ( - 1)=(x 1,3 - x 1,7 )*( - i)

最后FFT系数X k = x 3,k 使用w = -1且w²= 1

  • X 0 = 8 * p 8,0 (1)= x 2,0 + x 2,4 < /子>
  • X 4 = 8 * p 8,4 (1)=(x 2,0 - x 2,4 )*( - 1)

-

  • X 2 = 8 * p 8,2 (1)= x 2,2 + x 2,6 < /子>
  • X 6 = 8 * p 8,6 (1)=(x 2,2 - x 2,6 )*( - 1)

-

  • X 1 = 8 * p 8,1 (1)= x 2,1 + x 2,5 < /子>
  • X 5 = 8 * p 8,5 (1)=(x 2,1 - x 2,5 )*( - 1)

-

  • X 3 = 8 * p 8,3 (1)= x 2,3 + x 2,7 < /子>
  • X 7 = 8 * p 8,7 (1)=(x 2,3 - x 2,7 )*( - 1)

请检查这些步骤是否反映在您的代码中,尤其是2的平方根出现在必要的位置。随机整数输入的输出极不可能是严格整数。

答案 1 :(得分:0)

在你的描述中,你没有采取逆DFT。

考虑一下发生了什么,假设您将DFT结果作为X,采用X * X将为您提供功率谱,而不是逆DFT。然后在此上执行DFT将不会给你一个时间域,它会给你废话。

您需要在正在使用的库中找到逆DFT函数。