IIR 滤波器实验.docx

上传人:b****4 文档编号:4213010 上传时间:2022-11-28 格式:DOCX 页数:14 大小:689.75KB
下载 相关 举报
IIR 滤波器实验.docx_第1页
第1页 / 共14页
IIR 滤波器实验.docx_第2页
第2页 / 共14页
IIR 滤波器实验.docx_第3页
第3页 / 共14页
IIR 滤波器实验.docx_第4页
第4页 / 共14页
IIR 滤波器实验.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

IIR 滤波器实验.docx

《IIR 滤波器实验.docx》由会员分享,可在线阅读,更多相关《IIR 滤波器实验.docx(14页珍藏版)》请在冰豆网上搜索。

IIR 滤波器实验.docx

IIR滤波器实验

实验五IIR滤波器实验

一实验目的

(1)了解IIR滤波器的原理及使用方法;

(2)了解使用Matlab语言设计IIR滤波器的方法;

(3)了解DSP对IIR滤波器的设计及编程方法;

(4)熟悉对IIR滤波器的调试方法;

二实验内容

本试验要求设计滤波器采样频率为600hz,截止频率200hz的高通滤波器。

设计IIR滤

波器实现上面要求。

输入信号频率为100HZ和300HZ的合成信号,目的是通过我们设计的滤波器将100HZ

的信号滤掉,余下300HZ的信号成分,达到滤波的效果。

三实验原理

数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程及其z变换描述:

系统的转移函数为:

设N=M,则传输函数变为:

转换成极零点表示为:

式中,

表示零点,

表示极点,它具有N个零点和N个极点,如果任何一个极点在Z平面单位圆外,则系统不稳定。

如果系数bj全都为0,滤波器成为非递归的FIR滤波器,这时系统没有极点,因此FIR滤波器总是稳定的。

对于IIR滤波器,有系数量化敏感的缺点。

由于系统对序列施加的算法,是由加法、延时和常系数乘三种基本运算的组合,所以可以用不同结构的数字滤波器来实现而不影响系统总的传输函数。

图4.1是四阶直接型IIR滤波器的结构。

图4.1四阶直接型IIR滤波器的结构

四实验步骤

1.滤波器的Matlab语言设计

在Matlab中使用滤波器设计工具箱(FDA)设计滤波器。

图4.2打开的FDA主界面图

上图4.2是打开的滤波器设计的主界面图,在图4.2上可以设计各种满足用户要求的

滤波器,包括滤波器的类型(IIR或FIR)、滤波器的阶数、滤波器的种类、滤波器的截至频率、带宽、纹波系数、采样频率等各种和设计滤波器有关的所有参数。

图中,我们设计IIR型的3阶切比雪夫I型的采样频率为600HZ,截至频率为200HZ的低通滤波器。

图中中间显示的数据为设计好的滤波器参数。

下图4.3是对应频率特性图。

图4.3滤波器的频率特性图

下图4.4是对应的冲击响应特性图。

图4.4滤波器的冲击响应特性图

图4.5是对应的滤波器阶跃特性图。

图4.6是对应的滤波器极零点示意图。

图4.7是对应的滤波器结构示意图。

图4.5滤波器阶跃特性图。

图4.6滤波器的极零点示意图

图4.7滤波器的结构示意图

2.从Matlab语言转换成通用语言

使用Matlab语言设计出滤波器的参数之后,紧接着需要编写通用的语言,以便向DSP

所需要的汇编语言转换,也直接使用C语言,然后调用CCS自带的C编译器将C语言转换

成汇编语言,但一般情况下,滤波器对实时要求比较高,而整个滤波器的程序编写也不是很

大,所以建议采用汇编语言编写。

滤波器设计的第二步需要编写通用的语言,在这里,我们仍然使用Matlab语言编写易

懂的语句。

下面程序是编写后的程序。

浅显易懂,移值性强。

*********************滤波器程序*****************************************

clearall;清寄存器值

clf;清屏

N=256;数据点数

Fs=600;采样频率

dt=1/fs

forK=1:

N

f1=300;信号频率

f2=100;信号频率

y(k)=sin(2*pi*f1*k*dt)+sin(2*pi*f2*k*dt)+sin(2*(f1+20)*k*dt);产生信号

end

lp=200;截止频率

wn1=2lp/fs;函数的参数

[zl,pl,kl]=CHEBY1(3,0.5,wnl,’high’);滤波器的极零点表示

[B,A]=CHEBY1(3,0.5,wnl,’high’);滤波器的传递函数表示

yy1

(1)=0;

yy1

(2)=0;

b

(1)=0.0580;b

(2)=-0.1741;b(3)=0.1741;b(4)=-0.058;

a

(1)=1;a

(2)=1.1795;a(3)=0.918;a(4)=0.2742

n=254;

fori=1:

n

yy1(i)=b(4)*y(i+3)+b(3)*y(i+2)+b

(2)*y(i+1)+

b

(1)*y(i)+a(4)*yy1(i+2)+a(3)*yy1(i+1)+a

(2)*yy1(i);

end

滤波

y=fft(y,N);将信号做FFT变换

pyy=y.*conj(y);做功率谱分析

f=(0:

(N/2-1));

figure

(1);

plot(f,pyy(1:

N/2))

y=fft(yy1,N);将滤波后数据做功率谱分析

pyy=y.*conj(y);

f=(0:

(N/2-1));

figure

(2);

plot(f,pyy(1:

N/2))

对程序的说明:

程序有四个部分,

第一部分是用for循环产生需要滤波的信号;

第二部分是生成Cheby1滤波器,其中产生极点和零点;

第三部分是进行滤波;

第四部分画出信号的功率谱图。

图4.8和图4.9分别是滤波前和滤波后的信号功率谱图。

图4.8滤波前的信号功率谱图

图4.9滤波后的信号功率谱图

3.滤波器的汇编语言设计

在编写汇编程序之前,首先将滤波器的参数写出,从上面滤波器的设计中我们得出滤

波器的参数如下,这些参数从图4.2打开的FDA主界面图可以看到。

图4.10是滤波器的

参数显示图。

图4.10滤波器的参数图

显然,图4.10所提供的滤波器的参数不能直接拿到DSP汇编语言中去,图4.10中的

设计有大于1的数据,例如分母中的第二个参数,这样一个大于1的数据,直接放入DSP

中,需要进行数据格式的浮点运算。

将导致编程的复杂程度,而且也会导致DSP运行程序

速度的降低。

一般情况下我们都不这样使用,而是将数据做一定比例的压缩后计算(当然

如果一定需要这样做,也是可以的,对浮点数据的处理可以参考我们的实验1)。

将数据做8倍的压缩,得到新的数据为:

分子:

0.00725-0.0276250.027625-0.00725

分母:

1.0000.14743750.114750.034275

可以注意到只有一个参数没有压缩,就是分母的第一个参数。

请读者思考。

针对以上滤波参数,编写汇编语言程序如下:

.mmregs

.reffilter_start

K_DATA_SIZE.set256;输入数据个数

K_BUFFER_SIZE.set8

K_STACK_SIZE.set256;堆栈

K_A.set3;a的个数

K_B.set4;b的个数

K_CIR.setK_BUFFER_SIZE

STACK.usect"stack",K_STACK_SIZE

SYSTEM_STACK.setK_STACK_SIZE+STACK

DATA_DP.usect"filter_vars",0

filterdata.usect"filter_vars",K_DATA_SIZE

bufferdatay.usect"filter_vars",K_BUFFER_SIZE*2

bufferdatax.usect"filter_vars",K_BUFFER_SIZE*2

.data

.globalinputdata

inputdata

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16305

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16304

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16304

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16304

.WORD21315,4595,-2444,11368,15066,-2014,-8408,6957

.WORD12879,-1643,-5536,11893,19128,4966,428,16304

.text

.asgAR2,ORIGIN

.asgAR3,INPUT

.asgAR4,FILTER

.asgAR5,OUTPUT

START:

SSBXFRCT

SSBXINTM

LD#DATA_DP,DP

STM#STACK,SP

CALLfilter_start

NOP

NOP

NOP

LOOP

BLOOP

.defb1,b2,b3,a1,a2

.deffilter_start

b1.set00EDH;b1=0.00725

b2.set-02C9H;b2=-0.027625

b3.set02C9H;b3=0.02762

b4.set-00EDH;b4=-0.00725

a1.set12DFH

a2.set0ED0H

a3.set0463H

.text

filter_start:

STM#K_CIR,BK

STM#1,AR0;设置循环缓冲区大小和步长

STM#inputdata,ORIGIN

STM#bufferdatax,INPUT

STM#bufferdatay,FILTER

STM#filterdata,OUTPUT

;初始化

RPT#K_A-1;a1,a2,a3的个数

MVDD*ORIGIN+,*INPUT+0%;初始化头3个Ys

STM#bufferdatax,INPUT

;设置初始化滤波数据

RPT#K_A-1;a1,a2,a3的个数

MVDD*INPUT+0%,*FILTER+0%;初始化3个Ys

STM#bufferdatay,FILTER

STM#bufferdatax,INPUT

;滤波

STM#K_DATA_SIZE-3-1,BRC;头3个值直接通过

RPTBfilter_end-1

;等待硬件中断

MVDD*ORIGIN+,*INPUT

RPT#K_B-1-1;b1,b2,b3,b4的个数

MAR*INPUT-0%;调整输入到相应位置

MPY*INPUT+0%,#b4,B;B=b4*x(i)

LDB,A

MPY*INPUT+0%,#b3,B;B=b3*x(i+1)

ADDB,A

MPY*INPUT+0%,#b2,B;B=b2*x(i+2)

ADDB,A

MPY*INPUT+0%,#b1,B;B=b1*x(i+3)

ADDB,A;y(x+3)=A

MPY*FILTER+0%,#a3,B;B=y(i)*a3

ADDB,A;A=A+B

MPY*FILTER+0%,#a2,B;B=y(i+1)*a2

ADDB,A;A=A+B

MPY*FILTER+0%,#a1,B;B=y(i+2)*a1

ADDB,A;y(x+3)=A+B

STHA,*FILTER-0%;FILTER++

STHA,*OUTPUT+

MAR*FILTER-0%;调整滤波器到相应位置

NOP

RET

.end

配置文件:

MEMORY{

PAGE0:

PARAM:

org=3000hlen=4000h

PAGE1:

DARAM:

org=100hlen=4000h

}

SECTIONS{

.text:

>PARAMPAGE0

stack:

>DARAMPAGE1

filter_vars:

>DARAMPAGE1

.bss:

>DARAMPAGE1

.data:

>DARAMPAGE1

}

程序运行结果如下:

如果使用我们提供的配置文件,其中滤波前的数据首地址放在数据存储空间的地址

320H处,滤波后的数据首地址放在数据存储空间的地址200H。

图4.11滤波前CCS中的数据时域波形

图4.12滤波前CCS中的数据频域波形

图4.13滤波后CCS中的数据时域波形

图4.14滤波后CCS中的数据频域波形

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1