求助 fft.lib 做的IFFT变换的程序

求助 fft.lib 做的IFFT变换的程序,第1张

void FFT_OpposiConver(){ int16 tempfft.ipcbptr = ipcb// FFT computation buffer fft.magptr = mag// Store mag. square in separate buff fft.winptr = (long *)win// Window coefficient array fft.init(&fft)// Twiddle factor pointer initialization for(temp=0temp<FFT_Ntemp++) { ipcb[temp*2+1]=-ipcb[temp*2+1]//求共轭复根 } /***************再求FFT变换*************************/ CFFT32_brev2(ipcb,ipcb,FFT_N)fft.izero(&fft)fft.calc(&fft)/****************************************************/ for(temp=0temp<FFT_Ntemp++) { /*再求共轭复根再 其实已经没有虚部了 /N*/ ipcb[temp*2]=((ipcb[temp*2]))ipcb[temp*2+1]=(-ipcb[temp*2+1])} }

DFT,即可测试性设计(Design for Testability, DFT)是一种集成电路设计技术,它将一些特殊结构在设计阶段植入电路,以便设计完成后进行测试。电路测试有时并不容易,这是因为电路的许多内部节点信号在外部难以控制和观测。通过添加可测试性设计结构,例如扫描链等,内部信号可以暴露给电路外部。总之,在设计阶段添加这些结构虽然增加了电路的复杂程度,看似增加了成本,但是往往能够在测试阶段节约更多的时间和金钱。

IDFT就是Inverse Discrete Fourier Transform 离散傅里叶逆变换。FFT就是Fast Fourier Transform 快速傅里叶变换。

两者的应用都是将时域中难以处理的信号转换成易于处理的频域信号,分析完成后进行傅里叶反变换即得到原始的时域信号。

两者的异同是:我们知道在数学上用级数来无限逼进某个函数,以便简化计算过程而又不致使误差过大,这样工程上才能应用,否则一些数学模型是无法实现快速求解的。

IDFT:对于有限长的序列我们可以使用离散傅立叶变换,IDFT是对序列傅立叶变换的等距采样。

FFT:并不是与IDFT不相同的另一种变换(即原理是一样的),而是为了减少IDFT运算次数的一种快速算法。它是对IDFT变换式进行一次次的分解,使其成为若干小点数IDFT的组合,从而减小运算量。常用的FFT是以2为基数,它的运算效率高,程序比较简单,使用也十分地方便。

IFFT——Inverse Fast Fourier Transform 快速傅里叶逆变换。

快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

#include <math.h>

#include <stdio.h>

#define N 8

void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)

void main()

{

    double xr[N],xi[N],Yr[N],Yi[N],l=0,il=0

    int i,j,n=N,k=3

    for(i=0i<Ni++)

    {

        xr[i]=i

        xi[i]=0

    }

    printf("------FFT------\n")

    l=0

    kkfft(xr,xi,n,k,Yr,Yi,l,il)

    for(i=0i<Ni++)

    {

        printf("%-11lf + j* %-11lf\n",Yr[i],Yi[i])

    }

    printf("-----DFFT-------\n")

    l=1

    kkfft(Yr,Yi,n,k,xr,xi,l,il)

    for(i=0i<Ni++)

    {

        printf("%-11lf + j* %-11lf\n",xr[i],xi[i])

    }

    getch()

}

void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)

{

    int it,m,is,i,j,nv,l0

    double p,q,s,vr,vi,poddr,poddi

    for (it=0 it<=n-1 it++)

    {

      m = it

       is = 0

       for(i=0 i<=k-1 i++)

       {

        j = m/2

        is = 2*is+(m-2*j)

        m = j

       }

       fr[[it][/it]it] = pr[is]

       fi[[it][/it]it] = pi[is]

    }

    pr[0] = 1.0 

    pi[0] = 0.0

    p = 6.283185306/(1.0*n)

    pr[1] = cos(p) 

    pi[1] = -sin(p)

    if (l!=0) 

  pi[1]=-pi[1]

    for (i=2 i<=n-1 i++)

    { 

       p = pr[i-1]*pr[1] 

       q = pi[i-1]*pi[1]

       s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1])

       pr[i] = p-q 

      pi[i] = s-p-q

    }

    for (it=0 it<=n-2 it=it+2)

    { 

      vr = fr[[it][/it]it] 

       vi = fi[[it][/it]it]

       fr[[it][/it]it] = vr+fr[it+1] 

       fi[[it][/it]it] = vi+fi[it+1]

       fr[it+1] = vr-fr[it+1] 

       fi[it+1] = vi-fi[it+1]

    }

    m = n/2 

    nv = 2

    for (l0=k-2 l0>=0 l0--)

    { 

      m = m/2 

       nv = 2*nv

       for(it=0 it<=(m-1)*nv it=it+nv)

        for (j=0 j<=(nv/2)-1 j++)

        { 

             p = pr[m*j]*fr[it+j+nv/2]

             q = pi[m*j]*fi[it+j+nv/2]

             s = pr[m*j]+pi[m*j]

             s = s*(fr[it+j+nv/2]+fi[it+j+nv/2])

             poddr = p-q 

             poddi = s-p-q

             fr[it+j+nv/2] = fr[it+j]-poddr

             fi[it+j+nv/2] = fi[it+j]-poddi

             fr[it+j] = fr[it+j]+poddr

             fi[it+j] = fi[it+j]+poddi

        }

    }

    /*逆傅立叶变换*/

    if(l!=0)

    {

      for(i=0 i<=n-1 i++)

       { 

        fr[i] = fr[i]/(1.0*n)

        fi[i] = fi[i]/(1.0*n)

       }

    } 

    

    /*是否计算模和相角*/

    if(il!=0)

    {

       for(i=0 i<=n-1 i++)

       { 

        pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i])

        if(fabs(fr[i])<0.000001*fabs(fi[i]))

        { 

             if ((fi[i]*fr[i])>0) 

              pi[i] = 90.0

             else 

              pi[i] = -90.0

        }

        else

         pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306

       }

    }

    return

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11339804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存