之前做图像傅里叶变换时,想自己实现快速傅里叶变换,苦于网上的fft代码都要求点数是2的幂次方,在补0变换后加滤波需要分析补0的影响(频率域拓宽),于是自己实现了一下不论奇数偶数均可的fft。
算法很简单,在计算中若序列总数为偶数就划分为奇数部分与偶数部分,直到所有序列都为奇数时,直接用dft计算奇数部分的频域值,再用fft组合起来。
先贴代码,首先定义复数结构体
struct fu
{
double real; //实部
double imag; //虚部
};
fft主体,dft_ffts这个函数是普通的dft,用作在分为不可再分的奇数点时计算,外部调用直接用ffts函数即可
/*计算复数的乘*/
struct fu mul(fu a,fu b)
{
fu r;
r.real=a.real*b.real-a.imag*b.imag;
r.imag=a.real*b.imag+a.imag*b.real;
return r;
}
/*dft*/
void dft_ffts(struct fu* linear,int size,int start,int step)
{
int i,j,k;
fu* dft=(struct fu*)malloc(sizeof(struct fu)*size);
fu mulf;
for(i=0;i<size;i++) //频率循环
{
dft[i].real=0;
dft[i].imag=0;
for(k=0;k<size;k++) //时域循环
{
mulf.real=cos(2*M_PI*i*k/size);
m