首页 > 范文大全 > 正文

基于FPGA和LMS算法的系统建模

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于FPGA和LMS算法的系统建模范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:自适应滤波器用于实现对未知系统的建模,用Matlab中的Simulink对LMS算法的实现方法进行仿真,在FPGA中实现了LMS算法及其建模,并对FPGA设计的系统建模结果采用Matlab软件仿真,以增强Quartus的仿真功能,从而得到完整且直观的仿真结果。这种系统建模所采用的仿真、实现和验证方法同样适用于消除宽带信号中的窄带干扰,实现自适应谱线增强以及自适应均衡等,具有一定通用性。

关键词:FPGA;自适应滤波;LMS算法;系统建模;Matlab仿真

中图分类号:TN713文献标识码:A

文章编号:1004-373X(2010)02-076-04

System Modeling Based on FPGA and LMS Arithmetic

LIU Yan

(The 802 Research Institute,Shanghai Academy of Spaceflight Technology,Shanghai,200090,China)

Abstract:The realization method of LMS arithmetic is simulated by SIMULINK in Matlab,the LMS arithmetic is realized by FPGA,and system modeling by self_adaptive filter and FPGA,the emulational function of Quartus are enhanced by Matlab,and the result is rounded and intuitionistic.The method of emulation,realization and validation to the system modeling is the same with the elimination to narrow_band disturb in wideband,the realization to self_adaptive equalization etc,and it has a certain universal sence.

Keywords:FPGA;self_adaptive filter;LMS arithmetic;system modeling;Matlab simulation

0 引 言

自适应滤波器用于系统建模是其重要应用之一,即自适应滤波器作为估计未知系统特性的模型,对于自适应滤波器,IIR和FIR两种形式都可以考虑,而FIR滤波器是实际应用较广泛的。FIR滤波器只有可调的零点,因此它没有IIR因兼有可调的零点和极点而带来的不稳定问题,另外,LMS计算量小,比较容易进行硬件实现,所以这里所设计的自适应滤波器是在FIR的基础上构建的LMS自适应滤波器[1,2]。

1 自适应滤波器实现及系数调整LMS算法

自适应滤波器的结构是具有可调系数的直接型或格型FIR滤波器,因此,系数调节准则必须优化且可实现。

LMS(最小均方)算法是个最陡下降方法,自适应滤波器按照如下LMS系数递推公式不断修正滤波器系数,使得待估计未知系统的输出与自适应滤波器之差的均方值达到最小[1,3]:

hn(k)=hn-1(k)+Δ*e(n)*x(n-k)

式中:hn(k)为此时刻的第k个抽头的系数;hn-1(k)为前一时刻的第k个抽头的系数;Δ为调节算法的步进;误差e(n)=d(n)-x(n),其中d(n)为待估计未知系统的输出,x(n)为输入信号;x(n-k)为输入延迟。

2 LMS算法实现方法的仿真

根据自适应滤波器实现及系数调整LMS算法的原理,用格型滤波实现滤波单元,格型滤波单元的实现如图1所示,将多个格型滤波单元级联实现高阶滤波。

图1 格型滤波单元的实现

当输入信号为迭加了随机信号的正弦波,8个格型滤波单元级联时,LMS算法的Simulink仿真见图2。

图2 LMS算法的输入和输出

从图2的仿真结果可以看出,该LMS算法实现了高阶滤波,也即图1所示的格型滤波单元结构可用于实现LMS算法。

3 系统实现方法

用系数按LMS算法变化的8阶FIR对未知的FIR系统进行建模的系统框图如图3所示。

图3 用FPGA和LMS算法实现系统建模的框图

图3中,未知FIR系统(只知道输出不知道参数),自适应FIR滤波器为图1所示的格型结构,具有四个可调节参数h1,h2,h3,h4,在FPGA中用原理图实现,FIR设计方法在许多资料中有详细介绍,这里不再赘述[4-7]。LMS算法在FPGA中采用原理图和VHDL相结合的方法实现,下面对LMS算法模块做重点介绍。

用LMS算法计算权值系数的顶层框图如4所示,其基本结构为图1所示的格型滤波结构,该模块以待估计未知系统的输出与自适应滤波器之差为输入信号,输出为不断修正的滤波器系数h1,h2,h3,h4,同时作为自适应FIR滤波器的可调节系数。

为了计算方便,设调节算法的步进Δ=1/1 024,这样只需要对待估计未知系统的输出与自适应滤波器之差进行移位运算,即可以实现与步进Δ的乘法,从而避免了待估计未知系统的输出与自适应滤波器之差与小数(步进Δ)做乘法的运算,减少了乘法运算产生的舍入误差且节约了大量的FPGA资源,提高了计算速度[2]。

各主要模块的VHDL语言描述如下[8-10]:

(1) 移位寄存器模块

library IEEE;

use IEEE.STD_LOGIC-1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift is

port (

clk:in std_logic;

datain:in std_logic_vector(11 downto 0);

A,B,C,D:out std_logic_vector(11 downto 0));

end shift;

architecture Behavioral of shift is

signal temp1:std_logic_vector(11 downto 0);

signal temp2:std_logic_vector(11 downto 0);

signal temp3:std_logic_vector(11 downto 0);

signal temp4:std_logic_vector(11 downto 0);

begin

process(clk)

begin

if clk′event and clk=′1′ then

temp1(11 downto 0)

temp2(11 downto 0)

temp3(11 downto 0)

temp4(11 downto 0)

end if;

end process;

A

B

C

D

end Behavioral;

图4 用LMS算法计算权值系数的顶层框图

(2) 移位乘法器模块

library IEEE;

use IEEE.STD_LOGIC-1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift10 is

port (

clk:in std_logic;

datain:in std_logic_vector(11 downto 0);

dataout:out std_logic_vector(11 downto 0));

end shift10;

architecture Behavioral of shift10 is

__右移10位(除以1 024),即步长为1/1 024

begin

process(clk)

begin

if clk′event and clk=′1′ then

dataout(1 downto 0)

dataout(11 downto 2)

end if;

end process;

end Behavioral;

(3) 累加器模块

library ieee;

use ieee.std_logic-1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

entity jia is

port( clk:in std_logic;

h_temp:in std_logic_vector(11 downto 0);

fankui:inout std_logic_vector(11 downto 0);

adder:inout std_logic_vector(11 downto 0);

h:out std_logic_vector(11 downto 0));

end entity jia;

architecture behave of jia is

signal temp:std_logic_vector(11 downto 0);

begin

process(clk)

begin

temp

if clk′event and clk=′1′ then

adder

fankui

end if;

h

end process;

end architecture behave;

4 实验和仿真结果

将Quartus对FPGA顶层系统建模文件的仿真结果另存为.TBL文件,用Matlab读出该仿真结果,需要注意的是对FPGA生成的.TBL文件的最后一位要改成数字,最前面段英文要删除,其Matlab程序如下:

clc;

clear all;

fid=fopen(′top.tbl′,′r′);%读2位16进制数

s=fscanf(fid,′%s′,1);%文件读指针指向第一个字符

i=1;

N=3;%输出的16进制数据位数

while feof(fid)~=1

s1=s(1,1:length(s)-1);%s1为时间字符,该字符最后一位为>,必须除去(即-1)

time=str2num(s1);%将CHAR转为NUM

clk_temp=fscanf(fid,′%s′,1);%指向下一个符号

clr_temp=fscanf(fid,′%s′,1);%指向下一个符号

in_temp=fscanf(fid,′%s′,1);%指向下一个符号

equal=fscanf(fid,′%s′,1);%跳过一个符号,s指向"="

test=mod(time,500); %以500为周期对数据

取样,剔除野值

fir8out_temp=fscanf(fid,′%s′,1);%fid指向输出第一个数据

fir8lms_temp=fscanf(fid,′%s′,1);%fid指向输出第二个数据

if (equal== ′=′)&(test==0)%剔除周期以外的野值,并确认数据之前为"="

fir8out(i)=hex2dec(fir8out_temp(1,1:N));%将16进制数转为10进制数

fir8out_jilu(i)=fir8out(i);

if fir8out(i)>=(2^(4*N-1))%负数补码转为10进制

fir8out(i)=-(2^(4*N))+fir8out(i);

end

fir8lms(i)=hex2dec(fir8lms_temp(1,1:N));%将16进制数转为10进制数

fir8lms_jilu(i)=fir8lms(i);

if fir8lms(i)>=(2^(4*N-1))%负数补码转为10进制

fir8lms(i)=-(2^(4*N))+fir8lms(i);

end

tt(i)=time/1000;%t单位ns,转换为μs

clk(i)=str2num(clk_temp);

in(i)=hex2dec(in_temp(1,1:N));%将16进制数转为10进制数

if in(i)>=(2^(4*N-1))%负数补码转为10进制

in(i)=-(2^(4*N))+in(i);

end

error=fir8out_jilu_fir8lms_jilu;

i=i+1;

end

s=fscanf(fid,′%s′,1);%指向下一行第一个符号

end

fclose(fid);

subplot(5,1,1),plot(clk,′k′);grid on;

subplot(5,1,2),plot(in,′k′);grid on;%sin+noise

subplot(5,1,4),plot(fir8out,′k′);grid on;

subplot(5,1,3),plot(fir8lms,′k′);grid on;

subplot(5,1,5),plot(error,′k′);grid on;

值得注意的是,为解决结果数据毛刺太多而引起的.TBL文件过大使以上Matlab程序读出数据速度太慢的问题,可以在Quartus仿真时用功能仿真代替时序仿真。具体方法是:在波形文件.VWF的Assignments菜单中选择FUNCTIONAL,确定后再Processing菜单中选择Generate Functional Simulation Netlist生成功能仿真网表后再开始仿真,这样产生的结果数据基本没有野值产生的毛刺。

用以上程序读出的时钟、输入信号、未知系统输出、自适应滤波器的输出及误差信号如图5所示,其中,输入信号同样为迭加了随机信号的正弦波。

图5 时钟、输入、未知系统输出、

自适应滤波器的输出及误差信号

从图5的结果可以看出,自适应滤波器在经过开始的一段振荡后,输出逐渐与未知系统输出一致,二者的误差逐渐减小到接近零,即实现了无差跟踪,可见,该自适应滤波器实现了对未知系统的跟踪和建模,且有相当快的收敛速度。

5 结 语

本文用Matlab中的Simulink对LMS算法的实现方法进行了仿真,并在FPGA中实现了LMS算法,进而实现了在FPGA中用自适应滤波器对未知系统的建模,并对FPGA设计的系统建模结果用Matlab软件仿真以增强Quartus的仿真功能,从而得到完整而且直观的仿真结果,这种系统建模所采用的仿真、实现和验证方法同样适用于消除宽带信号中的窄带干扰、实现自适应谱线增强以及自适应均衡等[1],具有一定的通用性。

参考文献

[1]陈怀琛.数字信号处理及其Matlab实现[M].北京:电子工业出版社,1998.

[2]杨跃忠,阙沛文,李亮.自适应LMS滤波器在FPGA中的实现[J].微计算机信息,2006,22(11):158 -160.

[3]潘松.EDA技术使用教程[M].北京:科学出版社,1999.

[4]孙耀奇,高火涛,熊超,等.基于Matlab和fpga的FIR数字滤波器设计及实现[J].现代电子技术,2008,31(11):89-92.

[5]郭继昌,向晖,滕建辅,等.基于FPGA的FIR滤波器的实现[J].电子技术应用,2000,26(5):60-62.

[6]李明纬,黄世震.应用分布式算法在FPGA平台实现FIR低通滤波器[J].中国集成电路,2007,20(2):90-92.

[7]陈炳权.基于FPGA的FIR滤波器FFT算法与DA算法实现[J].襄樊学院学报,2005,22(2):54-56.

[8]宋立业,王景胜,彭继慎.自适应滤波器的算法研究及DSP仿真实现[J].现代电子技术,2008,31(5):112-114.

[9]胡广书.数字信号处理[M].北京:清华大学出版社,2003.

[10]褚振勇,翁木云.FPGA设计及应用[M].西安:西安电子科技大学出版社,2002.

作者简介 刘 艳 女,1976年出生,陕西宝鸡人,硕士研究生,助理工程师。研究方向为数字信号处理。