您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第31章ARM官方DSP库-复数FFT的逆变换实现
安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第11页页共共99页页安安富富莱莱SSTTMM3322--VV55开开发发板板数数字字信信号号处处理理教教程程文档版本:V1.0安安富富莱莱电电子子日日版版本本::11..00第第22页页共共99页页声声明明本本文文档档的的版版权权归归武武汉汉安安富富莱莱电电子子有有限限公公司司所所有有。。任任何何公公司司或或者者个个人人未未经经许许可可,,不不得得将将本本文文档档用用于于商商业业目目的的。。本本文文档档由由安安富富莱莱电电子子原原创创,,非非我我们们原原创创的的资资料料已已经经在在章章节节的的开开头头进进行行申申明明((特特别别是是FFFFTT部部分分))。。教教程程中中使使用用的的DDSSPP库库是是来来自自AARRMM公公司司。。教教程程参参考考资资料料如如下下::CCoorrtteexx--MM44权权威威指指南南。。数数字字信信号号处处理理理理论论、、算算法法与与实实现现第第二二版版((作作者者::胡胡广广书书))。。信信号号与与系系统统第第二二版版((作作者者::奥奥本本海海姆姆))。。MMaattllaabb的的hheellpp文文档档。。力力科科示示波波器器基基础础应应用用系系列列文文档档。。百百度度百百科科,,wwiikkii百百科科。。网网络络资资源源。。SSTT官官方方相相关关文文档档。。安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第33页页共共99页页第第3311章章复复数数FFFFTT的的逆逆变变换换实实现现本章主要讲解复数FFT的逆变换。本章节使用的复数FFT函数来自ARM官方库的TransformFunctions部分31.1复数FFT的逆变换实现31.2总结3311..11复复数数FFFFTT的的逆逆变变换换实实现现本小节主要讲解复数FFT的逆变换实现,通过函数arm_cfft_f32实现浮点数的逆变换。3311..11..11aarrmm__ccfffftt__ff3322逆逆变变换换函数定义如下:voidarm_cfft_f32(constarm_cfft_instance_f32*S,float32_t*p1,uint8_tifftFlag,uint8_tbitReverseFlag)参数定义:[in]*Spointstoaninstanceofthefloating-pointCFFTstructure.[in,out]*p1pointstothecomplexdatabufferofsizecode2*fftLen/code.Processingoccursin-place.[in]ifftFlagflagthatselectsforward(ifftFlag=0)orinverse(ifftFlag=1)transform.[in]bitReverseFlagflagthatenables(bitReverseFlag=1)ordisables(bitReverseFlag=0)bitreversalofoutput.注意事项:结构constarm_cfft_instance_f32的定义如下(在文件arm_math.h文件):typedefstruct{uint16_tfftLen;constfloat32_t*pTwiddle;安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第44页页共共99页页constuint16_t*pBitRevTable;uint16_tbitRevLength;}arm_cfft_instance_f32;下面通过函数arm_cfft_f32计算一个正弦波的FFT,然后再使用函数arm_cfft_f32做FFT逆变换,并使用Matlab计算变换前后的结果对比。/***********************************************************************************************************函数名:arm_cfft_f32_app*功能说明:调用函数arm_cfft_f32_app计算CFFT正变换和你变换。*形参:无*返回值:无**********************************************************************************************************/staticvoidarm_cfft_f32_app(void){uint16_ti;fftSize=1024;ifftFlag=0;doBitReverse=1;/*按照实部,虚部,实部,虚部.....的顺序存储数据*/for(i=0;i1024;i++){testInput_f32_10khz[i*2+1]=0;/*50Hz正弦波,采样率1KHz*/testInput_f32_10khz[i*2]=arm_sin_f32(2*3.1415926f*50*i/1000);printf(%f\r\n,testInput_f32_10khz[i*2]);}/*CFFT变换:FFT正变换*/arm_cfft_f32(&arm_cfft_sR_f32_len1024,testInput_f32_10khz,ifftFlag,doBitReverse);ifftFlag=1;/*CFFT变换:FFT逆变换*/arm_cfft_f32(&arm_cfft_sR_f32_len1024,testInput_f32_10khz,ifftFlag,doBitReverse);printf(****************************分割线***************************************\r\n);/*串口打印求解的模值*/for(i=0;i1024;i++){printf(%f\r\n,testInput_f32_10khz[i*2]);}}运行如上函数可以通过串口打印出原始正弦波和经过CFFT,CIFFT的正弦波,下面我们就通过Matlab对比变换前和变换后的波形。对比前需要先将串口打印出的两组数据加载到Matlab中,并给原始正弦波起名signal,变换后的数组起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:Fs=1000;%采样率N=1024;%采样点数安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第55页页共共99页页n=0:N-1;%采样序列f=n*Fs/N;%真实的频率subplot(2,1,1);plot(f,signal);%绘制原始信号title('原始信号');xlabel('时间');ylabel('幅值');subplot(2,1,2);plot(f,sampledata);%绘制CFFT和CIFFT后的信号title('CFFT和CIFFT后的信号');xlabel('时间');ylabel('幅值');Matlab运行的结果如下:波形前端部分:01002003004005006007008009001000-1-0.500.51CFFT和CIFFT后的信号时间幅值01002003004005006007008009001000-1-0.500.51原始信号时间幅值安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第66页页共共99页页波形后端部分:0102030405060-1-0.500.51CFFT和CIFFT后的信号时间幅值05101520253035404550-0.500.51原始信号时间幅值9509609709809901000-1-0.500.5CFFT和CIFFT后的信号时间幅值9509609709809901000-0.500.51原始信号时间幅值安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第77页页共共99页页从上面的对比结果中可以看出,函数arm_cfft_f32计算前后的正弦波基本是一致的。3311..22总总结结本章节内容较少,主要验证了函数arm_cfft_f32正变换和逆变换,有兴趣的可以验证Q31和Q15两种数据类型的正变换和逆变换。安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第88页页共共99页页安安富富莱莱电电子子UUMM440033日日版版本本::11..00第第99页页共共99页页
本文标题:第31章ARM官方DSP库-复数FFT的逆变换实现
链接地址:https://www.777doc.com/doc-5072129 .html