java里的fft2和fft:)

原创 2005年04月26日 09:38:00

fft是改网上c代码的,fft2是自己写的,谁能不能给一个求任意长度(即不需要将输入补成2的指数倍)的fft程序

   public class FftList{    //提供fft的输出
        double[] fr;
        double[] fi;
    }

    public class Fft2List{    //提供fft2的输出
        double[][] outr;
        double[][] outi;
    }

    //inr和ini为输入图像的实部和虚部,没有虚部只要令ini=null就可,w和h为输
//入图像的宽和高,ncols和nrows为输出图像的宽和高,注意ncols和nrows一定要是2的
//指数,ifft=true为逆fft2运算
    //此函数相当于matlab下的fft2(X,nrows,ncols)
    public Fft2List fft2(double[][] inr,double[][] ini,int w,int h,int n
cols,int nrows,boolean ifft)
    {

        int i,j,k;
        double[] pr=new double[ncols];      //暂存每行实部
        double[] pi=new double[ncols];      //暂存每行虚部
       k=(int)(Math.log(ncols)/Math.log(2.0));               //k=log2(ncols)

        Fft2List fft2list = new Fft2List();
        fft2list.outr = new double[ncols][nrows];
        fft2list.outi = new double[ncols][nrows];

        ////////////先对每行求fft/////////////
         for(i=0;i<h;i++)
        {
            for(j=0;j

    //inr和ini为输入图像的实部和虚部,没有虚部只要令ini=null就可,w和h为输
//入图像的宽和高,ncols和nrows为输出图像的宽和高,注意ncols和nrows一定要是2的
//指数,ifft=true为逆fft2运算
    //此函数相当于matlab下的fft2(X,nrows,ncols)
    public Fft2List fft2(double[][] inr,double[][] ini,int w,int h,int n
cols,int nrows,boolean ifft)
    {

        int i,j,k;
        double[] pr=new double[ncols];      //暂存每行实部
        double[] pi=new double[ncols];      //暂存每行虚部
       k=(int)(Math.log(ncols)/Math.log(2.0));               //k=log2(ncols)

        Fft2List fft2list = new Fft2List();
        fft2list.outr = new double[ncols][nrows];
        fft2list.outi = new double[ncols][nrows];

        ////////////先对每行求fft/////////////
         for(i=0;i<h;i++)
        {
            for(j=0;j<ncols;j++)               //清0
            {
                pr[j]=0;
                pi[j]=0;
            }
            for(j=0;j<w;j++)            //将每行实部和虚部赋给pr和pi
            {
                pr[j]=inr[j][i];
                if(ini != null)           //输入可能没有虚部
                    pi[j]=ini[j][i];
            }
            FftList fftlist = this.fft(pr,pi,ncols,k,ifft);

            for(j=0;j<ncols;j++)      //将每行结果保存到outr和outi中去
            {
                fft2list.outr[j][i]=fftlist.fr[j];
                fft2list.outi[j][i]=fftlist.fi[j];
            }
        }

        /////////////////////////////////////////

         pr=new double[nrows];
         pi=new double[nr
                pr[j]=0;
                pi[j]=0;
            }
            for(j=0;j<w;j++)            //将每行实部和虚部赋给pr和pi
            {
                pr[j]=inr[j][i];
                if(ini != null)           //输入可能没有虚部
                    pi[j]=ini[j][i];
            }
            FftList fftlist = this.fft(pr,pi,ncols,k,ifft);

            for(j=0;j<ncols;j++)      //将每行结果保存到outr和outi中去
            {
                fft2list.outr[j][i]=fftlist.fr[j];
                fft2list.outi[j][i]=fftlist.fi[j];
            }
        }

        /////////////////////////////////////////

         pr=new double[nrows];
         pi=new double[nrows];
         k=(int)(Math.log(nrows)/Math.log(2.0));               //k=log2(nrows)

        /////////////再对每列求fft/////////////////

        for(i=0;i<ncols;i++)
        {
            for(j=0;j<nrows;j++)          //清0
            {
                pr[j]=0;
                pi[j]=0;
            }
            for(j=0;j<h;j++)
            {
                pr[j]=fft2list.outr[i][j];        //将上一部分结果的每一
                                                  // 列赋给pr和pi
                pi[j]=fft2list.outi[i][j];
            }
            FftList fftlist = this.fft(pr,pi,nrows,k,ifft);
            for(j=0;j<nrows;j++)
            {
                fft2list.outr[i][j]=fftlist.fr[j];
                fft2list.outi[i][j]=fftlist.fi[j];
            }nt)(Math.log(nrows)/Math.log(2.0));               //k=log2(nrows)

        /////////////再对每列求fft/////////////////

        for(i=0;i<ncols;i++)
        {
            for(j=0;j<nrows;j++)          //清0
            {
                pr[j]=0;
                pi[j]=0;
            }
            for(j=0;j<h;j++)
            {
                pr[j]=fft2list.outr[i][j];        //将上一部分结果的每一
                                                  // 列赋给pr和pi
                pi[j]=fft2list.outi[i][j];
            }
            FftList fftlist = this.fft(pr,pi,nrows,k,ifft);
            for(j=0;j<nrows;j++)
            {
                fft2list.outr[i][j]=fftlist.fr[j];
                fft2list.outi[i][j]=fftlist.fi[j];
            }
        }
        return fft2list;
    }


     //n=2^k,其他的计算会出错
    public FftList fft(double[] pr,double[] pi,int n,int k,boolean ifft)
    {
        int it,m,is,i,j,nv,l0;
        double p,q,s,vr,vi,poddr,poddi;
        FftList cl = new FftList();
        cl.fr = new double[n];
        cl.fi = new double[n];

        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;}
            cl.fr[it]=pr[is]; cl.fi[it]=pi[is];
        }

        pr[0]=1.0; pi[0
        return fft2list;
    }


     //n=2^k,其他的计算会出错
    public FftList fft(double[] pr,double[] pi,int n,int k,boolean ifft)
    {
        int it,m,is,i,j,nv,l0;
        double p,q,s,vr,vi,poddr,poddi;
        FftList cl = new FftList();
        cl.fr = new double[n];
        cl.fi = new double[n];

        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;}
            cl.fr[it]=pr[is]; cl.fi[it]=pi[is];
        }

        pr[0]=1.0; pi[0]=0.0;
        p=2*Math.PI/(1.0*n);

        pr[1]=Math.cos(p); pi[1]=-Math.sin(p);

        if (ifft) pi[1]=-pi[1];    //求逆fft

        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=cl.fr[it]; vi=cl.fi[it];
            cl.fr[it]=vr+cl.fr[it+1]; cl.fi[it]=vi+cl.fi[it+1];
            cl.fr[it+1]=vr-cl.fr[it+1]; cl.fi[it+1]=vi-cl.fi[it+1];
        }

        m=n/2; nv=2;
        for (l0=k-2; l0>=0; l0--)
        {
            m=m/2; nv=2*nv;
        pr[1]=Math.cos(p); pi[1]=-Math.sin(p);

        if (ifft) pi[1]=-pi[1];    //求逆fft

        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=cl.fr[it]; vi=cl.fi[it];
            cl.fr[it]=vr+cl.fr[it+1]; cl.fi[it]=vi+cl.fi[it+1];
            cl.fr[it+1]=vr-cl.fr[it+1]; cl.fi[it+1]=vi-cl.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]*cl.fr[it+j+nv/2];
                    q=pi[m*j]*cl.fi[it+j+nv/2];
                    s=pr[m*j]+pi[m*j];
                    s=s*(cl.fr[it+j+nv/2]+cl.fi[it+j+nv/2]);
                    poddr=p-q; poddi=s-p-q;
                    cl.fr[it+j+nv/2]=cl.fr[it+j]-poddr;
                    cl.fi[it+j+nv/2]=cl.fi[it+j]-poddi;
                    cl.fr[it+j]=cl.fr[it+j]+poddr;
                    cl.fi[it+j]=cl.fi[it+j]+poddi;
                }
        }

        if (ifft)
            for (i=0;

        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]*cl.fr[it+j+nv/2];
                    q=pi[m*j]*cl.fi[it+j+nv/2];
                    s=pr[m*j]+pi[m*j];
                    s=s*(cl.fr[it+j+nv/2]+cl.fi[it+j+nv/2]);
                    poddr=p-q; poddi=s-p-q;
                    cl.fr[it+j+nv/2]=cl.fr[it+j]-poddr;
                    cl.fi[it+j+nv/2]=cl.fi[it+j]-poddi;
                    cl.fr[it+j]=cl.fr[it+j]+poddr;
                    cl.fi[it+j]=cl.fi[it+j]+poddi;
                }
        }

        if (ifft)
            for (i=0; i<=n-1; i++)
            {
                cl.fr[i]=cl.fr[i]/(1.0*n);
                cl.fi[i]=cl.fi[i]/(1.0*n);
            }

        return cl;
    }

c2java 第9篇 FFT

傅里叶分析是什么? 设多项式A(x) = a_0 + a_1*x^1 + a_2*x^2 + ... + a_{n-1}*x^{n-1}, 系数向量记为a = (a_0, a_1, ..., a_...

快速傅里叶变换的基2FFT算法的C++实现

[转自http://hi.baidu.com/kxw102/blog/item/8672eaeddf54532e279791a4.html] 快速傅里叶变换的基2FFT算法的C++实现 2011-0...

2D-FFT(二维快速傅里叶变换)

2D-FFT(二维快速傅里叶变换)   #include #include #include #define intsize sizeof(int) #define c...

基2时选快速傅里叶变换算法(FFT)

此程序是大学以前做双色点阵音乐频谱时参考数字信号处理写的。相对于网上的一些代码,我这里对一些特殊的旋转因子做了特别处理程度稍微快了些,当然相对了基2,使用分裂基、基4肯定会更快。...

快速傅里叶变换的基2FFT算法的C++实现

[转自http://hi.baidu.com/kxw102/blog/item/8672eaeddf54532e279791a4.html] 快速傅里叶变换的基2FFT算法的C++实现 2011-0...

FFT算法实现——基于GPU的基2快速傅里叶变换

最近做一个东西,要用到快速傅里叶变换,抱着蛋疼的心态,自己尝试写了一下,遇到一些问题。 首先看一下什么叫做快速傅里叶变换(FFT)(来自Wiki):  快速傅里叶变换(英语:Fast ...

2D-FFT(二维快速傅里叶变换) 源码

2D-FFT(二维快速傅里叶变换)   #include #include #include #define intsize sizeof(int) #define c...
  • lxdfigo
  • lxdfigo
  • 2012年12月10日 21:10
  • 7507

利用DSP实现图像的二维傅里叶变换FFT2d、IFFT以及全逆滤波、维纳滤波

在CCS5.5从硬盘读入.dat数据格式的单张图像http://blog.csdn.net/luokh327/article/details/49617041中说明了怎么使用CCS5.5导入单张图像到...

HDU 1402及51 nod1028 大数乘法 V2(FFT 快速傅里叶变换)

1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 给出2个大整数A,B,计算A*B的结果。 ...
  • MIKASA3
  • MIKASA3
  • 2016年08月11日 18:25
  • 706

2维 傅里叶变换 FFT_2D

  • 2009年06月30日 19:57
  • 7KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java里的fft2和fft:)
举报原因:
原因补充:

(最多只允许输入30个字)