基于dsp的快速傅里叶变换程序设计(3)
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字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [幼儿教育]【完整版】2019-2025年中国药物发现外
- [幼儿教育]2018-2019年初中信息技术广东初一竞赛
- [幼儿教育]最新外研版(一起)小学英语五年级上册《
- [幼儿教育]农业推广与创新管理专业 -中农大毕业论
- [幼儿教育]2017-2022年中国更年期用药行业市场深
- [幼儿教育]数学1.1.2第1课时棱柱、棱锥和棱台的结
- [幼儿教育]二年级群文阅读课例欣赏
- [幼儿教育]2010-2015年中国保险行业投资分析及深
- [幼儿教育]厄运打不垮的信念第一课时
- [幼儿教育]巧用文本,让表达在言语中绽放论文
- [幼儿教育]中学生百科知识竞赛题及答案
- [幼儿教育]八大菜系英文简介
- [幼儿教育]中国男装牛仔裤市场发展研究及投资前景
- [幼儿教育]远程数字视频监控系统在银行的应用
- [幼儿教育]光纤光缆制造工艺及设备
- [幼儿教育]国家安全法试题及答案
- [幼儿教育]2011高中提前招生及竞赛试题(物理卷1)
- [幼儿教育]宁夏第三产业房地产业、科学研究和技术
- [幼儿教育]中兴通讯 ME3000模块用户硬件设计手册_
- [幼儿教育]紫外线灯管的辐照强度问题
- 苏联东欧剧变的原因和历史教训浅析
- 人工智能导论实验报告(学生)
- 思科ITE章考试原题及答案
- 《学习雷锋好榜样》主题班会教案
- 加油站建设项目安全评价报告
- 剖析社保卡管理系统
- 2017-2018年影视剧新媒体版权运营行业
- 2017-2018学年四川省成都市高一上学期
- 2019最新高中数学 第三章 3.2.1 几类不
- 2011-2015年中国基酸市场调查及行业前
- 人教版新课标选修八Unit 1 课件Warming
- 郭溪燎原小学辅导学生记录表
- 教师资格证统考综合素质写作秘笈
- 国外校园绿色建筑研究方向与建设实践
- 15.1 动物运动的方式 课件(北师大版八
- 民用飞机空调系统
- 长安侠文化传统与唐诗的任侠主题
- 《中国近现代史纲要》名词解释
- 11金本《保险学概论》复习资料
- 民用建筑机电安装工程专业施工图图纸会




