第七章工程问题的DSP实现(一)DTMF的编解码用DSP实现双音多频(DTMF)的拨号产生和解码。DTMFDual-ToneMultipleFrequency实现步骤对象分析算法设计DSP选择系统设计系统实现系统调试对象分析对所要开发的系统的功能、性能要有深入的了解和分析,尤其对技术指标,要作透彻的理解和把握。DTMF用一对频率(行频/列频)来表示一个符号(电话键盘上的0—9,A—D,*,#,共16个符号)一次按键的时间是100ms,其中,频率对存在的时间是45ms,不允许超过55ms,其余的时间是静音。CCITT关于DTMF的指标Lowband:697、770、852、941(Hz)RBW3.5%Highband:1209、1336、1477、1633(Hz)RBW3.5%TWIST:STD4dBREV8dBDYNRANGE:25dBGUARDTIME:MINTONETIME45msSNR:NOISE-24dBV算法设计算法设计是非常关键的步骤,因为算法决定运算量和存储器的大小,从而决定DSP的选择,进而决定系统的设计,包括硬件和软件的设计。DTMF拨号的产生基于DSP的DTMF的音频信号发生器,使用两个二阶的数字正弦波振荡器,一个产生行频,一个产生列频。DTMF发生器的系数和初始条件DTMF发生器的信号流程音频检测Goertzel算法是DTMF解码器的基础,实际上是一个两极点的IIR滤波器。DFT或FFT需要在处理之前准备好一个数据块,而Goertzel算法是一个递归的结构,就每个输入的样本进行计算。Goertzel算法Goertzel算法的特点Goertzel算法的IIR滤波器结构涉及两个复共轭极点,但对于实际的DTMF音频检测,只要有幅度信息就够了(实际上使用幅度平方),从而简化为只需要一个实系数参与计算。Goertzel算法要比FFT快得多,因为只需要提供8个行/列频和它们的二次谐波的信息(二次谐波的信息用于将DTMF与话音或音乐区别开来)。行频/列频及相应的系数有效性检查信号强度DTMF行频、列频信号之和的强度是否达到一定的门限值有效性检查扭曲度•标准扭曲:行频峰值列频峰值4dB•反向扭曲:列频峰值行频峰值8dB有效性检查二次谐波强度以便将DTMF信号与其他语音信号、音乐信号等区别开来。有效性检查数字信息的稳定性如果一个数字成功地检测到两次,认为该数字是稳定的有效性检查数字信息的有效性检测到的数字前面必须是静音符时,该数字才是有效的,以便将各次击键区别开来编码器对速度和存储器的要求解码器对速度和存储器的要求DSP芯片选择算法对DSP芯片计算速度的要求系统的管理(如任务管理、进程管理、存储器管理、I/O管理等)对DSP的要求片内存储器和片外存储器的要求(包括容量的要求和速度的要求)DSP芯片选择对外设(如串口、并口、定时器、总线宽度、等待状态等)的要求DSP封装对印制板的设计影响甚大开发环境技术支持性能价格比DSP芯片的速度DSP的片内存储器DSP的外设BGA(BALLGRIDARRAY)PLCC(PLASTICJ-LEADEDCHIPCARRIER)PQFP(PLASTICQUADFLATPACK)PDLP(PLASTICDUAL-IN-LINEPACKAGE)LCCC(LEADLESSCERAMICCHIPCARRIER)系统设计硬件系统设计软件系统设计•工作软件•测试软件•功能框图(指标分配)•电原理图•印制板(数字与模拟电路,接地,电源,多层板)系统的实现从C程序作起用CCompiler将C源程序编译成为汇编语言源程序,然后汇编、连接后输出可执行代码;也可以使用shell程序,将编译、汇编、连接一齐完成源程序分析器输入是C源文件。读入源语句,检查语法和语意错误,写出一个中间文件(.if)优化器可选择项。其输入是分析器产生的中间文件(.if)。当运行优化器时,用户可以选择优化的层次。产生一个与中间文件格式相同的高效率版本。代码生成器输入是分析器或优化器产生的中间文件(.if或.opt文件),产生一个汇编语言源文件内部列表公用程序输入是C编译器产生的汇编语言源程序和C源程序。产生的是按C文件的语句展开的汇编语言源文件汇编器和连接器汇编器的输入是代码生成器产生的汇编语言文件,产生COFF目标文件连接器的输入是汇编器产生的COFF目标文件,产生可执行的目标文件运行C编译器cl500[-options]filenames[-z[link_options][objectfiles]]•cl500调用编译器和汇编器的命令。•-options影响编译器处理输入文件的途径•filenames一个或多个C源文件、汇编语言源文件,或目标文件。•-z运行连接器的选择项。•link_options影响连接器处理输入文件的途径•objectfiles命名编译器产生的目标文件cl500-qsymtabfileseek.asm–z编译文件symtab和file,汇编第三个文件seek.asm,连接这三个文件,并使用quiet选择项,抑制输出处理信息如果不使用-q选择项,就会输出以下处理信息:[symtab]TMS320C54xANSICCompilerVersionx.xxCopyright(c)1997TexasInstrumentsIncorporated“symtab.c”==main“symtab.c”==lookupTMS320C54xANSICCodegenVersionx.xxCopyright(c)1997TexasInstrumentsIncorporated“symtab.c”==main“symtab.c”==lookupTMS320C54xCOFFAssemblerversionx.xxCopyright©1997TexasInstrumentsIncorporatedPASS1PASS2NoErrors,NoWarnings汇编器输出的列表文件:1*******************************************2**Assembleintothe.textsection.**3*******************************************40000.text50000e800LD#0,A6*******************************************7**Allocate4wordsin.bssforTEMP.**8*******************************************90000Var_1:.bssTEMP,41011*******************************************12**Stillin.text**13*******************************************140001f000ADD#56h,A00020056150003f066MPY#73h,A000400731617*******************************************18**Allocate100wordsin.bssforthe**19**symbolnamedARRAY;thispartof**20**.bssmustfitonasinglepage.**21*******************************************220004.bssARRAY,100,12324*******************************************25**Assemblemorecodeinto.text.**26*******************************************2700058000-STLA,Var_12829*******************************************30**Declareexternal.bsssymbols.**31*******************************************32.globalARRAY,TEMP33.end连接器-m选择项建立映射列表文件-mfilename该连接器映射列表描述:•存储器划分•输入与输出段的位置•外部符号重新定位后的地址当没有发现错误时,连接器就建立一个输出模块,省缺名为a.out。也可以使用-o选择项,将输出模块写入另外的文件:-ofilename其中的文件名就是新的输出模块的文件名lnk500–orun.outfile1.objfile2.obj将ile1.obj和file2.obj连接起来,建立一个名为run.out的输出模块可以将上述文件名及选择项,再加上注释写入一个命令文件link.cmd:a.obj/*Firstinputfilename*/b.obj/*Secondinputfilename*/-oprog.out/*Optiontospecifyoutputfile*/-mprog.map/*Optiontospecifymapfile*/并用该命令文件来调用连接器:lnk500link.cmd包含连接器伪指令的命令文件:a.objb.objc.obj/*Inputfilenames*/-oprog.out-mprog.map/*Options*/MEMORY/*MEMORYdirective*/{RAM:origin=100hlength=0100hROM:origin=01000hlength=0100h}SECTIONS/*SECTIONSdirective*/{.text:ROM.data:ROM.bss:RAM}MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:origin=constant,length=constant;}PAGE说明一个存储器空间。用户最多可以说明255页。通常,page0是程序存储器,page1是数据存储器。name命名一个存储器范围。一个存储器的名字可以是1—8个字符,其中包括A—Z,a—z,$,.,_。Attr存储器的属性:•R存储器可读•W存储器可写•X存储器可包含可执行代码•I存储器可以初始化•origin指定存储器的开始地址•length指定存储器范围的长度。•fill为存储器范围指定一个填入的字符,其值是2-byte的整常数。TMS320C54x省缺的地址配置:MEMORY{PAGE0:PROG:origin=0x0080length=0xFF00PAGE1:DATA:origin=0x0080length=0xFF80}SECTIONS{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0;cflagoptiononly.bss:PAGE=1}连接器使用举例本例连接三个目标文件demo.obj、fft.obj和tables.obj,并建立输出文件demo.out。符号SETUP是程序的输入点。连接器命令文件demo.cmd/******************************************************//***SpecifyLinkerOptions***//*******************************************************/-ecoeff/*Definetheprogramentrypoint*/-odemo.out/*Nametheoutputfile*/-mdemo.map/*Createanoutputmap*//*******************************************