Math 利用FFT结果的共轭实现IFFT

Math 利用FFT结果的共轭实现IFFT,math,signal-processing,fft,Math,Signal Processing,Fft,我用C语言在8位pic微控制器上进行定点FFT,我能够从我采集的样本中得到FFT结果,但是当我对FFT结果进行IFFT时,我得到了错误的输出 我正在做的程序流程如下 对8个样本进行FFT,例如:实值为(1,0,0,0,0,0),虚值为(0,0,0,0,0,0) FFT的输出为(1,1,1,1,1,1,1,1),虚值为(0,0,0,0,0,0,0) 然后取FFT输出的共轭 对共轭结果进行FFT处理 再次取第二次FFT结果的共轭 最后除以8得到时域原始样本 输出为实值为(1,0,0,0,0,0,0)

我用C语言在8位pic微控制器上进行定点FFT,我能够从我采集的样本中得到FFT结果,但是当我对FFT结果进行IFFT时,我得到了错误的输出

我正在做的程序流程如下

  • 对8个样本进行FFT,例如:实值为(1,0,0,0,0,0),虚值为(0,0,0,0,0,0)
  • FFT的输出为(1,1,1,1,1,1,1,1),虚值为(0,0,0,0,0,0,0)
  • 然后取FFT输出的共轭
  • 对共轭结果进行FFT处理
  • 再次取第二次FFT结果的共轭
  • 最后除以8得到时域原始样本 输出为实值为(1,0,0,0,0,0,0),虚值为(0,-0,-0,-0,-0,-0,-0,-0,-0) 但是如果我对实值(1,2,3,4,5,6,7,8)和虚值(0,0,0,0,0,0,0,0)应用相同的方法,我会得到错误的结果,比如IFFT后的实值是(1,2,4,7,4,5,4,5),虚值是(-0,-3,-1,-0,1,0,2)


    请帮助我我做错了什么

    在您的描述中,您在任何时候都不采用逆DFT

    想想发生了什么,假设DFT结果为X,取X*X将得到功率谱,而不是逆DFT。然后在此基础上进行DFT不会给你一个时域,它会让你胡说八道


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

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

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

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

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

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

    在关系中

    xk=p(wk)=p2,0(w2k)+wk*p2,1(wk)

    xN+k=p(wN+k)=p(-wk)

    =p2,0(w2k)-wk*p2,1(w2k)

    要将大型插值问题简化为两个大小为一半的子问题

    2*p2,0(w2k)=xk+xN+k

    2*p2,1(w2k)=w-k*(xk-xN+k)

    下一步,

    • p2,0减少为p4,0和p4,2,以及
    • p2,1减少为p4,1和p4,3
    等等


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

    • x1,0=2*p2,0(1)=x0+x4
    • x1,2=2*p2,0(i)=x1+x5
    • x1,4=2*p2,0(-1)=x2+x6
    • x1,6=2*p2,0(-i)=x3+x7

    • x1,1=2*p2,1(1)=(x0-x4)*1
    • x1,3=2*p2,1(i)=(x1-x5)*(1-i)/sqrt(2)
    • x1,5=2*p2,1(-1)=(x2-x6)*-i
    • x1,7=2*p2,1(-i)=(x3-x7)*(-1-i)/sqrt(2)
    在下一步中,我们得到w=i和w2=-1

    • x2,0=4*p4,0(1)=x1,0+x1,4
    • x2,4=4*p4,0(-1)=x1,2+x1,6

    • x2,2=4*p4,2(1)=(x1,0-x1,4)*1
    • x2,6=4*p4,2(-1)=(x1,2-x1,6)*(-i)
    --

    • x2,1=4*p4,1(1)=x1,1+x1,5
    • x2,5=4*p4,1(-1)=x1,3+x1,7

    • x2,3=4*p4,3(1)=(x1,1-x1,5)*1
    • x2,7=4*p4,3(-1)=(x1,3-x1,7)*(-i)
    最后是FFT系数Xk=x3,k使用w=-1和w²=1

    • X0=8*p8,0(1)=x2,0+x2,4
    • X4=8*p8,4(1)=(x2,0-x2,4)*(-1)
    --

    • X2=8*p8,2(1)=X2,2+X2,6
    • X6=8*p8,6(1)=(x2,2-x2,6)*(-1)
    --

    • X1=8*p8,1(1)=x2,1+x2,5
    • X5=8*p8,5(1)=(x2,1-x2,5)*(-1)
    --

    • X3=8*p8,3(1)=x2,3+x2,7
    • X7=8*p8,7(1)=(x2,3-x2,7)*(-1)


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

    您能给出每个步骤的示例值吗?您是否尝试过一个不是定点的、不限于微控制器但遵循相同计算步骤的原型?你能把它贴出来吗?是的,先生,我已经试过了,但是我也没有得到它。。。但是我在下面提到的IFFTA中提到了这个逻辑,这个逻辑(几乎)是正确的,因为IFFT(x)=conj(FFT(conj(x))/N、 还有第二个共轭,当输出为实时,这应该无关紧要。因此,实现必须存在问题,只能在代码上进行分析,或者至少有一点计算。感谢您的回复…我已经分析了代码FFT,它工作得很好,但IFFT使用上述逻辑它不是…这个逻辑是pr吗操作??是的,逻辑是正确的。请测试输入序列(1,0,0,…,0),(0,1,0,0,…,0),…,(0,0,0,…,0,1),并报告结果。输入和输出中复数的格式/排列/布局是否相同?您的评论通常是正确的,但在FFT的情况下是错误的。您有IFFT(x)=conj(FFT(conj(x))/N、 所以原则上,这个算法应该是可行的。你有什么来源吗?只要看看傅里叶变换的积分形式,它是不匹配的。同样,单位也不可行。时间单位等于倒数时间。我们这里处理的是DFT,没有积分,只有和。单位不变。DFT是积分的特例,傅里叶变换确实改变了单位。你从时间空间到频率空间,你改变了单位。例如,在X[k]=sum(m=0到N-1)exp(-2*piik*m/N)*X[m]中,单位会发生变化吗?