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

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 @ 2023-05-18 14:07  阿坦  阅读(79)  评论(0)    收藏  举报