基于DSP的IIR设计C语言编程Word文档格式.docx

上传人:b****5 文档编号:20018823 上传时间:2023-01-15 格式:DOCX 页数:23 大小:817.30KB
下载 相关 举报
基于DSP的IIR设计C语言编程Word文档格式.docx_第1页
第1页 / 共23页
基于DSP的IIR设计C语言编程Word文档格式.docx_第2页
第2页 / 共23页
基于DSP的IIR设计C语言编程Word文档格式.docx_第3页
第3页 / 共23页
基于DSP的IIR设计C语言编程Word文档格式.docx_第4页
第4页 / 共23页
基于DSP的IIR设计C语言编程Word文档格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

基于DSP的IIR设计C语言编程Word文档格式.docx

《基于DSP的IIR设计C语言编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于DSP的IIR设计C语言编程Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。

基于DSP的IIR设计C语言编程Word文档格式.docx

直接型(也称直接I型)、标准型(也称直接II型)、变换型、级联型和并联型.

二阶IIR滤波器,又称为二阶基本节,分为直接型、标准型和变换型.

对于一个二阶IIR滤波器,其输出可以写成:

a.直接型(直接I型)

根据上式可以得到直接二型IIR滤波器的结构图.如图所示.共使用了4个延迟单元().

图直接I型二阶IIR滤波器

直接型二阶IIR滤波器还可以用图的结构实现.

此时,延时变量变成了w(n).可以证明上图的结构仍满足二阶IIR滤波器输出方程.

b.标准型(直接II型)

从图2可以看出,左右两组延迟单元可以重叠,从而得到标准二阶IIR滤波器的结构图,如图所示.由于这种结构所使用的延迟单元最少(只有2个),得到了广泛地应用,因此称之为标准型IIR滤波器.

图标准型二阶IIR滤波器

(2)设计方法及原理

IIR滤波器的设计可以利用模拟滤波器原型,借鉴成熟的模拟滤波器的设计结果进行双线性变换,将模拟滤波器变换成满足预定指标的数字滤波器,即根据模拟设计理论设计出满足要求的传递函数H(s),然后将H(s)变换成数字滤波器的传递函数H(z)。

设计IIR滤波器的基础是设计模拟滤波器的原型,这些原型滤波器主要有:

①巴特沃兹(Butterworth)滤波器,其幅度响应在通带内具有最平特性;

②切比雪夫(Chebyshev)滤波器,在通带内具有等波纹特性,且阶数小于巴特沃兹滤波器;

③椭圆(Elliptic)滤波器,在通带内具有等波纹特性,且阶数最小。

a.用脉冲相应不变法设计IIR数字滤波器

利用模拟滤波器来设计数字滤波器,也就是使数字滤波器能模仿模拟滤波器的特性,这种模仿可以从不同的角度出发。

脉冲响应不变法是从滤波器的脉冲响应出发,使数字滤波器的单位脉冲响应序列h(n)模仿模拟滤波器的冲激响应ha(t),即将ha(t)进行等间隔采样,使h(n)正好等于ha(t)的采样值,满足h(n)=ha(nT)式中,T是采样周期。

如果令Ha(s)是ha(t)的拉普拉斯变换,H(z)为h(n)的Z变换,利用采样序列的Z变换与模拟信号的拉普拉斯变换的关系得

则可看出,脉冲响应不变法将模拟滤波器的S平面变换成数字滤波器的Z平面,这个从s到z的变换z=esT是从S平面变换到Z平面的标准变换关系式。

图脉冲响应不变法的映射关系

由上式,数字滤波器的频率响应和模拟滤波器的频率响应间的关系为

这就是说,数字滤波器的频率响应是模拟滤波器频率响应的周期延拓。

正如采样定理所讨论的,只有当模拟滤波器的频率响应是限带的,且带限于折叠频率以内时,即

才能使数字滤波器的频率响应在折叠频率以内重现模拟滤波器的频率响应,而不产生混叠失真,即

但是,任何一个实际的模拟滤波器频率响应都不是严格限带的,变换后就会产生周期延拓分量的频谱交叠,即产生频率响应的混叠失真,如图所示。

这时数字滤波器的频响就不同于原模拟滤波器的频响,而带有一定的失真。

当模拟滤波器的频率响应在折叠频率以上处衰减越大、越快时,变换后频率响应混叠失真就越小。

这时,采用脉冲响应不变法设计的数字滤波器才能得到良好的效果。

图脉冲响应不变法中的频响混叠现象

对某一模拟滤波器的单位冲激响应ha(t)进行采样,采样频率为fs,若使fs增加,即令采样时间间隔(T=1/fs)减小,则系统频率响应各周期延拓分量之间相距更远,因而可减小频率响应的混叠效应。

脉冲响应不变法优缺点:

从以上讨论可以看出,脉冲响应不变法使得数字滤波器的单位脉冲响应完全模仿模拟滤波器的单位冲激响应,也就是时域逼近良好,而且模拟频率Ω和数字频率ω之间呈线性关系ω=ΩT。

因而,一个线性相位的模拟滤波器(例如贝塞尔滤波器)通过脉冲响应不变法得到的仍然是一个线性相位的数字滤波器。

脉冲响应不变法的最大缺点是有频率响应的混叠效应。

所以,脉冲响应不变法只适用于限带的模拟滤波器(例如,衰减特性很好的低通或带通滤波器),而且高频衰减越快,混叠效应越小。

至于高通和带阻滤波器,由于它们在高频部分不衰减,因此将完全混淆在低频响应中。

如果要对高通和带阻滤波器采用脉冲响应不变法,就必须先对高通和带阻滤波器加一保护滤波器,滤掉高于折叠频率以上的频率,然后再使用脉冲响应不变法转换为数字滤波器。

当然这样会进一步增加设计复杂性和滤波器的阶数。

b.用双线性变换法设计IIR数字滤波器

脉冲响应不变法的主要缺点是产生频率响应的混叠失真。

这是因为从S平面到Z平面是多值的映射关系所造成的。

为了克服这一缺点,可以采用非线性频率压缩方法,将整个频率轴上的频率范围压缩到-π/T~π/T之间,再用z=esT转换到Z平面上。

也就是说,第一步先将整个S平面压缩映射到S1平面的-π/T~π/T一条横带里;

第二步再通过标准变换关系z=es1T将此横带变换到整个Z平面上去。

这样就使S平面与Z平面建立了一一对应的单值关系,消除了多值变换性,也就消除了频谱混叠现象,映射关系如图所示。

图双线性变换的映射关系

为了将S平面的整个虚轴jΩ压缩到S1平面jΩ1轴上的-π/T到π/T段上,可以通过以下的正切变换实现

式中,T仍是采样间隔。

当Ω1由-π/T经过0变化到π/T时,Ω由-∞经过0变化到+∞,也即映射了整个jΩ轴。

将上式写成

将此关系解析延拓到整个S平面和S1平面,令jΩ=s,jΩ1=s1,则得

再将S1平面通过以下标准变换关系映射到Z平面z=es1T

从而得到S平面和Z平面的单值映射关系为:

上两式是S平面与Z平面之间的单值映射关系,这种变换都是两个线性函数之比,因此称为双线性变换。

首先,把z=ejω,可得

即S平面的虚轴映射到Z平面的单位圆。

其次,将s=σ+jΩ代入式,得

因此

由此看出,当σ<

0时,|z|<

1;

当σ>

0时,|z|>

1。

也就是说,S平面的左半平面映射到Z平面的单位圆内,S平面的右半平面映射到Z平面的单位圆外,S平面的虚轴映射到Z平面的单位圆上。

因此,稳定的模拟滤波器经双线性变换后所得的数字滤波器也一定是稳定的。

双线性变换法优缺点

双线性变换法与脉冲响应不变法相比,其主要的优点是避免了频率响应的混叠现象。

这是因为S平面与Z平面是单值的一一对应关系。

S平面整个jΩ轴单

值地对应于Z平面单位圆一周,即频率轴是单值变换关系。

S平面上Ω与Z平面的ω成非线性的正切关系,如图所示。

由图7-7看出,在零频率附近,模拟角频率Ω与数字频率ω之间的变换关系接近于线性关系;

但当Ω进一步增加时,ω增长得越来越慢,最后当Ω→∞时,ω终止在折叠频率ω=π处,因而双线性变换就不会出现由于高频部分超过折叠频率而混淆到低频部分去的现象,从而消除了频率混叠现象。

图双线性变换法的频率变换关系

但是双线性变换的这个特点是靠频率的严重非线性关系而得到的。

由于这种频率之间的非线性变换关系,就产生了新的问题。

首先,一个线性相位的模拟滤波器经双线性变换后得到非线性相位的数字滤波器,不再保持原有的线性相位了;

其次,这种非线性关系要求模拟滤波器的幅频响应必须是分段常数型的,即某一频率段的幅频响应近似等于某一常数(这正是一般典型的低通、高通、带通、带阻型滤波器的响应特性),不然变换所产生的数字滤波器幅频响应相对于原模拟滤波器的幅频响应会有畸变,如图所示。

图双线性变换法幅度和相位特性的非线性映射

对于分段常数的滤波器,双线性变换后,仍得到幅频特性为分段常数的滤波器,但是各个分段边缘的临界频率点产生了畸变,这种频率的畸变,可以通过频率的预畸来加以校正。

也就是将临界模拟频率事先加以畸变,然后经变换后正好映射到所需要的数字频率上。

三、IIR滤波器的MATLAB实现

MATLAB辅助DSP实现IIR,其总体过程为在DSP中编写处理程序,在MATLAB中利用滤波器设计、分析工具(FDATOOL),根据指定的滤波器性能快速设计一个FIR,再把滤波器系数以头文件形式导入CCS中,头文件中MATLAB辅助DSP实现IIR数字滤波器含滤波器阶数和系数数组,在MATLAB中调试、运行DSP程序并显示、分析处理后的数据。

使用该方法,便于采用汇编语言来实现程序。

头文件名不变,当MATLAB中设计的滤波器系数改变时,相应头文件中系数也改变,方便程序调试、仿真。

(1)输入信号的产生

首先利用Matlab产生导入CCS的dat文件,具体实现如下代码所示

sl=1000;

%有效信号

ns1=4500;

%高频噪声

fs=10000;

%采样频率

N=1000;

T=1/fs;

n=0:

N;

signal=sin(2*pi*sl*n*T);

noise=0.5*sin(2*pi*ns1*n*T);

x=(signal+noise);

%待滤波信号

figure

(1)

plot(x)

figure

(2)

y=abs(fft(x));

%待滤波频谱

df=n*(fs/N);

plot(df,y)

figure(3)

plot(signal)

figure(4)

ysignal=abs(fft(signal));

%滤波后频谱

plot(df,ysignal)

%滤波数据导出

xout=x/max(x);

%归一化

xto_css=round(32767*xout);

%数据取整

xoutcss=xto_css;

fid=fopen('

iir_input.dat'

'

w'

);

%打开文件

fprintf(fid,'

16511000\n'

%输出文件头

%d\n'

xoutcss);

%输出

fclose(fid);

产生的时域波形如图所示:

图输入信号波形

频谱如图所示:

图输入频谱

经过滤波器后的预期时域波形如图:

图输出时域波形

频谱如图所示

图输出频谱

(2)滤波器的设计

MATLAB集成了一套功能强大的滤波器设计工具FDATool(FilterDesign&

AnalysisTool),可以完成多种滤波器的设计、分析和性能评估。

a.打开FilterDesign&

AnalysisTool

单击MATLAB主窗口下方的“Start”按钮,选择菜单“ToolBox”→“FilterDesign”→“FilterDesign&

AnalysisTool(FDATool)”命令,打开FDATool,如图所示。

图fadatool的启动

b.产生滤波器

阶数为2阶,这里应填1,比阶数少1。

IIR类型选择切比雪夫型I型(chebyshev)

采样频率为10000Hz,通带截止频率为1000Hz。

图滤波器的幅频特性

图滤波器的相位特性

c.产生滤波器系数和头文件

图滤波器系数

图头文件的产生

最后将产生的头文件中的滤波器系数数组放入编写好的滤波器函数中,并在进行CCS中进行调试与测试。

4、FIR滤波器的Simulink仿真

通过Matlab的FDATOOL设计滤波器后,为了确认该滤波器是否有效,现通过simulink进行建模仿真观察该滤波器是否有效。

把两个信号通过加法器相加后,再通过FDATOOL设计的滤波器即可。

注意此处设计的是数字滤波器,需要把三个输入信号数字化。

具体仿真模型建立如下:

分别观察滤波前后的时域波形图

图滤波前时域波形

图滤波后时域波形

五、IIR滤波器的DSP实现

(1)标准型二阶IIR滤波器的实现

在二阶IIR滤波器结构中,标准型结构是最常见的滤波器结构,其结构如图所示:

图标准型二阶IIR滤波器

由其差分方程对二阶IIR滤波器进行编程,其中乘法-累加运算可采用单操作数指令或双操作数指令,数据和系数可存放在DARAM中,如图所示:

图双操作数数据存放和系数表

(2)直接型二阶IIR滤波器的实现

二阶IIR滤波器可以用直接型结构来实现.在迭代运算中,先衰减后增益,系统的动态范围和鲁棒性要好些.直接型二阶IIR滤波器的结构如图所示:

图直接型二阶IIR滤波器

为了实现直接型滤波,可在DARAM中开辟4个循环缓冲区,用来存放变量和系数,并采用循环缓冲区方式寻址.这4个循环缓冲区的结构如图所示:

图循环缓冲区结构

(2)C语言实现IIR

采用C语言算法在DSP平台上实现了FIR低通数字滤波器,C语言算法相比于汇编算法可移植性很强。

这里是在TMS320VC5510DSP为平台编写的C语言算法,此算法可以稍加改动用在其他DSP芯片上,而汇编算法则不然。

这种方法具有以下优点:

(a)程序的入口和出口由C语言自动管理,不必手工编写汇编程序实现。

(b)程序结构清晰,可读性强。

(c)程序调试方便。

由于C程序中的变量全部由C语言来定义,因此采用C源码调试器可以方便地观察C语言变量。

(d)可移植性较强,通用性较好。

具体代码如下:

#include"

math.h"

#defineIIRNUMBER2//滤波器的阶数

intInputWave();

//函数申明

intIIR();

//IIR滤波函数

floatfBn[IIRNUMBER]={0.0,0.7757};

floatfAn[IIRNUMBER]={0.1122,0.1122};

//滤波器系数

floatfXn[IIRNUMBER]={0.0};

floatfYn[IIRNUMBER]={0.0};

intfInput,fOutput;

inti,m=0;

intfIn[256],fOut[256];

//输入输出缓存

intinput[256];

intnIn,nOut;

main()

{

nIn=0;

nOut=0;

fInput=fOutput=0;

while

(1)

{

fInput=InputWave();

//从数据中导入数据到输入缓存

fIn[nIn]=fInput;

nIn++;

nIn%=256;

//保证数据缓存不溢出

fOutput=IIR();

//调用IIR滤波函数

fOut[nOut]=fOutput;

//放入输出缓存

nOut++;

if(nOut>

=256)//保证数据缓存不溢出

}

}

intInputWave()//处理输入数据

for(i=IIRNUMBER-1;

i>

0;

i--)

fXn[i]=fXn[i-1];

fYn[i]=fYn[i-1];

fXn[0]=input[m];

fYn[0]=0.0;

m++;

m%=256;

return(fXn[0]);

intIIR()//IIR滤波函数

intfSum;

fSum=0;

for(i=0;

i<

IIRNUMBER;

i++)

fSum+=(fXn[i]*fAn[i]);

//输入乘累加

fSum+=(fYn[i]*fBn[i]);

//输出乘累加

return(fSum);

(3)CSS仿真调试

CCS是TI推出的用于开发其DSP芯片的继承开发调试工具,集编辑、编译、链接、软件仿真、硬件调试及实时跟踪等功能于一体,极大地方便了DSP程序的设计与开发,此外还提供图形显示功能,方便用户观察特定地址的波形。

此外,还需向工程中添加Link.cmd文件(源码见附录)。

在CCSV3.3中建立工程,把c源代码和.cmd文件导入后,外加rts.lib文件,它是TI提供的运行时支持库,如果是C代码写的源程序,必须要包含该库,该库由TI公司做好放在CCS\cgtools\lib中,源代码TI网站可以下载。

添加完成后,编译通过后,下载.out文件,导入.dat文件后运行程序。

工程建立如下:

图工程建立

采用CCS的图形显示功能,分别观察输入信号x(n)、输出信号y(n)的时域波形和频域波形,输入信号波形如图所示。

图滤波前频谱图

经过滤波后,观察输出波形如下

图滤波后频谱图

为了更加直观的观察滤波器的性能和滤波效果,把滤波前后的时域波形和频谱图进行对比和分析,具体如下:

图滤波前后对比时域和频谱

从上图中可以看出,输入信号明显有高频噪声,波形有很明显的失真。

从输入频谱分析,可以看出除了有1000Hz的信息信号还有4500Hz的高频噪声。

经过滤波器后,输出的时域波形有了明显改善,几乎接近信息信号。

而频谱图中也可以看出4500Hz的高频噪声基本已经被滤除,而且对原来的信息信号几乎没有影响。

但是由于设计滤波器的阶数较低,滤波器性能有限,可以看出还有部分高频分量没有滤除干净,有待改善。

综上分析,滤波器实现滤除高频噪声,而且保证原信息信号基本不失真的功能,但是滤波效果一般,有待改善。

附录:

.cmd文件

-c

MEMORY{

DARAM:

origin=0x200,len=0xfe00

SARAM:

origin=0x10000,len=0x30000

VECT:

origin=0x100,len=0x100

SDRAM:

origin=0x80000,len=0x380000

Flash:

origin=0x400000,len=0x3e0000

CPLD:

origin=0x800000,len=0x20000

SECTIONS

.vectors:

{}>

VECT

.trcinit:

SARAM

.gblinit:

frt:

.text:

.cinit:

.pinit:

.sysinit:

.bss:

.far:

.const:

.switch:

.sysmem:

.cio:

.MEM$obj:

.sysheap:

.stack:

.sysstack{}>

.csldata{}>

DARAM

(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的配合和支持)

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

当前位置:首页 > 求职职场 > 面试

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

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