资源简介
FFT 多项式乘法 C代码 用快速傅里叶算法进行 复杂度为 O nlogn
代码片段和文件信息
/*
*作者:handspeaker
*时间:2013.4.9
*多项式相乘FFT算法,包括
*FFT函数
*IFFT函数
*等
*/
#include
#include
#include
#define MAX_SIZE 65536
#define PI (acos((double)-1))
//复数
struct Complex{
double real;
double image;
};
Complex a1[MAX_SIZE]a2[MAX_SIZE]result[MAX_SIZE]w[MAX_SIZE];
//复数相乘计算
Complex operator*(Complex aComplex b){
Complex r;
r.real=a.real*b.real-a.image*b.image;
r.image=a.real*b.image+a.image*b.real;
return r;
}
//复数相加计算
Complex operator+(Complex aComplex b){
Complex r;
r.real=a.real+b.real;
r.image=a.image+b.image;
return r;
}
//复数相减计算
Complex operator-(Complex aComplex b){
Complex r;
r.real=a.real-b.real;
r.image=a.image-b.image;
return r;
}
//复数除法计算
Complex operator/(Complex adouble b){
Complex r;
r.real=a.real/b;
r.image=a.image/b;
return r;
}
//复数虚部取负计算
Complex operator~(Complex a){
Complex r;
r.real=a.real;
r.image=0-a.image;
return r;
}
//重新排列
void Reverse(int* idint sizeint m){
for(int i=0;i for(int j=0;j int exp=(i>>j)&1;
id[i]+=exp*(int)pow((double)2(double)(m-j-1));
}
}
};
//计算并存储需要乘的w值
void Compute_W(Complex w[]int size){
for(int i=0;i w[i].real=cos(2*PI*i/size);
w[i].image=sin(2*PI*i/size);
w[i+size/2].real=0-w[i].real;
w[i+size/2].image=0-w[i].image;
}
};
//快速傅里叶
void FFT(Complex in[]int size){
int* id=new int[size];
memset(id0sizeof(int)*size);
int m=log((double)size)/log((double)2);
Reverse(idsizem); //将输入重新排列,符合输出
Complex *resort= new Complex[size];
memset(resort0sizeof(Complex)*size);
int ijks;
for(i=0;i resort[i]=in[id[i]];
for(i=1;i<=m;i++){
s=(int)pow((double)2(double)i);
for(j=0;j for(k=j*s;k Complex k1= resort[k]+w[size/s*(k-j*s)]*resort[k+s/2];
resort[k+s/2]=resort[k]-w[size/s*(k-j*s)]*resort[k+s/2];
resort[k]=k1;
}
}
}
for(i=0;i in[i]=resort[i];
delete[] id;
delete[] resort;
};
//快速逆傅里叶
void IFFT(Complex in[]int size){
int* id=new int[size];
memset(id0sizeof(int)*size);
int m=log((double)size)/log((double)2);
Reverse(idsizem); //将输入重新排列,符合输出
Complex *resort= new Complex[size];
memset(resort0sizeof(Complex)*size);
int ijks;
for(i=0;i resort[i]=in[id[i]];
for(i=1;i<=m;i++){
s=(int)pow((double)2(double)i);
for(j=0;j for(k=j*s;k Complex k1=(resort[k]+(~w[size/s*(k-j*s)])*resort[k+s/2]);
resort[k+s/2]=(resort[k]-(~w[size/s*(k-j*s)])*resort[k+s/2]);
resort[k]=k1;
}
}
}
for(i=0;i in[i]=resort[i]/size;
delete[] id;
delete[] resort;
};
int main(){
//输入两个多项式数列
int sizesize1size2i;
memset(a10sizeof(a1));
memset(a20sizeof(a2));
memset(w0sizeof(w));
memset(result0sizeof(result));
scanf(“%d%d“&size1&size2);
for(i=0;i scanf(“%lf“&a1[i].real);
for(i=0;i
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3398 2013-04-11 23:53 FFT.cpp
----------- --------- ---------- ----- ----
3398 1
相关资源
- libfftw3-3.lib
- fftw函数库
- 快速傅立叶变换(FFT)的计算机实现
- 音频信号FFT变换后节拍检测的软件.
- VC程序实现了波形显示与FFT算法
- 简易工频信号测试仪(FFT)
- 基于MSP430的FFT算法源码
- 用FPGA实现FFT,强大的VHDL源程序附详细
- VHDL FFT源代码
- 求正弦波幅值和相位的FFT算法
- 基2基3定点混合基fft
- stm32f407+FFT浮点运算例程
- 基于fft的图像配准资料
- verilog编写的FFT
- CallTifftoy.rar
- fft7.v
- 16位浮点FFT算法的VHDL实现(有测试文
- TMS320C54x系列DSP上FFT运算的实现
- FPGA 256点FFT
- 基于全相位频谱的fft
- FFT高精度谐波检测方法研究
- FFT算法的hls实现
- 基于加汉宁窗的FFT高精度谐波检测改
- FFT Verilog代码
- 基于4的FFT变换
- 64点的FFT基8算法的蝶形图
- 数字信号处理大作业——编写FFT程序
- FFT_XILINX实现
- 细化FFT的短时傅里叶变换方法
- labview-fft幅值和相位
评论
共有 条评论