- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《信号处理FFT算法
实验2 基2时域抽选的FFT程序设计与调试
一、实验目的
掌握信号处理,尤其是数字信号处理的基本原理和方法。要求能通过实验熟练掌握基2时域抽选的快速傅立叶变换算法(FFT)的基本原理,了解二维及多维快速傅立叶变换算法。
二、实验原理
1.复数类型
对于FFT算法涉及的复数运算,使用自定义的COMPLEX来定义复数类型,其使用方法与常规类型(如int,float,double)相似。
typedef struct {
float real, imag;
} COMPLEX;
2.FFT基本原理
FFT改进了DFT的算法,减少了运算量,主要是利用了旋转因子W的两个性质:
(a)W的周期性:W= W
(b) W的对称性:W=-W
FFT把N点DFT运算分解为两组N/2点的DFT运算,然后求和:
其中,
在计算X1(k)与X2(k)时,仍利用上述公式,把它们看成是新的X(k)。如此递归下去,便是FFT算法。
3.蝶形运算
从基2时域抽选FFT运算流图可知:
① 蝶形两节点的距离为2m-1,其中,m表示第m列,且m =1,… ,L。
例如N=8=23, 第一级(列)距离为21-1=1,
第二级(列)距离为22-1=2,
第三级(列)距离为23-1=4。
② 考虑蝶形运算两节点的距离为2m-1,蝶形运算可表为:
Xm(k)=Xm-1(k)+Xm-1(k+2m-1) WNr
Xm(k+2m-1)= Xm-1(k)-Xm-1(k+2m-1) WNr
由于N为已知,所以将r的值确定即可确定WNr。为此,令k=(n2n1n0)2 ,再将k左移(L-m)位,右边位置补零,就可得到(r)2 的值,即(r)2 =(k)22L-m 。
例如 N=8=23
(1) k=2 , m=3 的r值,∵k=2=(010)2 左移L-m=3-3=0 ,∴ r=(010)2=2;
(2) k=3 ,m=3 的r值;k= 3=(011)2,左移0位,r=3;
(3) k=5 ,m=2的值;k=5=(101)2 左移L-m=1位 r=(010)2 =2。
4.存储单元
存输入序列 x(n),n=0,1, ,N-1,计N个单元;
存放系数WNr, r=0,1, ,(N/2)-1;需N/2个存储单元;
共计(N+N/2)个存储单元。
5.程序框图
三、实验内容
1.编写一个实现FFT算法的函数。
void fft(COMPLEX A[ ] , int m)
其中,COMPLEX是复数类型的名称,A是要变换的数据,m是FFT点数N的以2为底的幂次(即N=2m )。
编写测试用的主程序对fft函数进行测试,并给出测试结果。
实验代码
#include stdio.h
#include stdlib.h
#include math.h
#define N 1000
#define PI atan(1)*4
typedef struct
{
double real;
double imag;
}complex;
void fft(complex A[],int m); //快速傅里叶变换
void initW();
void change();
void add(complex,complex,complex *); //复数加法
void mul(complex,complex,complex *); //复数乘法
void sub(complex,complex,complex *); //复数减法
void divi(complex,complex,complex *); //复数除法
void output();
complex A[N], *W; //输出序列的值
complex up,down,product;
int size=0; //序列的长度
int m;
void main()
{
fft(A,m);
output();
}
//进行基-2 FFT运算
void fft(complex x[],int m)
{ int i=0,j=0,k=0,l=0;
printf(Please input m:);
scanf(%d,m);
size=pow(2,m);
printf(Please input %d datas in A[%d]:\n,size,size);
for(i=0;isize;i++)
{
printf(A[%d]:,i);
文档评论(0)