快速傅立叶变换FFT算法实验_第1页
快速傅立叶变换FFT算法实验_第2页
快速傅立叶变换FFT算法实验_第3页
快速傅立叶变换FFT算法实验_第4页
快速傅立叶变换FFT算法实验_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. 快速傅立叶变换(FFT)算法实验实验目的:1. 加深对DFT 算法原理和基本性质的理解;2. 熟悉FFT 的算法原理和FFT 子程序的算法流程和应用;3. 学习用FFT 对连续信号和时域信号进行频谱分析的方法。程序流程图:傅立叶变换是一种将信号从时域到频域的变换形式,是声学、语音、电信和信号处理等领域中的一种重要分析工具。离散傅立叶变换(DFT)是连续傅立叶变换在离散系统中的表现形式,由于DFT 的计算量很大,因此在很长时间内其应用受到很大的限制。快速傅立叶变换(FFT)是离散傅立叶变换的一种高效运算方法。由于我们在计算DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需

2、二次实数加法。运算一个X(k)需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。所以整个DFT运算总共需要4N2 次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。如此一来,计算时乘法次数和加法次数都是和N2 成正比的,当N 很大时,运算量是可观的,因而需要改进对DFT 的算法减少运算速度。我们可以将DFT 运算中有些项合并。我们先设序列长度为N=2L,L 为整数。将N=2L 的序列x(n)(n=0,1,,N-1),按N的奇偶分成两组,也就是说我们将一个N 点的DFT 分解成两个N/2 点的DFT,他们又重新组合成一个如下式所表达的N 点DFT:一般来说,输入被假定

3、为连续的。当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算DFT。这样的RFFT 优化算法是包装算法:首先2N 点实数的连续输入称为“进包”。其次N 点的FFT 被连续运行。最后作为结果产生的N 点的合成输出是“打开”成为最初的与DFT 相符合的2N 点输入。使用这一思想,我们可以划分FFT 的大小,它有一半花费在包装输入O(N)的操作和打开输出上。AD原理图源程序*include<math.h>*include"DSP2833x_Device.h"/ DSP2833x Headerfile Include File*include"D

4、SP2833x_Examples.h"/ DSP2833x Examples Include Fi*include"comm.h"*include"i_cmplx.h"*include"ext_inf.h"/*/*if (CPU_FRQ_150MHZ) / Default - 150 MHz SYSCLKOUT*define ADC_MODCLK 0x3 / HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz*endif*if (CPU_FRQ_100MHZ)*de

5、fine ADC_MODCLK 0x2 / HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz*endif*define ADC_CKPS 0x1 / ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz*define ADC_SHCLK 0xf / S/H width in ADC module periods = 16 ADC clocks*define AVG 1000 / Average sample limit*define ZOFFSET 0x00 /

6、 Average Zero offset*define BUF_SIZE 160 / Sample buffer size/*/unsignedint SampleLong;*define SAMPLELONG 3/unsignedint Ad_data1536=0;unsignedint Ad_data11536=0;unsignedint convcount = 0;volatileunsignedint adconvover =0;/int m=0;double n;double p,q;COMPLEX DDataBuffer512=0;Uint32 mod512;/unsignedin

7、t i;/*/ Prototype statements for functions found within this erruptvoidadc_isr(void);/*/voidmain(void)*if SAMPLELONG=1SampleLong =256;*endif*if SAMPLELONG=2SampleLong =512;*endif*if SAMPLELONG=3SampleLong =1024;*endif/ Step 1. Initialize System Control:/ PLL, WatchDog, enable Peripheral Cloc

8、ks/ This example function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl();/ Step 2. Initialize GPIO:/ This example function is found in the DSP2833x_Gpio.c file and/ illustrates how to set the GPIO to it's default state. InitGpio(); / Skipped for this example/ Step 3. Clear all interrupts

9、 and initialize PIE vector table:/ Disable CPU interrupts DINT;/ Initialize the PIE control registers to their default state./ The default state is all PIE interrupts disabled and flags/ are cleared./ This function is found in the DSP2833x_PieCtrl.c file. InitPieCtrl();/ Disable CPU interrupts and c

10、lear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;/ Initialize the PIE vector table with pointers to the shell Interrupt/ Service Routines (ISR)./ This will populate the entire table, even if the interrupt/ is not used in this example. This is useful for debug purposes./ The shell ISR routine

11、s are found in DSP2833x_DefaultIsr.c./ This function is found in DSP2833x_PieVect.c. InitPieVectTable();/ Interrupts that are used in this example are re-mapped to/ ISR functions found within this file. EALLOW; / This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr

12、; EDIS; / This is needed to disable write to EALLOW protected registers/ Step 4. Initialize all the Device Peripherals:/ This function is found in DSP2833x_InitPeripherals.c/ InitPeripherals(); / Not required for this example InitAdc(); / For this example, init the ADC/ Step 5. User specific code, e

13、nable interrupts:/ Enable ADCINT in PIE PieCtrlRegs.PIEIER1.bit.INTx6 = 1; IER |= M_INT1; / Enable CPU Interrupt 1 EINT; / Enable Global interrupt INTM ERTM; / Enable Global realtime interrupt DBGM AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; AdcRegs.ADCTRL1.bit.S

14、EQ_CASC = 1; / 0 Non-Cascaded Mode; 1 Cascaded Mode AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1; AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x6; AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 15; AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1 ; for(;)if (adconvover=1)for(i=0;i<(SampleLong/2);i+)DDa

15、taBufferi.real=Ad_data2*i; /short int DDataBufferi.imag=Ad_data2*i+1; /short intswitch(SampleLong)case 256:/*256 point*/ fft256(DDataBuffer,256); m=0;for(i=0;i<128;i+) p=DDataBufferi.real; q=DDataBufferi.imag; n=(long)p*(long)p+(long)q*(long)q; modm=sqrt(n); m+; break;case 512: /*512 point*/ fft5

16、12(DDataBuffer,512); m=0;for(i=0;i<256;i+) p=DDataBufferi.real; q=DDataBufferi.imag; n=(long)p*(long)p+(long)q*(long)q; modm=sqrt(n); m+; break;case 1024: /*1024 point*/ fft1024(DDataBuffer,1024); m=0;for(i=0;i<512;i+) p=DDataBufferi.real; q=DDataBufferi.imag; n=(long)p*(long)p+(long)q*(long)q; modm=sqrt(n); m+; break; adconvover=0; convcount =0; interruptvoidadc_isr(void)/ If 40 conversions have been logged, start overif(convcount = SampleLong) adconvover = 1; else Ad_dataconvcount = AdcRegs.ADCRESULT0 >>4; convcou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论