基于DSP的IIR设计C语言编程Word文档格式.docx
《基于DSP的IIR设计C语言编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于DSP的IIR设计C语言编程Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
1巴特沃兹(Butterworth)滤波器,其幅度响应在通带内具有最平特性;
2切比雪夫(Chebyshev)滤波器,在通带内具有等波纹特性,且阶数小于巴特沃兹滤波器;
3椭圆(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)减小,则系统频率响应各周期延拓分量之间相距更远,因而可减小频率响应的混叠效应。
脉冲响应不变法优缺点:
从以上讨论可以看出,脉冲响应不变法使得数字滤波器的单位脉冲响应完全模仿模拟滤波器的单位冲激响应,也就是时域逼近良好,而且模拟频率Q和数字频率3之间呈线性关系co=QT。
因而,一个线性相位的模拟滤波器(例如贝塞
尔滤波器)通过脉冲响应不变法得到的仍然是一个线性相位的数字滤波器。
脉冲响应不变法的最大缺点是有频率响应的混叠效应。
所以,脉冲响应不变
法只适用于限带的模拟滤波器(例如,衰减特性很好的低通或带通滤波器),而且高频衰减越快,混叠效应越小。
至于高通和带阻滤波器,由于它们在高频部分不衰减,因此将完全混淆在低频响应中。
如果要对高通和带阻滤波器采用脉冲响应
滤掉高于折叠频率以上
当然这样会进一步增加
不变法,就必须先对高通和带阻滤波器加一保护滤波器,的频率,然后再使用脉冲响应不变法转换为数字滤波器。
设计复杂性和滤波器的阶数。
b.用双线性变换法设计IIR数字滤波器
脉冲响应不变法的主要缺点是产生频率响应的混叠失真。
这是因为从S平面
到Z平面是多值的映射关系所造成的。
为了克服这一缺点,可以采用非线性频率
压缩方法,将整个频率轴上的频率范围压缩到-n/T〜n/T之间,再用z=esT转换
到Z平面上。
也就是说,第一步先将整个S平面压缩映射到Si平面的-n/T〜n/T一条横带里;
第二步再通过标准变换关系z=es1T将此横带变换到整个Z平面上
去。
这样就使S平面与Z平面建立了一一对应的单值关系,消除了多值变换性,也就消除了频谱混叠现象,映射关系如图所示。
图双线性变换的映射关系
为了将S平面的整个虚轴jQ压缩到S1平面jQ1轴上的-n/T到n/T段上,可以通过以下的正切变换实现式中,T仍是采样间隔。
当Q1由-n/T经过0变化到n/T时,Q由-经过0变化到+^,也即映射了整个jQ轴。
将上式写成
将此关系解析延拓到整个S平面和S1平面,令jQ=s,jQ1=s1,贝U得再将S1平面通过以下标准变换关系映射到Z平面z=es1T
从而得到S平面和Z平面的单值映射关系为:
上两式是S平面与Z平面之间的单值映射关系,这种变换都是两个线性函
数之比,因此称为双线性变换。
首先,把z=e"
,可得
即S平面的虚轴映射到Z平面的单位圆。
其次,将s=c+jQ代入式,得
因此
由此看出,当(T<
0时,|Z|V1;
当(T>
0时,Zl>
1。
也就是说,S平面的左半
平面映射到Z平面的单位圆内,S平面的右半平面映射到Z平面的单位圆外,S平面的虚轴映射到Z平面的单位圆上。
因此,稳定的模拟滤波器经双线性变换后所得的数字滤波器也一定是稳定的。
双线性变换法优缺点
双线性变换法与脉冲响应不变法相比,其主要的优点是避免了频率响应的混
S平面上Q与Z
叠现象。
这是因为S平面与Z平面是单值的一一对应关系。
S平面整个jQ轴单值地对应于Z平面单位圆一周,即频率轴是单值变换关系。
平面的3成非线性的正切关系,如图所示。
由图7-7看出,在零频率附近,模拟角频率Q与数字频率3之间的变换关系接近于线性关系;
但当Q进一步增加时,3增长得越来越慢,最后当Q时,
3终止在折叠频率3=冗处,因而双线性变换就不会出现由于高频部分超过折叠频率而混淆到低频部分去的现象,从而消除了频率混叠现象。
图双线性变换法的频率变换关系
但是双线性变换的这个特点是靠频率的严重非线性关系而得到的。
由于这种频率之间的非线性变换关系,就产生了新的问题。
首先,一个线性相位的模拟滤波器经双线性变换后得到非线性相位的数字滤波器,不再保持原有的线性相位
了;
其次,这种非线性关系要求模拟滤波器的幅频响应必须是分段常数型的,即某一频率段的幅频响应近似等于某一常数(这正是一般典型的低通、高通、带通、带阻型滤波器的响应特性),不然变换所产生的数字滤波器幅频响应相对于原模拟滤波器的幅频响应会有畸变,如图所示。
图双线性变换法幅度和相位特性的非线性映射
对于分段常数的滤波器,双线性变换后,仍得到幅频特性为分段常数的滤
波器,但是各个分段边缘的临界频率点产生了畸变,这种频率的畸变,可以通过频率的预畸来加以校正。
也就是将临界模拟频率事先加以畸变,然后经变换后正好映射到所需要的数字频率上。
三、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©
)plot(signal)
figure(4)
ysignal=abs(fft(signal));
%滤波后频谱df=n*(fs/N);
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);
%输出文件头fprintf(fid,'
%d\n'
xoutcss);
%输出fclose(fid);
产生的时域波形如图所示:
0c
图输入信号波形
频谱如图所示:
4ED
35D
Z5D
tw
HJ
%1dM»
闻MHD片UD占MDBIN7DHUHDiWD1QD»
图输入频谱
经过滤波器后的预期时域波形如图:
图输出时域波形
频谱如图所示
图输出频谱
(2)滤波器的设计
MATLAB集成了一套功能强大的滤波器设计工具FDATool(FilterDesign&
AnalysisTool),可以完成多种滤波器的设计、分析和性能评估。
a打开FilterDesign&
AnalysisTool
单击MATLAB主窗口下方的“Start”按钮,选择菜单“ToolBox”—“Filter
Design”—
如图所示。
“FilterDesign&
AnalysisTool(FDATool)”命令,打开FDATool,
图fadatool的启动
b.产生滤波器
阶数为2阶,这里应填1,比阶数少1。
IIR类型选择切比雪夫型I型(Chebyshev采样频率为10000Hz,通带截止频率为1000Hz。
图滤波器的幅频特性
Structure
Dlred-FormI.
SKOAd-order
Sections
Order:
1
SectiDHE:
Stable.
Yes
Stwee:
Desared
LLLLLJLLL
11111
111■■
11■11
Illi
Illi1Illi
111
■I■
■■1
■■■
1111P
11^*1-11t
111k
11l^'
H.1h
111.i
111L
■■■卜・■■,・■■卜-,・・・r卜"
-・・・-'
-・・--
1111H
1111hF
11■1■
11■■P
1111P
1111E
a11
1■1
J■1
-■・・--一卜・「--▼,:
・・・.▼■,:
・・・-F・_
11
■■■■■■■F■■产■(■■■■■产
jlii1f
D
-1
4
1523
Frequency(tHj)
Blor?
Filer...
r5
05
3S
R^Knnrk»
FitwrPirrfcw
Rr*rajnnrv益门nc.
Mannitijri口0i・r!
Nir口tinrin
•Lawpaw仃
»
specifyftfdef:
1|
Unite.IH«
2*
iJritE:
dB*J
_iHighfwa*■
r■
1U'
inknjinorder
Fs:
1MDD
^lBandpn&
s
A|WM-E:
)1
Band“op
Ofilions
Fpass;
'
■CHTferefiitatsr存
Therearennoptional
DesignHdbod
per-smelersfarthisdesign
1曲CrebyshevType1仃
rv_i~jUv>
pJnieinoci
FIRE^Liiripple*
Dtsdq门Filter]
Fitc「Manaflcr…
ComputingResponse...done
图滤波器的相位特性
C.产生滤波器系数和头文件
图滤波器系数
LCbrenFterintcxmerhm-
^F4terCoeTnctente.
Dlred-FormI.SKOAd-orderSections
Scc-bl口iltL
SectiDHE:
Stable.Stxce:
YMDKiflred
p—Respans#T^tb
•Lawpaw
■High[MU
IBandpa&
IBand“op
ICHTferefiitatsr
—DesignHdbod——
FIRE^Liiripple
DesigningFilter…Done
iftudd耳iBcili匚etions
I:
dB
to:
PV_I~jUu*_pJrriBirioci
*帜CrebyshevTypeI
图头文件的产生
最后将产生的头文件中的滤波器系数数组放入编写好的滤波器函数中,进行CCS中进行调试与测试。
开在
四、FIR滤波器的Simulink仿真
通过Matlab的FDATOOL设计滤波器后,为了确认该滤波器是否有效,现通过simulink进行建模仿真观察该滤波器是否有效。
把两个信号通过加法器相加后,再通过FDATOOL设计的滤波器即可。
注意此处设计的是数字滤波器,需要把三个输入信号数字化。
具体仿真模型建立如下:
分别观察滤波前后的时域波形图
图滤波前时域波形
图滤波后时域波形
五、IIR滤波器的DSP实现
(1)标准型二阶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"
//滤波器的阶数〃函数申明
//IIR滤波函数
#defineIIRNUMBER2
intInputWaveO;
intIIR();
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;
intfln[256],fOut[256];
〃输入输出缓存
intinput[256];
intnln,nOut;
main(){nln=0;
nOut=0;
finput=fOutput=0;
while
(1){
}
〃处理输入数据
intInputWaveO」
{
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()
intfSum;
fSum=0;
〃输入乘累加//输出乘累加
for(i=0;
iv|IRNUMBER;
i++){
fSum+=(fXn[i]*fAn[i]);
fSum+=(fYn[i]*fBn[i]);
}return(fSum);
CSS仿真调试
CCS是TI推出的用于开发其
译、链接、软件仿真、硬件调试及实时跟踪等功能于一体,极大地方便了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: