APP下载

基于DSP混合编程的LMS自适应滤波算法实现

2014-05-29黄勇吴运金宋俊才中国船舶重工集团公司第七一研究所湖北宜昌443003

自动化博览 2014年5期
关键词:汇编语言C语言滤波器

黄勇,吴运金,宋俊才(中国船舶重工集团公司第七一○研究所,湖北 宜昌 443003)

1 引言

在许多数字电子系统中,为了提取信号有用信息,我们可以使用数字信号处理器件(DSP)对采样后的数字信号进行算法处理。DSP进行算法处理常用C语言或汇编语言进行编程。使用C语言可以大大提高软件开发速度和可读性,方便软件的修改和移植,但是C代码的效率无法与汇编代码相比。使用汇编语言虽然编写比较繁杂,可移植性差,但可以更为合理充分利用DSP芯片提供的硬件资源,代码效率高[1]。

本文介绍自适应滤波(LMS)算法的基本原理,结合其在2FSK信号解调中的应用,使用C语言与汇编混合编程的方法在TMS320VC5416 DSP器件上进行实现,并指出混合编程在该项应用中的优势。

2 自适应滤波器的结构和算法

2.1 自适应滤波器的结构

常规滤波器具有特定的特性,输入信号根据滤波器的特性产生相应的输出。但是实际应用是反过来要求的,即对滤波器输出的要求是明确的,而滤波器特性无法预先知道,这就必须依赖自适应滤波技术。

自适应滤波器的权系数可以根据一种自适应算法来不断修改,使系数的冲激响应能满足给定的性能。图1为自适应滤波器的一般形式。

图1 自适应滤波器结构图

自适应滤波器有两个独立的部分:一个按理想模式设计的滤波器,一套自适应算法,用来调节滤波器权系数使滤波器性能达到要求。自适应滤波可采用FIR或者IIR结构,由于IIR滤波器存在稳定性问题,因此一般采用FIR滤波器作为自适应滤波器的结构,自适应FIR滤波器结构可以分为三种结构类型:横向型结构、对称横向型结构、格型结构。本文采用的是自适应滤波器设计中最常用的FIR横向型结构。图2为横向滤波器的结构示意图。

图2 横向滤波器的结构示意图

其中x(n)为自适应滤波器的输入;W(n)为自适应滤波器的权值:W(n) = {W0(n),W1(n),W2(n),…,WN-1(n)};y(n)为自适应滤波器的输出:

2.2 自适应滤波器的算法

最常用的自适应算法是最小均方误差算法,即LMS算法(Least Mean Square),LMS算法是一种易于实现、性能稳健、应用广泛的算法。所有的滤波器系数调整算法都是设法使y(n)接近d(n),所不同的只是对于这种接近的评价标准不同。LMS算法的目标是通过调整系数,使输出误差序列e(n)=d(n)-y(n)的均方值最小化,并且根据这个判据来修改权系数。误差序列的均方值又叫“均方误差”,即:

代入y(n)的表达式(1)有:

其中R=E[x(n)xT(n)]为N*N自相关矩阵,它是输入信号采样值间的相关性矩阵。P=E[d(n)x(n)]为N*1互相关矢量,代表理想信号d(n)与输入矢量的相关性。

在均方误差最小时,可以得到W(n+1)=W(n)+2ue(n)X(n) (4)[2]

式(1)、(2)、(4)构成了DSP实现的LMS算法。其优点是:实现起来简单,不依赖模型,因此具有稳健的性能。

3 自适应滤波算法的DSP实现

本文以2FSK信号的解调为实例,分析LMS自适应滤波在DSP上的实现。2FSK信号的频点为4kHz和6kHz,采样频率40kHz。其解调过程如图3所示[3]:

图3 2FSK信号解调框图

为了能实时解调2FSK信号,要求经过一个码元周期内就能对2FSK信号的该码元进行解码判决,为了达到这个要求,必须在一个采样间隔内完成对2FSK信号的两次LMS滤波、平方和低通滤波处理。因此,要求DSP能快速实现LMS滤波。

按照这种设计思想,我们在TMS320VC5416 上实现20阶LMS算法的自适应滤波器,分别采用C语言和混合编程的方法来实现。图4为DSP实现的程序流程图,整个实现过程主要分为3步:

(1)滤波运算的相关运算单元、寄存器以及变量的初始化;

(2)根据输入的采样值计算滤波器的输出求出误差;

(3)根据LMS算法的迭公式更新滤波器的参数,有新的采样输入后转入下一次执行。

图4 DSP实现LMS算法程序流程图

3.1 自适应滤波算法C语言实现

在编写程序的初始化阶段,首先应该进行自适应系数、缓冲区、变量的初始化,并设置缓冲区的地址以及数据和程序在存储区内的分配,基于LMS自适应算法的输入数据逐步输入到数据缓冲区,每输入一个采样数据,进行一次LMS自适应滤波运算。因此,每次输入的新采样数据前,数据缓冲区高位地址的数据依次向低位地址数据移动,新采样数据被存放在数据缓冲区的最高位地址,清除最低地址数据。x(n),y(n),d(n),w(n)分别定义为不同的存储空间。以下是实现LMS自适应滤波的一段C语言代码,省略了初始化和对滤波结果的处理。

程序中最外层循环每执行一次,实现一次LMS自适应滤波运算。第{1}、{2}、{3}步分别实现公式(1)、(2)、(4)。

3.2 自适应滤波算法混合编程实现

用C语言编写的自适应滤波程序,结构清晰,易于编写,可读性强,易于维护。但是执行效率不高,由于在一个LMS算法中有多次迭代,而且随着FIR阶数的增加,迭代的次数也会相应地增加,在一个采样周期内实现对信号的LMS自适应滤波、平方和低通滤波还有一定的困难。因此可以采用汇编语言编写LMS算法来提高执行效率,但是汇编语言编写程序比较繁杂,可读性差,可移植性差,不便于软件的升级和维护。

为了兼顾C语言和汇编的优点,避免其弊端,我们采用C语言与汇编语言混合编程的方法。独立编写汇编程序和C程序,用汇编语言生成对运行速度要求较高的目标代码模块,用C语言编写主程序和对代码效率要求不高的程序代码,用链接器将C模块和汇编模块链接起来。采用这种方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。

采用C语言和汇编混合编程必须遵循一些有关的规则,否则会遇到一些意想不到的问题。

3.2.1 函数调接用接口规则

C编译器规定了一组严格的函数调用规则。除了特殊的运行支持函数外,任何被C函数所调用的函数都必须遵循这些规则,否则就会破坏C环境,造成不可预测的结果[4]。

(1) 参数传递

函数调用前,将参数以逆序压入运行堆栈,即最右边的参数最先入栈,然后自右向左将参数依次入栈。但是,对于TMS320C54X,在函数调用时,第一个参数放入累加器A中进行传递。若参数是长整型和浮点数时,则低位字先压栈,高位字后压栈。若参数中有结构形式,则调用函数给结构分配空间,其地址通过累加器A传递给被调用函数。

(2) 结果返回

函数调用结束后,将返回值置于累加器A中。整数和指针在累加器A的低16位中返回。浮点数和长整型数在累加器A的32位中返回。

(3) 函数调用时需注意的一些问题

参数不是由被调用函数弹出椎栈,而是由调用函数弹出。因此调用函数可以传递任意数目的参数至函数,而且函数不必知道有多少个参数传递。

在汇编程序中,除了自动初始化全局变量外,不要将.cinit段用作其它用途。C程序在boot.asm中的启动程序认为.cinit段中放置的全部是初始化表,因此将其它一些信息放入.cinit段将产生不可预料的结果。

如果要定义在C程序中访问的汇编变量或调用的汇编子程序,则必须在汇编程序中用.global说明为外部。

3.2.2 用汇编实现C语言函数

用汇编语言实现LMS自适应滤波器的算法,并根据这些规则和接口规范,将编写的汇编代码编译成能在C语言下调用的函数。

将被调用的LMS自适应滤波函数设计为int lms_asm(int x,int*w,int *des,int step),其中x表示一个新输入的采样数据点,w表示存放FIR滤波器系数的首地址,des表示存放期望数据的首地址,step为步长,返回值是经过LMS自适应滤波后对应的输出。以下为该函数的汇编实现方法,由于篇幅限制,主要列出函数接口部分,省去了LMS自适应算法部分:

4 DSP实现结果分析

将采用C语言和采用混合编程的方法的实现LMS自适应滤波的方法进行对比测试,测试平台:运行于WindowsXp sp3的DSP集成开发软件CCS2.2,输入信号为调制频率为4KHz与6KHz的2FSK调制信号,采样频率为40kHz,DSP采用TMS320VC5416,主频160MHz。

根据测试平台的特点,两个数据采样点的间隔时间为25微秒,即4000时钟周期,通过CCS2.2自带的“View Clock”工具测试处理1个采样点时调用“int lms_asm(int x,int *w,int *des,int step)”所消耗的时钟周期,测试结果表明,完全使用C语言实现的算法完成1个采样点的处理需耗用8000多时钟周期,而采用C语言调用汇编算法的方法只需耗用400多时钟周期。满足DSP对采样数据逐点处理的需求。

5 结语

本文并结合2fsk信号解调的实例,在TMS320VC5416器件上分别采用C语言和混合编程方法对LMS自适应滤波算法进行了实现,在使用C语言算法时,算法处理速率不能达到预定的要求,而使用汇编与C语言混合编程的方法,能在一个采样周期内,完成LMS自适应算法,并且还能处理后续的平方低通滤波等解码过程。这表明,采用混合编程的LMS自适应滤波算法具有编程与引用简单,运行速度快等特点。

[1] 胡洪凯, 郑红, 吴冠. TMS320C54X DSP 混合编程的方法研究[J]. 电子技术应用, 2001, (8) : 68 - 70.

[2] 姚天任, 孙洪. 现代数字信号处理[M]. 武汉: 华中科技大学出版社, 1999.

[3] 曹志刚, 钱亚生. 现代通信原理[M]. 北京: 清华大学出版社, 2003.

[4] TMS320C1x/C2x/C2xx/C5x Assemble Language Tools User's Guide[Z],Texas Instruments, 1999.

猜你喜欢

汇编语言C语言滤波器
基于Visual Studio Code的C语言程序设计实践教学探索
高等学校计算机专业课程教学改革实践——以汇编语言与接口技术课程为例
51单片机C语言入门方法
从滤波器理解卷积
汇编语言与C语言的混合程序设计技术研究
基于C语言的计算机软件编程
开关电源EMI滤波器的应用方法探讨
一种微带交指滤波器的仿真
提高《汇编语言程序设计》教学效率的思考与实践
高职高专院校C语言程序设计教学改革探索