- 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)
FFT程序设计报告
快速傅里叶变换法(FFT)是离散傅立叶变换的一种快速计算方法,它能使N点DFT的乘法计算量由N2 次降为次。下图是采样点数为8点FFT时间抽取算法信号流图,本程序也是以这种形式设计的。
程序设计的基本思路是在程序开始时刻要求输入采样点数,如果采样点数是2的整数次方(不包括0次方),则要求输入采样点的数值,并根据采样点数分配响应的数组大小,计算迭代次数。然后对采样点进行逆二进制排序,再按上图所示的算法进行计算,程序流程图如下图所示:
本程序运用VC语言对程序进行设计,下面分别对程序设计中复数类的应用,判断和求迭代次数,逆二进制排序,蝶形运算进行具体说明。
复数类的应用
C语言本身并不包含复数数据类型,但C语言可以根据需要定义自己的数据类型,本程序定义了一个复数结构体complex,包括实部real和虚部img两部分,代码如下:
typedef struct
{
double real;
double img;
}complex;
在FFT程序设计中,复数类主要被用来计算两复数的加法和乘法以及旋转因子,其中,式中N=2的m+1次方,m代表计算流图的第m级,而k代表第k次蝶形运算,由于C中的math.h函数库中没有带参数的复数运算函数,所以本程序编写了带参数的复数运算cw(double x,double y),用于计算,设计的基本思路,首先把e的次幂用欧拉公式化成三角函数,然后化复数乘法和除法运算为几个复数基本单元的加法运算和除法运算,其中运算的次数由函数输入参量double x决定。函数mul(complex x1, complex x2)用于计算复数的乘运算。
判断和求迭代次数
本程序编写iternumb(int numb)函数对采样点数进行判断,如果采样点数不符合2的整数次方或采样点数为1或0,则跳出程序,程序设计基本思路是对输入采样点数的十进制形式进行模2运算和除法运算,在除法运算结果大于1之前,一旦模2运算的结果等于1,则说明输入采样点数不符合要求,而如果符合要求,则把出发结果存入数组当中,函数代码如下:
int iternumb(int numb)
{
int iternumb1=0;
if((numb==0)||(numb==1))
{
printf(numb error!\n);
exit(0);
}
while ((numb!=0)(numb!=1))
{
if (numb%2)
{
printf(numb error!\n);
exit(0);
}
numb=numb/2;
iternumb1=iternumb1+1;
}
return iternumb1;
}
码位倒置
在逆二进制排序程序中,设置for循环分别将输入数据数组input[i]的索引号i进行模2运算,所得的结果按逆序存入inverse[ ]数组(存入inverse[ ]数组的顺序是从数组尾部开始)。
然后再将inverse[ ]中的二进制数转换为十进制数,并以此数为A[j]的索引号,令A[j]= input[i],从而实现了逆二进制排序。
蝶形运算
蝶形运算是FFT中最基本的一个运算单元。在FFT程序设计中要找到蝶形运算地址与第几级迭代,第几组之间的关系。在第m级,有如下关系:
式中,m为第级数,可以用函数cw(double x,double y)计算出来,p、q分别为单元地址,p、q之间的距离为2m,即。根据上述关系可运用3次for循环实现上述计算,最外层为级数m的循环,m的取值为0~log2N,中间为组数i循环,每一级i的取值为1~,最内层为旋转因子中的r循环,每一组中r的取值为0~2m -1,循环的部分代码如下:
itm=iternumb(N);
sign1=itm;
for(m=0;msign1;m++)
{
X=pow(2,m);
for(i=1;iN/(2*X)+1;i++)
{
p=2*X*(i-1);
q=X+p;
for(r=0;rX;r++)
{
w=cw(r,X);
tempA3=mul(w,A[q]);
您可能关注的文档
最近下载
- 提高住院患者大小便标本送检率PDCA.pptx VIP
- 安全生产五落实到位规定.doc VIP
- 基础工程课程设计计算书.doc VIP
- 罗克韦尔(AB) PowerFlex 750 系列交流变频器编程手册 中文.pdf VIP
- Yamaha 雅马哈 乐器音响 CL5 CL3 CL1 V4.0 Reference Manual [中文] 用户手册.pdf
- 外周T细胞淋巴瘤课件.pptx
- 中国电信以太智能专线STN(Smart Transport Network)专线培训.pdf VIP
- 宣传制作类项目服务方案.docx VIP
- 小学残疾儿童送教上门教案(40篇).pdf VIP
- 加油站从业人员安全培训.ppt
原创力文档


文档评论(0)