教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 幼儿教育 >

基于dsp的快速傅里叶变换程序设计(3)

来源:网络收集 时间:2026-04-09
导读: 4.6 按时间抽取法的FFT程序 void FFT(float Xr[N],float Xi[N]) //时间抽取法FFT程序,要求采样 //点数N为2的整数幂次方 { //Xr[],Xi[]分别为输入序列的实 //部和虚部 int S,B; //S为旋转因子的幂数,B为蝶形运算

4.6 按时间抽取法的FFT程序

void FFT(float Xr[N],float Xi[N]) //时间抽取法FFT程序,要求采样 //点数N为2的整数幂次方

{ //Xr[],Xi[]分别为输入序列的实 //部和虚部

int S,B; //S为旋转因子的幂数,B为蝶形运算输入数据的距离,也即各 //旋转因子的个数 int m,j,k; float X,Y;

finv(N,Xr,Xi); //倒序运算函数,对输入序列倒序 for(m=1;m<=Mum;m++) {

B=(int)(pow(2,m-1)+0.5); //B=2^(m-1)

for(j=0;j<B;j++) //每级需要进行B种蝶形运算 {S=j*(int)(pow(2,Mum-m)+0.5);

for(k=j;k<=N-1;k+=(int)(pow(2,m)+0.5))

{ //结果的实部和虚部分别存储在原实部和虚部位置 X=Xr[k+B]*cos_tab[S]+Xi[k+B]*sin_tab[S]; Y=Xi[k+B]*cos_tab[S]-Xr[k+B]*sin_tab[S]; Xr[k+B]=Xr[k]-X; Xi[k+B]=Xi[k]-Y; Xr[k]=Xr[k]+X; Xi[k]=Xi[k]+Y; } } }

在这个时间抽取法FFT程序中,要求采样点数N为2的整数幂次方,每级需要进行B种蝶形运算,每种蝶形运算在某一级中需要进行N/pow(2,m)次蝶形运算,结果的实部和虚部分别存储在原实部和虚部位置。

本文基于合众达的dsp试验箱,采集实验箱上信号发生器产生的信号,并对信号进行fft变换,通过ccs观察结果。

对于任何一个2的整数幂N=2M,总是可以通过M次分解最后完全成为2点的DFT运算。这样的M次分解,就构成从x(n)到X(k)的M级运算过程。从上面的 流图可看到,每一级运算都由N/2个蝶形运算构成。因此每一级运算都需要次

复乘和N次复加(每个结作加、减各一次),这样,经过时间抽取后M级运算总共需要的运算: 复乘 复加 N

当然,实际情况与这个数字稍有出入,因为

这几个系数实际上都不用乘法运算,因此在上面N=8的例子中,实际上只有两个系数W 及W 是需要乘法运算的。用时间抽取法所需的计算量,不论是复乘

2

还是复加都与Nlog2N成正比,而直接运算时则与N成正比。

例N=2048,N=4194304,(N/2)log2N=11264,N/[(N/2)log2N]=392.4倍。FFT显然要比直接法快得多。

2

2

4.7 功率谱的计算实现

for(m=0;m<N/2;m++) {

w[m]=sqrt(Xr[m]*Xr[m]+Xi[m]*Xi[m]); //计算功率谱 }

为了便于观察FFT的运算结果,需要求出信号的频谱。经过第三级到最后一级蝶形运算之后,已经得到式(4-2)所示: A(k) AR(k )

A(I k) j

(4-2)

故功率谱可以通过式(4-3)计算得到:

(4-3)

通过软件仿真,可以观察到输入信号的时间波形和频谱波形以及输出信号的功率谱波形。

4.8 倒序运算函数

void finv(int N1,float *xr,float *xi) { int m,n,N2,k; //m为正序数;n为倒序数;k为各个权值;N2为最高位的权值

本文基于合众达的dsp试验箱,采集实验箱上信号发生器产生的信号,并对信号进行fft变换,通过ccs观察结果。

float T; //临时变量T

N2=N1/2; //最高位加1相当于十进制加上最高位的权N1/2 n=N2; //第一个倒序值

for(m=1;m<=N1-2;m++) //第0个和最后一个不倒序 {

if(m<n) //为了避免再次调换,只需对m<n的部分调换顺序 {

T=xr[m];xr[m]=xr[n];xr[n]=T; T=xi[m];xi[m]=xi[n];xi[n]=T; }

k=N2; //最高位权值 while(n>=k) {

n=n-k; //次高位位1,继续上下进位,满2置0 k=(int)(k/2+0.5); //向下权值依次比上级减半 }

n=n+k; //得到下一倒序值 } }

倒序运算函数finv(N1,Xr,Xi),对输入序列倒序,N1为序列长度,Xr[],Xi[]分别为输入序列的实部和虚部。

倒序原理:倒序数的加1是在最高位加1,满2向次高位进1,最高位变0,依次往下。

从当前倒序值可求下一倒序值。

4.9 定时器2

中断子程序及AD转换子程序

interrupt void ad(void) {

IFR=0x0000; //CPU级中断标志寄存器IFR=0,即无CPU级中断请求 PieCtrl.PIEACK.all=0xffff;//PIEACK置1,禁止外部中断向CPU发起中断 //请求 if(adconvover==0){

Ad_data[convcount] = AdcRegs.RESULT0; // 将结果寄存器中的AD //转换结果放到Ad_data数组中 convcount++; //convcount的初始值为0 }

if (convcount==(128)) //即convcount=128,即Ad_data包含采样值的最 //后一位为Ad_data[128] {

convcount=0;

adconvover=1;//接满标志 ,即AD采样结束

…… 此处隐藏:487字,全部文档内容请下载后查看。喜欢就下载吧 ……
基于dsp的快速傅里叶变换程序设计(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/38474.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)