关键词不能为空

当前您在: 主页 > 英语 >

FFT的定点DSP实现

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-10-31 19:54
tags:6270

幽径-聪明的英文smart

2020年10月31日发(作者:巢敬)


1 引言

CCS(Code Composer Stu dio)是TI公司的DSP集成开发环境。它提供了
环境配置、源文件编辑、程序调试、跟踪和分析等 工具,帮助用户在一个软件环
境下完成编辑、编译链接、调试和数据分析等工作。与TI提供的早期软件 开发
工具相比,利用CCS能够加快软件开发进程,提高工作效率。CCS一般工作在两种
模式 下:软件仿真器和与硬件开发板相结合的在线编程。前者可以脱离DSP芯片,
在PC机上模拟DSP指 令集与工作机制,主要用于前期算法实现和调试。后者实时
运行在DSP芯片上,可以在线编制和调试应 用程序。

2 C语言和汇编语言的混合编程

TMS320 C5000系列的软件设计通常有三种方法:

(1) 用C语言开发;

(2) 用汇编语言开发;

(3) C和汇编的混合开发。

其中用C语言开发具有兼容性和可移植的优 点,有利于缩短开发周期和
减少开发难度,但是在运算量较大的情况下,C代码的效率还是无法和手工编 写的
汇编代码的效率相比,比如FFT运算,用汇编语言开发的效率高,程序执行速度快,
而且 可以合理利用芯片的硬件资源,但是开发难度较大,开发周期长,而且可读性
和可移植性差。C和汇编的 混合编程则可以充分利用前两者的优点,以达到最佳
利用DSP资源的目的。但是,采用C和汇编语言混 合编程必须遵循相关函数调用
规则和寄存器调用规则,否则会给程序的开发带来意想不到的问题。

2.1 C语言和汇编语言混合编程的四种方法

(1) 独立编写汇编程序和C程序,分开编译或汇编成各自的目标代码模
块,再用链接器将二者链接起 来。这种方法比较灵活,但是设计者必须自己维护各
汇编模块的入口和出口代码,自己计算传递的参数在 堆栈中的偏移量,工作量较
大,但是能做到对程序的绝对控制。

(2) 在C程序中使用汇编程序中定义的变量和常数。

(3) 在C程序 中内嵌汇编语句。这种方法可以实现C语言无法实现的一
些硬件控制功能,如修改中断控制寄存器。

(4) 将C语言编译生成相应的汇编代码,手工修改和优化C编译器生成的
汇编代码。采用这种方法可以控制C编译器,从而产生具有交叉列表的汇编程序,
而设计者可以 对其中的汇编语句进行修改,然后对汇编程序进行编译,产生目标
文件。



后3种方法由于在C中直接嵌入了汇编语言,易造成程序混乱,破坏C环境,
甚 至导致程序崩溃,而开发者又很难对不良结果进行预期和有效控制。而如果采
用第一种方法,只要遵循有 关C语言函数调用规则和寄存器规则,就能预见到程
序运行的结果,保证程序正确。

2.2 编程注意事项

C编译器对函数调用制定 了一组严格的规则。除了特殊的运行时间支持
库函数外,任何调用函数和被C函数调用的函数都必须遵守 这些规则。结合作者
在编程中的实际情况和切身体会,提出在编程时要注意以下几点:

(1) 必须保护任何被函数修正的专用寄存器。这些专用寄存器包
括:AR1 ,AR6,AR72和堆栈指针(SP)。其中,如果对SP正常使用,则不必明显的保
存。换句话说, 只要汇编函数在调用返回时弹出压入的对象,实际上就已经保护了
SP。

(2) 中断函数必须保存其使用的所有寄存器。

(3) 从汇编函数中调 用C函数时,第一个参数(最左边的)必须放入累加
器A中,剩下的参数按照自右向左的顺序压入堆栈。

(4) 如果函数有返回值,则返回值存放在累加器A中。

(5) 调用C函数时,注意C函数只保护了几个特定的寄存器,对于其他寄
存器C函数是可以自由使用的。

(6) 长整数和浮点数存储在存储器中的方法是最高有效字在低位地址。

(7) 汇编语言模块不能改变由C模块产生的.cinit段,如果改变其中的
内容将会引起不可预测的后果。

(8) 在汇编语言模块中,对可以从C中访问的变量和函数名需加上前缀< br>“_”。对于仅用于汇编语言模块中的标识符,不用加下划线。而且如果仅在汇编中
使用,只要不 加下划线,即使与C程序中定义的对象名相同,也不会造成冲突。

(9) 任何在汇编语言模块中声明的将要从C访问或调用的对象或函数,
都必须在汇编语言中用.global 伪指令声明为全局变量。同样,任何在C程序中
定义而将在汇编中访问或调用的对象或函数,在汇编中也 必须用.global声明。

(10) 在默认的情况下,编译器总是认为 CPL为1。因此,若在汇编程序中
将CPL清0,则在返回C环境时,必须将其恢复为1;在默认的情 况下,编译器总是认
为 OVM为0。因此,若在汇编程序中将OVM置为1,则返回C环境时,必须将 其恢复
为0;ARP在函数进入和返回时,必须为0,即当前辅助寄存器为AR0。函数执行时可


以为其他值。
3 编程实例

3.1 FFT算法简介

FFT是一种高效实现离散傅立叶变换的算法, 在数字信号处理系统中,FFT
作为一个非常重要的工具,甚至成为DSP运算能力的一个考核因素。如 何将FFT
算法很好的应用到DSP系统中对于DSP系统的设计具有重要的意义。

一个优化的实数FFT算法是一个组合以后的算法。该算法主要分为以下
几步, 首先将输入的2N点实序列进行位倒序组合成一个N点的复序列,之后对复
序列进行N 点的FFT运算 ,最后再由N点的复数输出拆散成2N点的复数序列,这
2N点的复数序列与原始的2N点的实数输入序 列的DFT输出一致。(详细的算法介
绍可参考相关信号处理书籍)。

3.2 C主程序

#include
extern void fft(); FFT运算函数
int DisData[256]; 输出结果
int SimData[256]={
0,6270,11585,15137, 16384, 15137, 11585,6270,
0, -6270, -11585,-15137,-16384,-15137,-11585,-6270,
……
0,6270,11585,15137,16384,15137,11585,6270,
0,-6270,-11585,-15137,-16384,-15137,-11585,-6270
};
输入数据
int main()
{
rfft();
调用FFT函数
while(1)
}

本程序中FFT运算所用到的数据是通过matlab仿真产生的,然后通过 全
局数组进行传值,这种方式的优点是数据的通用性强,方便对数据进行其他相关
处理; 也可 通过其他C程序产生然后保存到一个文本文件中,再由汇编程序将该
数据文件拷到数据存储器中参与FF T运算。这种方式的优点是程序的可读性强,
缺点是当输入数据修改后,必须进行重新编译、汇编和链接 。

3.3 汇编程序

.mmregs


.global sav_sin,sav_idx,sav_grp,_rFFT,_DisData
.data
DATA .space 1024 数据缓冲区
INPUT .set 0x9000 输入数据起始地址
N .set 128 复数点数
LOGN .set 7 碟形运算级数
sav_grp .usect 定义组变量值
sav_sin .set sav_grp+1 定义旋转因子表
sav_idx .set sav_grp+2
.copy 正弦表系数
.copy 余弦表系数
.text
_rfft:
SSBX TC
SSBX C
RSBX OVA
RSBX OVB
LD #0,DP
RSBX CPL
SSBX XF
SSBX SXM
LD #00,ASM
SSBX FRCT
……

本程序主要是对输入的256点实数作FFT运算,通过修改N和LOGN可 以完
成16-1024点的FFT运算。在编写汇编程序的时候要注意以下几个方面:

(1) 由于采用循环寻址来对旋转因子表寻址,因此每张表的开始地址必
须是 10个LSB位为0的地址。如:正弦表系数可以放在0400h开始的地址,余弦表
系数可以放在08 00h开始的地址;

(2) 在汇编程序的入口处要注意设置好汇编程序所 需要的运行环境(见
前述程序),如果此处按照编译器默认的环境将得不到正确的结果。详细的汇编程< br>序可参考TI公司提供的例程。

3.4 运算结果

输入正弦信号的频率为f=16Hz,幅值为1(单位),采样长度为2N=256点,
采样频率为fs=256Hz。CCS提供了很多方法将程序产生的数据画图显示,包括时
域频 域波形显示等。可通过查看相关图像来检验FFT运算的正确性。由链接命
令文件可以知道输入信号存储 在程序存储区0900h开始的256 个单元中,经程序
计算得到的信号幅值谱存放在数据存储区02 00h开始的256个单元中。在CCS中
选择View——>Graph——> TimeFrequency命令,相关设置可参考图1:



图1 FFT运算结果查看选项设置参考

输入信号的时域波形见图2。

点击看原图



图2
输入信号的时域波形


; 经FFT运算后得到的信号幅值谱图见图3。



点击看原图


图3 信
号幅值谱图

将输入信号通过Matlab仿真进行验证。输入信号的时域波形见图4。



点击看原图


图4 输入信
号的时域波形

经FFT运算后得到的信号幅值谱图见图5。



点击看原图


图5 信号幅值谱图

通过比较CCS中的输出图形和Matlab中的仿真输出图形, 可以看到二者
是一致的,说明本程序的结果是正确的。

4 结束语

本文通过实例,说明了TMS320 C5000系列DSP芯片的 混合编程方法,利用
混合编程达到了提高程序的可读性与编程效率的目的,是开发DSP软件的常用方< br>法。本文介绍的混合编程方法不但适用于TI C5000系列DSP芯片,同样也适用于
TI其 他系列的DSP芯片,如C2000系列、C6000系列,甚至对其他芯片,如51系列单
片机等,实 现混合编程也有很大参考价值。

灵敏的意思是什么-flavored


balcony的复数-主观题是什么题型


外关-价钱牌


同事-problem是什么意思中文


卫星的英文-硝酸铵的用途


方小叶-碎冰锥


防尘面具-horseshoe


锌和稀盐酸的化学方程式-fcl



本文更新与2020-10-31 19:54,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/435734.html

FFT的定点DSP实现的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文