自适应滤波器一直是信号处理领域的研究热点之一,经过多年的发展,已经被广泛应用于数字通信、回声消除、图像处理等领域。自适应滤波算法的研究始于20世纪50年代末,Widrow和Hoff等人最早提出最小均方算法(LMS)。算法由于结构简单,计算量小,易于实时处理,因此在噪声抵消,谱线增强,系统识别等方面得到了广泛的应用。为了克服定步长LMS算法中收敛速度、收敛精度及跟踪速度等对步长大小选取相互矛盾的缺点,人们提出了许多变步长LMS算法,但是,当输入信号具有强相关性时,例如语音信号,LMS算法及NLMS算法的收敛速度将急剧下降。因此,本文对进入自适应滤波器的输入信号首先进行解相关预处理,再对自适应滤波器进行归一化LMS。
很多自适应滤波器是在通用DSP处理器上通过编写软件代码实现。这种滤波器在系统实时性要求不高的情况下,能很好地满足滤波要求,但在实时性要求较高的场合(如3G移动通信,网络会议等),这种滤波器在处理速度和抗干扰性能等方面已不能满足要求。而用FPGA硬件实现的数字滤波器就能很好的解决并行性和速度问题,而且其具有灵活的可配置特性和优良的抗干扰能力,因而自适应滤波器的FPGA实现成为近年来数字滤波器中研究的热点。Altera公司开发的DSP Builder可以完成FPGA的DSP系统设计,它结合Matlab/Simulink提供的库元件和强大的计算仿真能力,进行图形建模和仿真,还可以完成从Simulink模块文件向VHDL语言的自动转换。
1 算法概述
在标准LMS算法中,其迭代公式如下:

式中:ω(n)为自适应滤波器在时刻n的权矢量;x(n)为时刻n的输入信号矢量;d(n)为参考信号;e(n)是误差信号;μ是步长迭代因子,为了增加LMS算法的收敛速度,文献[1-4]提出了不同的变步长算法代替定步长因子μ,但是很多变步长因子的计算量大,存在开方和指数运算,故在能满足要求的情况下,归一化LMS (NLMS)依然是一个很好的选择,即用μn/[xT(n)x(n)]代替定步长因子μ为了控制失调,在更新公式中引入一个固定的收敛因子μn,这是因为所有的倒数都是基于平方误差的瞬时值而不是均方误差(MSE)。对于NLMS算法,当输入信号具有强相关性时,LMS算法及NLMS算法的收敛速度将急剧下降。因此对进入自适应滤波器的输入信号首先进行解相关预处理,再对自适应滤波器进行归一化LMS,便得解相关归一化LMS(DNLMS)即用式(4)代替式(3):

2 基于FPGA的系统开发流程
在早期PFGA的DSP系统设计过程中,DSP开发者直接使用VHDL或Verilog HDL语音进行开发。这种开发难度较大,开发效率较低,为了克服这些问题,出现了许多新的基于FPGA的DSP开发工具,如Altera公司的DSP Builder、Xilinx公司的System Generator等。图1是Altera公司的FPGA系统级开发流程。

DSP Builder是Altera公司推出的一个面向DSP开发的系统级工具。它是作为Matlab/Simuli-nk的一个工具箱出现的。它从利用Matlab建立DSP电路模型开始。电路模型可方便地利用Simulink与DSPBuilder中提供的功能模块和IP核进行设计。电路中的功能模块和IP的技术参数、数据格式、数据类型和总线宽度等都能直接设置。电路模型建立后就能进行系统级的仿真。仿真通过后可以运行Signal Compiler,将模型转化成RTL级的VHDL代码和Tcl(工具命令语言)脚本语言。调用QuartusⅡ进行编译,QuartusⅡ根据网表文件及设置的优化约束条件进行布线布局和优化设计的适配,最后生成编程文件和仿真文件。
3 系统建模与仿真
根据DNLMS算法的思想,结合FPGA硬件设计的特点。

NLMS算法主要包括延时模块,乘法模块,加法模块,除法模块等。为了让整个系统看起来清晰,降低原理图的复杂性,也便于多次应用,本文将几个多次使用的模块封装成子模块。下面将对各个子模块作简单的介绍。
根据算法的要求,每次新的数据x(n)输入,数据T,S,M都需要重新更新一次,计算量大,消耗的乘法块多。为了解决这个问题。根据T,S,M的运算特点,每次更新只需要一个乘法块和一次加法,就能完成8次乘法和一次加法的运算。具体子模块如图2所示。

通过图2的优化,对于8阶滤波器,乘法块的使用从24个减少到2个,计算速度将得到很大的提高。ω的迭代运算通过图3实现。

在顶层模块的设计中,加入了PLL模块和SignalComplier,根据各模块仿真周期,在PLL模块中设置好不同的周期,利用Simulink中的颜色标识采样频率的高低。顶层文件的设计如图4所示。
在顶层结构图中,子模块8为方程(9)的实现过程。

4 计算机仿真
为了充分模拟相关性较强的信号,在输入端加如下的信号源:
x(n)=0.99x(n-1)+v(n)
式中:v(n)为高斯白噪声;x(n)的初始值为500,具体的产生电路如图5所示。

信号产生波形以及加噪后的仿真波形如图6所示。

通过滤波器滤波的结果如图7所示。

      在图7的信号依次为参考信号、加噪声信号、误差信号和滤波信号。滤波效果良好,对于强相关的信号,也有很好的滤波效果。通过QuartusⅡ编译,滤器器的速度为35.24 MHz,编译后生产如图8所示的块,它作为一个符号模块可供更高级系统设计时调用,通过对该块的修改和增加滤波器的阶数,可以实现对语音的回声消除。
5 结  语
      自适应滤波器的研究是近年来研究的热门方向,在FPGA中实现高速的自适应滤波器的设计更是一个热点,在此采用DSP Builder系统建模的方法,在FPGA中实现了归一化LMS算法,实验结果表明:用DSPBuilder设计的8阶DNLMS算法比用底层的VHDL代码设计效率更高,灵活性更大,速度更快。同样比通用的DSP芯片设计的8阶NLMS滤波器处理速度快了20多倍。如果将8阶NLMS滤波器扩展到512阶或者1 024阶,可以很好地应用于自适应回声消除等很多自适应滤波的领域。故有一定的参考价值。

基于FPGA dspbuilder的DNLMS滤波器实现的更多相关文章

  1. 基于FPGA的IIR滤波器

    基于FPGA的IIR滤波器                                                         by方阳 版权声明:本文为博主原创文章,转载请指明转载地址 ...

  2. 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)

    1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...

  3. 基于FPGA的图像去噪

    目录 结构图 其中FPGA 控制模块为核心,通过它实现视频图像数据的获取.缓存.处理和控制各模块间通讯[1].由CCD 相机对目标成像,高速图像数据由camera link 实时传输[2],经信号转换 ...

  4. 基于FPGA的DDS设计(一)

    最近在学习基于FPGA的DDS设计,借此机会把学习过程记录下来,当作自己的学习笔记也希望能够帮助到学习DDS的小伙伴. DDS(Direct Digital Synthesizer)直接数字合成器,这 ...

  5. 基于FPGA的飞机的小游戏

    基于FPGA的飞机的小游戏 实验原理 该实验主要分为4个模块,采用至上而下的设计方法进行设计.由50M的晶振电路提供时钟源,VGA显示控制模块.图形显示控制模块.移动模块的时钟为25M,由时钟分频电路 ...

  6. 基于FPGA的线阵CCD图像测量系统研究——笔记

    本文是对基于FPGA的线阵CCD图像测量系统研究(作者:高尚)的阅读笔记 第一章绪论 1. 读读看 读了前面的摘要依然没有看懂作者要做什么.接着往下读....终于看到了一个字眼“基于机器视觉的图像测量 ...

  7. 基于FPGA的按键扫描程序

    最近在学习FPGA,就试着写了个按键扫描的程序.虽说有过基于单片机的按键扫描处理经验,对于按键的处理还是有一些概念.但是单片机程序的编写通常都采用C写,也有用汇编,而FPGA却是采用VHDL或者Ver ...

  8. 基于FPGA的DW8051移植(三)

    总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了ida ...

  9. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

随机推荐

  1. 【转】Keil ARM开发 error L6236E错误解决

    顺利创建了第一个Keil工程却发现不能完成链接,出现了一个下面这样的报错: .\Objects\demo_simple.sct(7): error: L6236E: No section matche ...

  2. Luogu2661 信息传递(图论)

    Luogu2661 信息传递(图论) Description 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti ...

  3. 基于CMS的组件复用实践

    目前前端项目大多基于Vue.React.Angular等框架来实现,这一类框架都有一个明显的特点:基于模块化以及组件化思维.所以,开发者在使用上述框架时,实际上是在写一个一个的组件,并且组件与组件之间 ...

  4. 枚举类型---java基础代码

    package com.mon11.day4; /** * 类说明 :定义枚举 * @author 作者 : chenyanlong * @version 创建时间:2017年11月4日 */ pub ...

  5. python数字转换为字符串的两种方式

    主要包括两种形式进行转换: 第一种是str(),将值转换为用户便于阅读的形式: 另一种是repr(),将值转换为合法的python表达式. >>> print repr(" ...

  6. C语言复习---二维数组和二级指针的关系:没关系,别瞎想(重点)

    前提:一维数组和一维指针为什么可以替换使用? ] = { , , }; int *p = a; ; i < ; i++) printf("%d ", *(p + i)); 上 ...

  7. HDU 3595 every-sg模型

    多个子游戏同时进行,每个子游戏给出两个数a,b,可以将大的数减去k倍小的数,不能操作者输. 策略就是对于一个必胜的游戏要使得步数更长,对于一个必败的游戏使得步数最短. 以下都来自贾志豪的论文.. 对于 ...

  8. [转载]AngularJS视图

    http://www.yiibai.com/angularjs/angularjs_views.html <html> <head> <title>Angular ...

  9. 【转载】RESTful API 设计指南

    作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...

  10. CF 1131B Draw!

    Draw! Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Descriptio ...