在代码的角度理解傅里叶变换
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; } }
其中复数加法可以理解为向量相加,复数的乘积可以理解为拉伸与旋转,下图出自:如何理解复数的四则运算? - 知乎 (zhihu.com)

傅里叶的核心代码 :F[k] = complexadd(F[k], complexMult(x[n], temp));就是把时域函数值(虚部全部为0的特殊的复数函数)依次拉伸1倍并旋转2pi * k * n/N弧度再累加起来再除以N就是频率为k的三角函数,用(a,bi)来表示。
验证可参考C++用代码验证“一切函数皆可傅里叶” - 阿坦 - 博客园 (cnblogs.com)

浙公网安备 33010602011771号