数字信号处理算法(1)-离散傅里叶变换
admin 于 2014年05月15日 发表在 数字信号处理
离散傅里叶变换,是数字信号处理的基础。建议对数字信号处理有一定基础后,再看本篇博文。
1. 离散傅里叶变换(维基百科)
离散傅里叶变换(Discrete Fourier Transform,缩写为DFT),是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DTFT的频域采样。
2. 程序设计方法
核心:欧拉公式展开,实轴和虚轴分别计算。
3. 算法函数dft.h
#include <math.h> void dft(double x[],double y[],double a[], double b[], int n, int sign); /* x:存放要变换数据的实部 * y:存放要变换数据的虚部 * a:存放变换结果的实部 * b:存放变换结果的虚部 * n:数据长度 * sign:定义正变换和反变换的标志;sign=1,正变换;sign=-1,反变换; */ void dft(double x[],double y[],double a[], double b[], int n, int sign) { int i,k; double c,d,q,w,s; q=6.28318530718/n; for(k=0; k<n; k++) { w=k*q; //部分系数 a[k]=b[k]=0.0; for(i=0; i<n; i++) { d=i*w; //完全系数 c=cos(d); //a(n)系数 s=sin(d)*sign; //b(n)系数 a[k]+=c*x[i]+s*y[i]; //实部 b[k]+=c*y[i]-s*x[i]; //虚部 } } if(sign==-1) { c=1.0/n; //IDFT总函数的系数 for(k=0; k<n; k++) { a[k]=c*a[k]; b[k]=c*b[k]; } } }
4. 设计题目
由于原序列较多,此处不贴,可下载源代码点击下载附件
5. 利用Debian7下的Qtiplot分析