资源简介
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
相关资源
- dsp2812上128点FFTc程序以及其CMD文件
- 用FFT对信号进行频谱分析
- FFT混合基 文章 FFT混合基 文章
- labview FFT变换(频域分析).vi
- 基于Altera MegaCore实现FFT的方法
- 基于FPGA的快速并行FFT及应用
- 基于FPGA的移位寄存器流水线结构FFT处
- 在FPGA上优化实现复数浮点计算
- 基于十项余弦窗插值FFT的谐波相量算
- 基于FFT算法的电网谐波检测方法
- 基4-浮点-时域-FFT
- 用FFT进行频谱分析
- Altera最新FFT ip核使用手册
- 单片机与DSP中的基于DSP的FFT算法在无
- 128点的基2-FFT算法
- FFT并行MPI实现
- FFT(快速傅里叶变换)的FPGA实现
- FFT快速傅立叶变换)图文并茂
- fftw-3.3.4.tar.gz安装包
- NUFFT算法及说明
- STM32F103通过DMA传输进行快速FFT.rar
- fftw-3.2.1.rar
- myplot.rar
- 数字信号处理-快速傅里叶变换FFT实验
- 64点FFT变换
- FFT FPGA VERILOG 可综合,申请加精
- 基于FFT和小波变换的电力系统谐波检
- FFT在STM32处理器上的实现完整代码
- xilinx FFT核手册
- stm32实现4096点FFT
评论
共有 条评论