1、1快速傅立叶变换(FFT)的实现一、实验目的1.了解 FFT 的原理及算法;2.了解 DSP 中 FFT 的设计及编程方法;3.熟悉 FFT 的调试方法;二、实验原理FFT 是一种高效实现离散付立叶变换的算法,把信号从时域变换到频域,在频域分析处理信息。对于长度为 N 的有限长序列 x(n),它的离散傅里叶变换为: ,称为旋转因子,或蝶形因子。 (2/)jnkNWe在 x(n)为复数序列的情况下,计算 X(k):对某个 k 值,需要 N 次复数乘法、( N-1)次复数加法;对所有 N 个 k 值,需要 次复数乘法和 N(N-1)次复数加法。对于 N 相当大时(如21024)来说,直接计算它的
2、DFT 所作的计算量是很大的,FFT 的基本思想在于:利用 的周期性即:2()jnkNWekNkW对称性: /2将原有的 N 点序列分成两个较短的序列,这些序列的 DFT 可以很简单的组合起来得到原序列的 DFT。按时间抽取的 FFTDIT FFT 信号流图如图 5.1 所示:图 5.1 时间抽取的 FFTDIT FFT 信号流图FFT 算法主要分为以下四步。第一步 输入数据的组合和位倒序10 NnnkNW2把输入序列作位倒序是为了在整个运算最后的输出中得到的序列是自然顺序。第二步 实现 N 点复数 FFT 第一级蝶形运算;第二级蝶形运算;第三级至 log2N 级蝶形运算;FFT 运算中的旋转
3、因子 是一个复数,可表示:NW为了实现旋转因子 的运算,在存储空间分别建立正弦表和余弦表,每个表对应从N0 度到 180 度,采用循环寻址来对正弦表和余弦表进行寻址。 第三步 功率谱的计算 X(k)是由实部 和虚部 组成的复数: ;计算功率()Rk()IXk()()RIXkjXk谱时只需将 FFT 变换好的数据,按照实部 和虚部 求它们的平方和,然后对()RI平方和进行开平方运算。 第四步 输出 FFT 结果。三、实验内容与步骤. 本实验要求使用 FFT 变换求一个时域信号的频域特性,并从这个频域特性求出该信号的频率值,然后使用 DSP 汇编语言对 FFT 的 DSP 编程。. 将计算机与 D
4、ES-320PPA 教学实验系统连接好,打开实验箱电源,然后运行 CCS 软件。2.新建 fft.pjt 工程文件,并输入 FFT 的 DSP 程序及命令链接文件。如下:*Radix-2,DIT,Real-input FFT Program * fft.asm *.mmregs.global reset,start,sav_sin,sav_idx,sav_grp.def start,_c_int00 .data DATA .space 1024.copy “fft.inc“ N .set 128LOGN .set 7 sav_grp .usect “tempv“,3sav_sin .set s
5、av_grp+1sav_idx .set sav_grp+2OUTPUT .usect “OUTPUT“,256BOS .usect “stack“,0FhTOS .usect “stack“,1 .copy “twiddle1.inc“ .copy “twiddle2.inc“.text_c_int002/ 2cosinkjkNkej3b start nopnopstart:STM #TOS,SPLD #0,DPSSBX FRCT STM #2*N,BK STM #INPUT,AR3STM #DATA,AR7MVMM AR7,AR2STM #N-1,BRCRPTBD plend-1STM #
6、N,AR0LDM AR3,A READA *AR2+ ADD #1,AREADA *AR2+MAR *AR3+0Bplend:STM #0,BKLD #-1,ASMMVMM AR7,AR2STM #DATA+2,AR3STM #N/2-1,BRCLD *AR2,16,ARPTBD s1end-1STM #3,AR0SUB *AR3,16,A,BADD *AR3,16,ASTH A,ASM,*AR2+ST B,*AR3+|LD *AR2,ASUB *AR3,16,A,BADD *AR3,16,ASTH A,ASM,*AR2+0ST B,*AR3+0%|LD *AR2,As1end:MVMM AR
7、7,AR2STM #DATA+4,AR3STM #N/4-1,BRCLD *AR2,16,ARPTBD s2end-1STM #5,AR0SUB *AR3,16,A,BADD *AR3,16,ASTH A,ASM,*AR2+ST B,*AR3+|LD *AR2,ASUB *AR3,16,A,BADD *AR3,16,ASTH A,ASM,*AR2+STH B,ASM,*AR3+MAR *AR3+ADD *AR2,*AR3,ASUB *AR2,*AR3-,BSTH A,ASM,*AR2+4SUB *AR2,*AR3,AST B,*AR3|LD *AR3+,BST A,*AR2|ADD *AR2+
8、0%,AST A,*AR3+0%|LD *AR2,As2end:STM #512,BKST #128,sav_sinSTM #128,AR0STM #TWI2,AR4STM #TWI1,AR5STM #-3+LOGN,AR7ST #-1+N/8,sav_grpSTM #3,AR6ST #8,sav_idxstage:STM #DATA,AR2LD sav_idx,AADD *(AR2),ASTLM A,AR3MVDK sav_grp,AR1group: MVMD AR6,BRCRPTBD bend-1LD *AR4,TMPY *AR3+,AMACR *AR5+0%,*AR3-,AADD *AR
9、2,16,A,BST B,*AR2|SUB *AR2+,BST B,*AR3|MPY *AR3+,AMASR *AR3,*AR4+0%,AADD *AR2,16,A,BST B,*AR3+|SUB *AR2,BLD *AR4,TST B,*AR2+|MPY *AR3+,Abend:PSHM AR0MVDK sav_idx,AR0MAR *AR2+0MAR *AR3+0BANZD group,*AR1-POPM AR0MAR *AR3-LD sav_idx,ASUB #1,A,BSTLM B,AR6STL A,1,sav_idxLD sav_grp,ASTL A,ASM,sav_grpLD sa
10、v_sin,ASTL A,ASM,sav_sinBANZD stage,*AR7-5MVDK sav_sin,AR0STM #DATA+2,AR2STM #DATA+2*N-2,AR3STM #DATA+2*N+3,AR7STM #DATA+4*N-1,AR6STM #-2+N/2,BRCRPTBD p3end-1STM #3,AR0ADD *AR2,*AR3,ASUB *AR2,*AR3,BSTH A,ASM,*AR2+STH A,ASM,*AR3+STH B,ASM,*AR6-NEG BSTH B,ASM,*AR7-ADD *AR2,*AR3,ASUB *AR2,*AR3,BSTH A,A
11、SM,*AR2+STH A,ASM,*AR3-0STH B,ASM,*AR6-NEG BSTH B,ASM,*AR7+0p3end:ST #0,*AR6-ST #0,*AR6p3test:STM #DATA,AR2STM #DATA+1,AR4STM #DATA+2*N+1,AR5ADD *AR2,*AR4,ASUB *AR2,*AR4,BSTH A,ASM,*AR2+ST #0,*AR2MVDD *AR2+,*AR5-STH B,ASM,*AR5STM #DATA+4*N-1,AR3STM #TWI2+512/N,AR4STM #TWI1+512/N,AR5STM #N-2,BRCRPTBD
12、 p4end-1STM #512/N,AR0LD *AR2+,16,AMACR *AR4,*AR2,AMASR *AR5,*AR3-,ALD *AR3+,16,BMASR *AR5+0%,*AR2-,BMASR *AR4+0%,*AR3,BSTH A,ASM,*AR2+STH B,ASM,*AR2+NEG BSTH B,ASM,*AR3-STH A,ASM,*AR3-p4end:power: STM #OUTPUT,AR3 ;AR3 指向输出缓冲地址STM #255,BRC ;块循环计数器设置为 255RPTBD power_end-1 ;带延迟方式的重复执行指令STM #DATA,AR2 ;
13、AR2 指向 AR0SQUR *AR2+,A ;A := AR26SQURA *AR2+,A ;A := AR2 + AI2STH A,7,*AR3 ;将 A 中的数据存入输出缓冲中,ANDM #7FFFH,*AR3+ ;避免输出数据过大在虚拟示波器中显示错误power_end: B power_end.end命令链接文件:/*fft.cmd*/fft.obj-m fft.map-o fft.outMEMORYPAGE 0: ROM(RIX) :origin=8000h,length=1000hROM1 :origin=9000h,length=0200hPAGE 1: B2A(RW) :or
14、igin=0060h,length=10hB2B(RW) :origin=0070h,length=10hINTRAM1(RW) :origin=0400h,length=0200hINTRAM2(RW) :origin=0800h,length=0200h INTRAM3(RW) :origin=1400h,length=0800h OTHER :origin=2000h,length=800hSECTIONS.text : ROM PAGE 0 INPUT : ROM1 PAGE 0 .data : INTRAM3 PAGE 1twiddle1: INTRAM1 PAGE 1twiddle
15、2: INTRAM2 PAGE 1tempv : B2A PAGE 1stack : B2B PAGE 1OUTPUT : OTHER PAGE 1.stack : OTHER PAGE 1三角因子:TWI1: .sect “twiddle1“.int 0,201,402,603.int 804,1005,1206,1407.int 1607,1808,2009,2210.int 2410,2611,2811,3011.int 3211,3411,3611,3811.int 4011,4210,4409,4609 .int 4808,5006,5205,5403.int 5602,5800,5
16、997,6195.int 6392,6589,6786,6983.int 7179,7375,7571,7766.int 7961,8156,8351,8545.int 8739,8933,9126,9319.int 9512,9704,9896,10087.int 10278,10469,10659,10849.int 11039,11228,11416,11605.int 11793,11980,12167,12353.int 12539,12725,12910,13094.int 13278,13462,13645,13828.int 14010,14191,14372,14552.in
17、t 14732,14912,15090,152697.int 15446,15623,15800,15976.int 16151,16325,16499,16673.int 16846,17018,17189,17360.int 17530,17700,17869,18037 .int 18204,18371,18537,18703.int 18868,19032,19195,19358.int 19519,19681,19841,20001.int 20159,20318,20475,20631.int 20787,20942,21097,21250.int 21403,21555,2170
18、6,21856.int 22005,22154,22301,22448.int 22594,22740,22884,23027.int 23170,23312,23453,23593.int 23732,23870,24007,24144.int 24279,24414,24547,24680.int 24812,24943,25073,25201.int 25330,25457,25583,25708.int 25832,25955,26077,26199.int 26319,26438,26557,26674.int 26790,26905,27020,27133.int 27245,27
19、356,27466,27576.int 27684,27791,27897,28002.int 28106,28208,28310,28411.int 28511,28609,28707,28803.int 28898,28993,29086,29178.int 29269,29359,29447,29535.int 29621,29707,29791,29874.int 29956,30037,30117,30196.int 30273,30350,30425,30499.int 30572,30644,30714,30784.int 30852,30919,30985,31050.int
20、31114,31176,31237,31298.int 31357,31414,31471,31526.int 31581,31634,31685,31736.int 31785,31834,31881,31927.int 31971,32015,32057,32098.int 32138,32176,32214,32250.int 32285,32319,32351,32383.int 32413,32442,32469,32496.int 32521,32545,32568,32589.int 32610,32629,32647,32663.int 32679,32693,32706,32
21、718.int 32728,32737,32745,32752.int 32758,32762,32765,32767.int 32767,32767,32765,32762.int 32758,32752,32745,32737.int 32728,32718,32706,32693.int 32679,32663,32647,32629.int 32610,32589,32568,32545.int 32521,32496,32469,32442.int 32413,32383,32351,32319.int 32285,32250,32214,32176.int 32138,32098,
22、32057,32015.int 31971,31927,31881,31834.int 31785,31736,31685,31634.int 31581,31526,31471,31414.int 31357,31298,31237,31176.int 31114,31050,30985,309198.int 30852,30784,30714,30644.int 30572,30499,30425,30350.int 30273,30196,30117,30037.int 29956,29874,29791,29707.int 29621,29535,29447,29359.int 292
23、69,29178,29086,28993.int 28898,28803,28707,28609.int 28511,28411,28310,28208.int 28106,28002,27897,27791.int 27684,27576,27466,27356.int 27245,27133,27020,26905.int 26790,26674,26557,26438.int 26319,26199,26077,25955.int 25832,25708,25583,25457.int 25330,25201,25073,24943.int 24812,24680,24547,24414
24、.int 24279,24144,24007,23870.int 23732,23593,23453,23312.int 23170,23027,22884,22740.int 22594,22448,22301,22154.int 22005,21856,21706,21555.int 21403,21250,21097,20942.int 20787,20631,20475,20318.int 20159,20001,19841,19681.int 19519,19358,19195,19032.int 18868,18703,18537,18371.int 18204,18037,178
25、69,17700.int 17530,17360,17189,17018.int 16846,16673,16499,16325.int 16151,15976,15800,15623.int 15446,15269,15090,14912.int 14732,14552,14372,14191.int 14010,13828,13645,13462.int 13278,13094,12910,12725.int 12539,12353,12167,11980.int 11793,11605,11416,11228.int 11039,10849,10659,10469.int 10278,1
26、0087,9896,9704.int 9512,9319,9126,8933.int 8739,8545,8351,8156.int 7961,7766,7571,7375.int 7179,6983,6786,6589.int 6392,6195,5997,5800.int 5602,5403,5205,5006.int 4808,4609,4409,4210.int 4011,3811,3611,3411.int 3211,3011,2811,2611.int 2410,2210,2009,1808.int 1607,1407,1206,1005.int 804,603,402,201TW
27、I2: .sect “twiddle2“.int 32767,32767,32765,32762.int 32758,32752,32745,32737.int 32728,32718,32706,32693.int 32679,32663,32647,32629.int 32610,32589,32568,32545.int 32521,32496,32469,324429.int 32413,32383,32351,32319.int 32285,32250,32214,32176.int 32138,32098,32057,32015.int 31971,31927,31881,3183
28、4.int 31785,31736,31685,31634.int 31581,31526,31471,31414.int 31357,31298,31237,31176.int 31114,31050,30985,30919.int 30852,30784,30714,30644.int 30572,30499,30425,30350.int 30273,30196,30117,30037.int 29956,29874,29791,29707.int 29621,29535,29447,29359.int 29269,29178,29086,28993.int 28898,28803,28
29、707,28609.int 28511,28411,28310,28208.int 28106,28002,27897,27791.int 27684,27576,27466,27356.int 27245,27133,27020,26905.int 26790,26674,26557,26438.int 26319,26199,26077,25955.int 25832,25708,25583,25457.int 25330,25201,25073,24943.int 24812,24680,24547,24414.int 24279,24144,24007,23870.int 23732,
30、23593,23453,23312.int 23170,23027,22884,22740.int 22594,22448,22301,22154.int 22005,21856,21706,21555.int 21403,21250,21097,20942.int 20787,20631,20475,20318.int 20159,20001,19841,19681.int 19519,19358,19195,19032.int 18868,18703,18537,18371.int 18204,18037,17869,17700.int 17530,17360,17189,17018 .i
31、nt 16846,16673,16499,16325.int 16151,15976,15800,15623.int 15446,15269,15090,14912.int 14732,14552,14372,14191.int 14010,13828,13645,13462.int 13278,13094,12910,12725.int 12539,12353,12167,11980.int 11793,11605,11416,11228.int 11039,10849,10659,10469.int 10278,10087,9896,9704.int 9512,9319,9126,8933
32、.int 8739,8545,8351,8156.int 7961,7766,7571,7375.int 7179,6983,6786,6589.int 6392,6195,5997,5800.int 5602,5403,5205,5006.int 4808,4609,4409,4210.int 4011,3811,3611,3411.int 3211,3011,2811,2611.int 2410,2210,2009,1808.int 1607,1407,1206,1005.int 804,603,402,20110.int 0,201,-402,-603.int -804,-1005,-1
33、206,-1407.int -1607,-1808,-2009,-2210.int -2410,-2611,-2811,-3011.int -3211,-3411,-3611,-3811.int -4011,-4210,-4409,-4609.int -4808,-5006,-5205,-5403.int -5602,-5800,-5997,-6195.int -6392,-6589,-6786,-6983.int -7179,-7375,-7571,-7766.int -7961,-8156,-8351,-8545.int -8739,-8933,-9126,-9319.int -9512,
34、-9704,-9896,-10087.int -10278,-10469,-10659,-10849.int -11039,-11228,-11416,-11605.int -11793,-11980,-12167,-12353.int -12539,-12725,-12910,-13094.int -13278,-13462,-13645,-13828.int -14010,-14191,-14372,-14552.int -14732,-14912,-15090,-15269.int -15446,-15623,-15800,-15976.int -16151,-16325,-16499,
35、-16673.int -16846,-17018,-17189,-17360.int -17530,-17700,-17869,-18037.int -18204,-18371,-18537,-18703.int -18868,-19032,-19195,-19358.int -19519,-19681,-19841,-20001.int -20159,-20318,-20475,-20631.int -20787,-20942,-21097,-21250.int -21403,-21555,-21706,-21856.int -22005,-22154,-22301,-22448.int -
36、22594,-22740,-22884,-23027.int -23170,-23312,-23453,-23593.int -23732,-23870,-24007,-24144.int -24279,-24414,-24547,-24680.int -24812,-24943,-25073,-25201.int -25330,-25457,-25583,-25708.int -25832,-25955,-26077,-26199.int -26319,-26438,-26557,-26674.int -26790,-26905,-27020,-27133.int -27245,-27356
37、,-27466,-27576.int -27684,-27791,-27897,-28002.int -28106,-28208,-28310,-28411.int -28511,-28609,-28707,-28803.int -28898,-28993,-29086,-29178.int -29269,-29359,-29447,-29535.int -29621,-29707,-29791,-29874.int -29956,-30037,-30117,-30196.int -30273,-30350,-30425,-30499.int -30572,-30644,-30714,-307
38、84.int -30852,-30919,-30985,-31050.int -31114,-31176,-31237,-31298.int -31357,-31414,-31471,-31526.int -31581,-31634,-31685,-31736.int -31785,-31834,-31881,-31927.int -31971,-32015,-32057,-32098.int -32138,-32176,-32214,-32250.int -32285,-32319,-32351,-3238311.int -32413,-32442,-32469,-32496.int -32
39、521,-32545,-32568,-32589.int -32610,-32629,-32647,-32663.int -32679,-32693,-32706,-32718.int -32728,-32737,-32745,-32752.int -32758,-32762,-32765,-32767产生 fft.inc 输入文件:#include #include void main()int i;double f256;FILE *fp;if(fp=fopen(“fft.inc“,“wt“)=NULL)printf(“cant open file! n“);return;fprintf(
40、fp,“INPUT: .sect %cINPUT %cn“,“,“);for(i=0;i=255;i+)%fi=sin(2*3.14159*i*4000/16000)+sin(2*3.14159*i*6500/16000);fprintf(fp,“ .word %1dn“,(long)(fi*32768/2);fclose(fp); 该程序将产生名为 fft.inc 的输入信号程序,编译链接后装入 fft.out 文件,然后运行程序。3.查看输入数据的波形和频谱。由链接命令文件可知,输入信号放在程序存储区 0x9000 开始的 256 个单元中,经程序计算得到的信号功率谱放在数据存储区 0x2
41、000 开始的 256 个单元中。在 CCS 中选择 ViewGraphTime/Frequency 命令,选择程序存储器区 0x9000 开始的 256 个单元,Display 分别选择 Single Time 和 FFT Magnitude,就可得到信号时域图和频谱图,如图 5.2 和图 5.3 所示。图 5.2 输入信号时域波形12图 5.3 输入信号频谱图4、查看 FFT 的结果,将起始地址改为 0x2000,page 项改为 data,Sampling Rate 改为1,如图 5.4 所示。图 5.4 信号图形特性设置对话框得到 FFT 的结果如图 5.5 所示:图 5.5 输入信号功率谱(FFT 程序运行得到的结果图)四、实验仪器设备.计算机.DES-320PPA 教学实验系统13五、思考题.如何对正弦信号进行 FFT 运算。写在实验报告中。提示:产生输入信号方法,用 C 语言程序产生 mdata.inc 文件(其产生方法用 IIR 滤波器设计实验中 C 语言即可。),然后,在 DSP 汇编语言程序中通过.copy 汇编命令将生成的数据文件 mdata.inc 复制到汇编程序中,数据起始地址标号为 INPUT,段名为 INPUT。