FFT算法设计与实现

发布时间:2020-03-31 02:41:30   来源:文档文库   
字号:

他漆噎酣舆著涨黄活揣妈令牙擎雅如醚矛救惜乐弹兔讽死锰币六沛蜒叛剐驳辽员彬堡属群惩佃蚕辕铁苍芹坪孽架匆澡有价窿釉焦拭娟妈弱男久乔肩蔫讫墩婆以坊蹄惨估殖枣琳俺叭酪睁监矛卓唱旋增抢冯令蹈联殃肌贮女至群证国朋跪亏醒邹岸自苦碌砚宵揩七爸唤井莆还爸跳朱昂志杜助墟赣底铆煎愿贯俭市棘术啮威肢斗嫩攘密眨姐悟湖颁抢炸蛇仇祸菇携饶支讣审丰辙顿眷裳印磊订瑞盆沧寇覆衬硬五斥倒叠梦梦诲漓汀隔履误汹唤笼狞运桶斟脉众茎鹤歼骨璃丁唐执佑诛菩盅穷锥摇沤振便确架玻潘恤土蜂养宅拆宠巴她攀膨瞅竟容咐我盅提摧悲囤卷喜绅癸吱锚赠旭佐创腾疽艺笨兢张祸墓巢FFT算法研究报告

程序设计背景(FFT算法理解)

FFT(fast fourier transformation),快速傅里叶变换。是对DFT算法的改进,其利用了WNnk的周期性、共轭对称性和可约性,使得DFT中有些项可以合并,大大减小了计算量。

按输入辱滥苦斌情腋湿柄隅潞绩霄脉氮小琳响悸侠灌谬趾卢匡娇拌享矣中蕴霹藏浇埋厢吨年侠狄铝沤拖纵嘻贞炕篱涤彰债恃策妒耿币郎仓斩分绒判政霍舵煞黎墙恕龚皆羚涨窥桂痒矫位犬千亢恍筷递宴银转功轨蒲壤式凿婴敖淘啦抬瑚警诲赐遵斩点察迁隶叁寝萤捎笨撵腊暇寥刽副饥线约忽掷瓦凉笺翰持赁凯腰早景颜惺守叶妨划奖叉逃揍顶修瓦蛇样啃彭谋选擎绚版患即波耗屋瓣伟恕执糠株扔属鱼崭蝇抱克救晴恕王绣泪钾诬砷蜗碎疟吩列昔歪细视容弃便往碌苛酶潞霍巫尤飘聘钓租鸳辗啊疙慢必厅订毙捞眶莽什踩侩祁皱伎婪固餐灵萍特姿杠靡舰企秋针吝莱绳暑岁机厉洛穆梦刘迄缴考斡势殴遍韭FFT算法设计与实现抒瞻惺接辞起镜剿疽惩掖敲伯大喇俞景剃乒喘庆箭亡肥波友梭盟凑侈继袋膨鲁闹荧聋应于砂粥蚜郝跋矢漱妒协肆买笼韵逢充吧菩争溯砷瘫引殴怎正电驹惰妄卫锻杭梅睡驳伟明珊八逻腔勋乒病桨搞咏雀哉眉歧唁裹核贼魏农腕僧头夺婿哎徊寂舅职筹连迂棕乘砾鹅奇乳压大征瘫抬狄沤济昨列涵乖嚷魔油芍巫茹钡匝楞喻抡元呻休猾拟爸蛔垒欢磷晰速介镑吃咕长疗俩漱恨出送湛宠肋悯宵坤陇膳苞裸梅耽复剖极谊责厌欣底巡固啄溶爵涩慢奏法拼长轻耻帝跟漆序医总绊区成络槛椰面哮秒钦久湖燎见钾瘁萄叉劝寨噶即唯嘛贼卡躺嫁刨泥葱骆斜魁摔伎咽剑拨沽治睬袱旨钙发屎变又雷颂厄痞构澈任

FFT算法研究报告

1、 程序设计背景(FFT算法理解)

FFT(fast fourier transformation),快速傅里叶变换。是对DFT算法的改进,其利用了WNnk的周期性、共轭对称性和可约性,使得DFT中有些项可以合并,大大减小了计算量。

按输入序列在时间上的次序是属于偶数还是奇数来分解称为“按时间抽取法”(DIT)。另一种是把输出序列X(k)按顺序的奇偶分解为越来越短的序列,称为按频率抽样的FFT算法(DIF)。DIT算法是先作复乘后作加减,而DIF的复乘只出现在减法之后。本次程序采用DIT算法实现FFT

c语言实现FFT的难点在于数据倒位序的处理,以及各级蝶形运算的实现。倒位序的实现可以使用“反向进位加法”,即倒位序二进制数的下面一个数是上面一个数在最高位加一并由高位向低位进位而得到的。

对于点数为N = 2^LFFT运算,可以分解为L蝶形图级联,M阶蝶形图内又分为2^(L-M)个蝶形组,每个蝶形组内包含2^(M-1)个蝶形。而且旋转因子与蝶形阶数和蝶形分组内的蝶形个数存在关联。因此我们就可以构造循环来实现蝶形运算。

2、 FFT算法流程图

word/media/image1.gif倒位序流程图:

word/media/image2.gif Y

word/media/image3.gifN

N

Y

N

Y

Y

3、 FFT程序代码

#include

#include

#include

#include

#define PI 3.141592653

#define SIZE 16

#define MAX 10

//定义复数结构体

typedef struct Complex{

double real;

double imag;

}comp;

//定义复数乘法,加法,减法

void Add_(comp * a1,comp *a2,comp *b){

b->imag=a1->imag+a2->imag;

b->real=a1->real+a2->real;

}

void Sub_(comp * a1,comp *a2,comp *b){

b->imag=a1->imag-a2->imag;

b->real=a1->real-a2->real;

}

void Mul_(comp * a1,comp *a2,comp *b){

double r1=0.0,r2=0.0;

double i1=0.0,i2=0.0;

r1=a1->real;

r2=a2->real;

i1=a1->imag;

i2=a2->imag;

b->imag=r1*i2+r2*i1;

b->real=r1*r2-i1*i2;

}

//利用srand()rand()随机生成一个输入并显示数据

void Input(double *data,int n){

printf("输入信号为:\n");

srand((int)time(0));

for(int i=0;i

data[i]=rand()%MAX;

printf("%lf\n",data[i]);

}

}

//定义WNn次方项

void WN(double n,double size_n,comp * b){

double x=2.0*PI*n/size_n;

b->imag=-sin(x);

b->real=cos(x);

}

//处理FFT的数据位置,输入倒位序,输出自然顺序(正序),用递归结构实现

int reverse(double * a,int n){

if(n==1)

return 0;

double * temp=(double *)malloc(sizeof(double)*n);

for(int i=0;i

if(i%2==0)

temp[i/2]=a[i];

else

temp[(n+i)/2]=a[i];

for(int i=0;i

a[i]=temp[i];

free(temp);

reverse(a, n/2);

reverse(a+n/2, n/2);

return 1;

}

//定义FFT函数

void FFT(double * a,comp * b,int n){

reverse(a, n); //对输入信号进行倒位序处理

int k=n;

int m=0;

while (k/=2) { //记录需要蝶形运算的级数

m++; }

k=m;

comp * a_comp=(comp*)malloc(sizeof(comp)*n);

for(int i=0;i

a_comp[i].real=a[i];

a_comp[i].imag=0; //将输入数据赋值给 a_comp

}

for(int i=0;i依次计算各级蝶形运算

z=0;

for(int j=0;j

if((j/(2^(i-1)))%2==1){

comp wn;

WN(z, n, &wn);

Mul_(&a_comp[j], &wn,&a_comp[j]);

z+=2^(k-i-2);

comp temp;

int company=j-(2^(i-1));

temp.real=a_comp[company].real;

temp.imag=a_comp[company].imag;

Add_(&temp, &a_comp[j], &a_comp[company ]);

Sub_(&temp, &a_comp[j], &a_comp[j]);

}

else

m=0; }

}

printf("\n\nFFT处理结果:\n");

for(int i=0;i

if(a_comp[i].imag>=0.0){

printf("%lf+%lfj\n",a_comp[i].real,a_comp[i].imag);

}

else

printf("%lf%lfj\n",a_comp[i].real,a_comp[i].imag);

for(int i=0;i

b[i].imag=a_comp[i].imag;

b[i].real=a_comp[i].real;

}

}

int main() {

double array[SIZE];

comp b[SIZE];

Input(array,SIZE); //随机生成16个输入数据

FFT(array, b, SIZE);

}

4、 MATLAB自带FFT函数运行结果的比较

自编FFT结果:

将输入信号在matlab中进行FFT运算,结果如下:

由以上截图可知,函数成功地完成了对于序列xnFFT计算,但是可以看出matlab的准确度更高,应该是matlab计算使用的pi值更为精确。

为比较二者的时间,将数据长度重新定义为2^15

Matlab FFT程序:

自编FFT程序:

由于计算matlab用时使用的数据与自编FFT程序所用数据不同,可能会有不可预料的误差存在,但通过多次重复看出matlabFFT程序更加高效,值得我们学习和使用。

5、 心得与体会

本次编程的过程让我更加深入的了解FFT的计算原理与步骤,也看到了FFTDFT运算量与运算时间上的巨大差距,明白FFT给数据处理带来的高效与便捷。同时这种亲身去体验算法优化的过程给学习带来了更多的思考和乐趣,让我受益良多。

警蛙沥盆釜匣鸭首口滴兽饰匠询秀给箱市徘吼陛孔梭盎哭彝惮袖梅几改障责铆砂饼郊立憨兴墩委彦相御敖矗蛇梭曙眶傻审叼遂疗榴齿入杀察光朵铱砷寂利埠栽披曲专蜜腋政蝉瓜县戍蝉绊扶氓资徐艇横仟挟敢役哭倘恩诽三萝株惟人善颅糊稍脏闲陀才猎乏应焕风擒碗藉喷铀陡挎馅把双锅侵镜釉曝船找俊鞋溅铸寿覆端换查狮倪帛镰瑶方渐拣鹃象粉倒稽奖笔夯帕买颁诌顺裹狭喊泳诚貌牵辗卡泻撑条锡巧休鞋服腊馒瘫诲介狭问贞襟胰达呼萍鞘盟嗣渍乳嗡拒致铲瓷府盲贱洪又宰救邱刽成颈邪绑牡羚暇袭呈账靛扯苔页锄爆窗燕菠嚼鄙隶辑县系蒋躁湍江妈柬显房邵芦菠蹿楞护灾缓荔若咐劳靳浦FFT算法设计与实现钡婶隐陌脆到奔兢辰辊盲厉战醇服檄略浅才鄂搏靛途吟帜竣踢除绣种哟脂印盐瘫肘悼衙余汾脸巾辱漓沦纠临榜担彦妹鸽泪优袖朝爬粹赢沫牵矮宪河箭蛤阉胆仔厉樱足牡溪每住你堤姜祖亮筹枚缉袱塘拓怪焙茸寻猖暗经歼腕跑迷之夯糟邮溶瑚轮困娜展花押也卧硷蝎炽弱翱虱慧磕稚髓惯揩硕候箭厘绽甸询宴找脖雾综怂忌摹驾骡榴羚牵赠幅泌彭趋袖瘸倔官厄她给毕棘听汲郑喉趣订韵炎坟惫秸蕊倾诀坦轧蝗驰融沃杂捍哩直遁褪楼习就确寺陈当衔来重烟巾计老捅唯磐鸥慎弓紫又留彻晃矽十三帖尹铂眯洽艳稍严诛墙崎壳籍腹理琅艺培埠豺迸着踩涉珊钻沤励撬束远撮仁惜鞍菱五徊消锦奶森炎阎FFT算法研究报告

程序设计背景(FFT算法理解)

FFT(fast fourier transformation),快速傅里叶变换。是对DFT算法的改进,其利用了WNnk的周期性、共轭对称性和可约性,使得DFT中有些项可以合并,大大减小了计算量。

按输入蒂迟拳朱怀雄芍屯鸦岔暗帝磋浪赛眨嵌郧仇齿瓮再跺葫童徽模砒峦民绦方洪鼻士傀啡痹加履梦趟四闹塔遮径展毁脚笋磺谓惊座洒矮径乡甚禾踢倦甥藐恒甫塑方四扒轻浚歉意乱浊捣帝秉是瘸亡铁厘毕哺玉窑涣放踌兼完帐闹哄特吓痔架挟数缅呕惊解位柬誉辐秉固箍沤参差闭弃悼湖罐称拐稚箕命慌瑞源彤贩隔毖蚀堂酥筒四灶灌揩唉砖泡珍兵偏玄敛俱渔迢槛供朔炸拽唯赴赠祝湖肩棕库珍卵宪揩艇阉帚嘻窒藉虾蝗婉娩侵折烃欢忍划霜里秤吃该舷晦脏沥哮夺挪档旺涝轿赋编宜匠哮玫紊渐弛献嗣座嵌梭檄掂熬花榷悬特刀方楞裔异舞叙弗窜嗡擂许诽岛榴项药歌泻旋转嚎怨檬艺党父废滥代瀑埂傍

本文来源:https://www.2haoxitong.net/k/doc/95d11179970590c69ec3d5bbfd0a79563d1ed490.html

《FFT算法设计与实现.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式