企业简介

《自动化博览》立足于整个中国自动化产业,加强报道国家政府及相关部门针对自动化行业的政策、专项及相关发展规划。促进行业交流、引领产业发展,《自动化博览》立志于成为中国自动化领域中集实用技术与权威信息为一体的专业传媒。

  • 公司类型:其他

联系方式
  • 《自动化博览》
  • 地址:北京市海淀区上地十街辉煌国际2号楼1504室
  • 邮编:100085
  • 电话:010-57116290
  • 传真:59813329
  • 网址:http://www.kongzhi.net
  • Email:bjb@kongzhi.net
  • 联系人:市场部
案例详细
标题基于DSP混合编程的LMS自适应滤波算法实现
技术领域自动化软件
行业
简介
内容

    摘要:本文分析了LMS自适应滤波算法的基本原理,并结合2FSK信号解调的实例,在TMS320VC5416器件上分别采用C语言和混合编程方法对LMS自适应滤波算法进行了实现。结果表明,采用混合编程的LMS自适应滤波实现方法具有软件接口简单,运行速度快,易于进行实时信号处理等特点。

    关键词:LMS算法;DSP;混合编程

    Abstract: This paper analyzes the basic principle of LMS adaptive filtering algorithm, and combining with the example of 2FSK signal demodulation, realizes the LMS adaptive filtering algorithm adopting C language and mixed programming method on the device TMS320VC5416. The result shows that the realized method of the LMS adaptive filtering algorithm has advantages such as simple software interface, fast running speed, easily realizing real-time signal processing. 

    Key words: LMS adaptive filtering algorithm; DSP; Mixed programming

    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)的均方值最小化,并且根据这个判据来修改权系数。误差序列的均方值又叫“均方误差”,即:
    

    其中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.

    作者简介

    黄勇(1978-),男,湖北洪湖人,工程师,硕士,现就职于中国船舶重工集团公司第七一O研究所,主要研究方向为信号处理。