分享

C#的FFT函数

 ylw527 2010-09-20
同学编的C#的FFT函数拿出来共享
发信站: BBS 水木清华站 (Mon Jun 16 23:41:25 2003), 转信

struct complex//定义复数
{
        
        //复数a+bi中
        //a为实部,b为虚部
        public  double a;
        public  double b;
        public static complex commul(double x,complex y)
        {
                complex c = new complex();
                c.a = x*y.a;
                c.b = x*y.b;
                
                return c;
        }
        public static complex commulcc(complex x,complex y)
        {
                complex c = new complex();
                c.a = x.a*y.a - x.b*y.b;
                c.b = x.a*y.b + x.b*y.a;
                
                return c;
        }
        public static complex comsum(complex x,complex y)
        {
                complex c = new complex();
                c.a = x.a + y.a;
                c.b = x.b + y.b;
                
                return c;
        }
        public static complex comsum1(double x,complex y)
        {
                complex c = new complex();
                c.a = x + y.a;
                c.b = y.b;
                
                return c;
        }
        public static complex decrease(complex x,complex y)
        {
                complex c = new complex();
                c.a = x.a*y.a - x.b*y.b;
                c.b = x.a*y.b + x.b*y.a;
                
                return c;
        }
        public static complex powcc(complex x,double n)
        {
                int k;
                complex xout;
                xout.a = 1;
                xout.b = 0;
                for(k=1; k<=n; k++)
                {
                        xout = complex.commulcc(xout,x);
                }
                return xout;
        }
        public void show()
        {
                Console.Write(a+" + "+b+"i      ");
        }
}
class airthm
{
//计算ω=exp(j*2*pi/n)
        public static complex omega( int n)
        {
                complex x;
                x.a = Math.Cos(0 - 2*Math.PI/n);
                x.b = Math.Sin(0 - 2*Math.PI/n);
                return x;
        }
        public static complex[] dft(double[] signal, int n)  //(信号,信号长度)
        {
                int i,j;
                complex w1;
                w1 = omega(n);
                complex[] w = new complex[n];
                for(i=0; i<n; i++)
                {
                        w[i] = complex.powcc(w1,i);
                }
                complex[] f = new complex[n];
                complex temp;  //w[i]的次方
                complex temp1; //f中单项的值
                for (i=0; i<n; i++)
                {
                        f[i].a = 0;
                        f[i].b = 0;
                        for (j=0; j<n; j++)
                        {
                                temp = complex.powcc(w[i],j);                           
                                temp1 = complex.commul(signal[j],temp);
                                f[i] = complex.comsum(f[i],temp1) ;
                        }
                }
                return f;
        }
//求幅值  x  信号  n  信号长度  返回 幅值数组
        public static double[] amplitude (complex[] x,int n)
        {
                int i;
                double temp ;
                double[] amp = new double[n];
                for (i=0; i<n; i++)
                {
                        temp = x[i].a*x[i].a + x[i].b*x[i].b;
                        amp[i] = Math.Sqrt(temp);
                }
                return amp;
        }
}
/////////////////////////////////////////////////////////////////////
//调用
                int n=6;
                double[] x = new double[]{1,2,3,4,5,6};//被计算的数组
                complex[] y = new complex[n];//接收复数结果的数组
                double[] z = new Double[n];//接收幅值结果的数组
                y = airthm.dft(x,n);
                z = airthm.amplitude(y,n);





--

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多