在代码的角度理解傅里叶变换

C++代码傅里叶变换如下

复制代码
#include <stdio.h>
#include <math.h>


#define pi 3.1415926
#define rows 3
#define colums 5

typedef struct {
    float re;// really 
    float im;// imaginary 
}complex, * pcomplex;

complex complexadd(complex a, complex b) //复数加
{
    complex rt;
    rt.re = a.re + b.re;
    rt.im = a.im + b.im;
    return rt;
}

complex complexMult(complex a, complex b) //复数乘
{
    complex rt;
    rt.re = a.re * b.re - a.im * b.im;
    rt.im = a.im * b.re + a.re * b.im;
    return rt;
}
//离散傅里叶变换
void dft(complex F[], complex x[], int N) //X[]标识变换后频域,x[]为时域采样信号
{
    complex temp;
    int k, n;
    for (int k = 0; k < N; k++) {
        F[k].re = 0;
        F[k].im = 0;
        for (int n = 0; n < N; n++) {
            temp.re = (float)cos(2 * pi * k * n / N);
            temp.im = -(float)sin(2 * pi * k * n / N);
            F[k] = complexadd(F[k], complexMult(x[n], temp));
        }
        F[k].re = F[k].re / N;
        F[k].im = F[k].im / N;
    }
}
View Code
复制代码

其中复数加法可以理解为向量相加,复数的乘积可以理解为拉伸与旋转,下图出自:如何理解复数的四则运算? - 知乎 (zhihu.com)

 

 

傅里叶的核心代码 :F[k] = complexadd(F[k], complexMult(x[n], temp));就是把时域函数值(虚部全部为0的特殊的复数函数)依次拉伸1倍并旋转2pi * k * n/N弧度再累加起来再除以N就是频率为k的三角函数,用(a,bi)来表示。

验证可参考C++用代码验证“一切函数皆可傅里叶” - 阿坦 - 博客园 (cnblogs.com)

 

posted @   阿坦  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示