打印
[应用方案]

FFT的C语言算法实现

[复制链接]
507|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eefas|  楼主 | 2023-7-13 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 1024
typedef struct{       //定义一个结构体表示复数的类型
        double real;
        double imag;
}complex;
complex x[N], *W;   //定义输入序列和旋转因子
int size=0;   //定义数据长度
double PI=4.0*atan(1); //定义π 因为tan(π/4)=1 所以arctan(1)*4=π,增加π的精度
void output()
{
        int i;
        for(i=0;i<size;i++)
        {       
                printf("%.4f",x[i].real);
                if(x[i].imag>=0.0001)
                {
                        printf("+%.4fj\n",x[i].imag);
                }
                else if(fabs(x[i].imag)<0.0001)
                {
                        printf("\n");
                }
                else
                {
                        printf("%.4fj\n",x[i].imag);
                }
        }
}
void change()
{
        complex temp;
        unsigned short i=0,j=0,k=0;
        double t;
        for(i=0;i<size;i++)
        {
                k=i;
                j=0;
                t=(log(size)/log(2));
                while( (t--)>0 )
                {
                        j=j<<1;
                        j|=(k & 1);
                        k=k>>1;
                }
                if(j>i)
                {
                        temp=x[i];
                        x[i]=x[j];
                        x[j]=temp;
                }
        }
        output();
}
void transform()
{
        int i;
        W=(complex *)malloc(sizeof(complex) * size);
        for(i=0;i<size;i++)
        {
                W[i].real=cos(2*PI/size*i);
                W[i].imag=-1*sin(2*PI/size*i);
        }
}
void add(complex a,complex b,complex *c)
{
        c->real=a.real+b.real;
        c->imag=a.imag+b.imag;
}
void sub(complex a,complex b,complex *c)
{
        c->real=a.real-b.real;
        c->imag=a.imag-b.imag;
}
void mul(complex a,complex b,complex *c)
{
        c->real=a.real*b.real - a.imag*b.imag;
        c->imag=a.real*b.imag + a.imag*b.real;
}
void fft()
{
        int i=0,j=0,k=0,m=0;
        complex q,y,z;
        change();
        for(i=0;i<log(size)/log(2) ;i++)
        {
                m=1<<i;
                for(j=0;j<size;j+=2*m)
                {
                        for(k=0;k<m;k++)
                        {
                                mul(x[k+j+m],W[size*k/2/m],&q);
                                add(x[j+k],q,&y);
                                sub(x[j+k],q,&z);
                                x[j+k]=y;
                                x[j+k+m]=z;
                        }
                }
        }
}
int main()
{
        int i;
        printf("输入数据个数\n");
        scanf("%d",&size);//输入数据的长度(2的整数次幂)
        printf("输入数据的实部、虚部\n");
        for(i=0;i<size;i++)
        {
                scanf("%lf%lf",&x[i].real,&x[i].imag);  //输入复数的实部和虚部
        }
        printf("输出倒序后的序列\n");
        transform();//变换序列顺序
        fft();//蝶形运算
        printf("输出FFT后的结果\n");
        output();//输出结果
        return 0;
}


使用特权

评论回复
沙发
tpgf| | 2024-2-4 11:24 | 只看该作者
这么看的话  循环次数真的不少啊

使用特权

评论回复
板凳
磨砂| | 2024-2-4 11:53 | 只看该作者
fft的c语言算法是不是还有分好多种的呢

使用特权

评论回复
地板
八层楼| | 2024-2-4 12:25 | 只看该作者
FFT,即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的

使用特权

评论回复
5
晓伍| | 2024-2-4 12:51 | 只看该作者
请问fft的算法原理是什么呢

使用特权

评论回复
6
观海| | 2024-2-4 13:23 | 只看该作者
fft算法和dft算法的区别或者说关系是什么呢

使用特权

评论回复
7
guanjiaer| | 2024-2-4 19:45 | 只看该作者
点数越多,运算量的节约就越大,这就是FFT的优越性

使用特权

评论回复
8
药无尘| | 2024-2-6 10:25 | 只看该作者
这个算法非常好,就是在高速系统不友好,计算时间有点长

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

2589

帖子

2

粉丝