小工具知识网

当前位置: 首页 > 行业知识 > 快速傅里叶变换(FFT)c语言实现

行业知识

快速傅里叶变换(FFT)c语言实现

2026-10-19 01:50:00 来源:互联网转载

基���原理在这里就不多讲了,可以看看其他高浏览量的博文,这篇文章针对c语言的实现

复数运算算子

        我们都知道C语言本身是没有复数运算的,很多DSP、单片机要用到也没有开源库可以使用复数运算,针对FFT在硬件上运行只能手动从底层开始

定义复数类型

        这里用最简单高效的方法——结构体

struct complex{    double real;    double image;};

复数加法

struct complex complex_add(struct complex c1,struct complex c2)     //复数加法{    struct complex p;    p.real = c1.real + c2.real;    p.image = c1.image + c2.image;    return p;}

复数减法

struct complex complex_sub(struct complex c1,struct complex c2)     //复数减{    struct complex p;    p.real = c1.real - c2.real;    p.image = c1.image - c2.image;    return p;}

复数乘法

struct complex complex_multi(struct complex c1,struct complex c2)  //复数乘法{    struct complex c3;    c3.real=c1.real*c2.real - c1.image *c2.image;    c3.image = c2.real* c1.image + c1.real*c2.image;    return c3;};

复数取模

double mold_length(struct complex c)        //幅度{    return sqrt(c.real * c.real + c.image * c.image);};

旋转因子

    教科书上的旋转因子一般长成这样把它变成可以运算的形式   

struct complex rotation_factor(int N,int n,int k)       //旋转因子{    struct complex w;    w.real = cos(2* PI * n * k /N);    w.image = - sin(2* PI * n * k /N);        //这里的PI是宏定义    return w;}

反位序操作

        我用的方法是基于时间抽取的基2FFT (DIT-FFT)所以开始进入FFT之前要先把序列顺序取反位序

int reverse_num(int l,int oringin_num)          //反位序{    int q=0,m=0;    for(int k=l-1;k>=0;k--)    {        q = oringin_num % 2;        m += q*(1

上一篇:网上买主机一般多少钱一个

下一篇:Win10系统安全守护者,看门狗,数字生活的安全卫士