基于DSP设计的FIR带阻滤波器Word文档下载推荐.docx
《基于DSP设计的FIR带阻滤波器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于DSP设计的FIR带阻滤波器Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
(3)DSP系统实验箱(硬件连接使用,本实验未使用)。
四、实验内容
1、系统方案
一个典型的DSP系统除了数字信号处理部分外,还包括A/D和D/A两部分。
这是因为自然界的信号,如声音、图像等大多是模拟信号,因此需要将其数字化后进行数字信号处理,模拟信号的数字化即称为A/D转换。
数字信号处理后的数据可能需还原为模拟信号,这就需要进行D/A转换。
一个仅包括A/D和D/A两部分的简化数字信号处理系统功能如图1所示。
图1简化数字信号处理系统功能框图
DSP系统的输入信号多种多样,但一般都要转换为模拟信号,经过抗混叠滤波后由模数转换芯片将模拟信号变换为数字信号。
然后,DSP根据实际需要对其进行相应的处理,如FFT、卷积等;
处理后的数字信号再由数模转换芯片将其转换为模拟值,在对其进行平滑滤波后最终输出模拟信号。
需要说明的是,对输入模拟信号的采样频率要大于其本身频率的两倍,因为根据奈奎斯特采样定律,只有采样频率至少为输入信号频率的两倍时输入信号的信息才保证不会丢失。
设计带阻滤波器,其中N+1为滤波器阶数,b为返回的长度为N+1的系数向量。
Wn为归一化边界频率,0<
Wn<
1.0,Wn处增益为-6dB。
Wn=1.0对应的非归一化频率为Fs/2,其中Fs为采样频率。
本设计中,设Fs=8000Hz,设计带通阻波器,格式为:
b=fir1(N,Wn)或b=fir1(N,Wn,'
stop'
)其中Wn=[W1W2],W1、W2为边界频率,当带阻滤波器的边界频率fp=[1000,3000],则对应的归一化数字角频率为Wn=fp/(Fs/2)=[0.25,0.75]。
执行b=fir1(N,Wn,'
)与b=round(b*32768)指令得到的系数为:
b=[0,0,-28,0,0,0,36,0,0,0,-52,0,0,0,77,0,0,0,-113,0,0,0,161,0,0,0,-223,0,0,0,304,0,0,0,-407,0,0,0,541,0,0,0,-718,0,0,0,965,0,0,0,-1336,0,0,0,1974,0,0,0,-3411,0,0,0,10415,0,16397,0,10415,0,0,0,-3411,0,0,0,1974,0,0,0,-1336,0,0,0,965,0,0,0,-718,0,0,0,541,0,0,0,-407,0,0,0,304,0,0,0,-223,0,0,0,161,0,0,0,-113,0,0,0,77,0,0,0,-52,0,0,0,36,0,0,0,-28,0,0]
注意:
上述滤波器系数为浮点格式,当DSP程序中采用整数格式时。
滤波器系数需相应地变为整数,方法为乘以32768并取整。
(2)设计低通滤波器,格式为:
b=fir1(N,Wn)或b=fir1(N,Wn,'
low'
)。
(3)设计高通滤波器,格式为:
b=fir1(N,Wn,'
high'
)参数意义同上。
(4)设计带通滤波器,格式为:
bandpass'
),其中Wn=[W1W2],W1、W2为边界频率。
采用函数plot(b)可以绘制滤波器的冲击响应图:
图2滤波器的冲击响应图
采用函数freqz(b)可以绘制滤波器的频率响应图:
图3滤波器的频率响应图
2、算法设计
一个滤波器实质上是一个系统或者网络,它以一种期望的模式有选择地改变信号的波形、幅度
频率/相位
频率特性.一般滤波的目的是为了改善一个信号的质量(例如消除或者减少噪声),或者从信号中提取信息,或者把以前为了有效通信信道而组合在一起的2个或多个信号分离出来。
数字滤波器是执行滤波算法的特定硬件或者软件程序.滤波算法是为了达到滤波的目的而对输入信号进行的运算操作,最后产生数字输出信号.数字滤波器处理的对象是数字化的模拟信号,或者是存储在计算机存储器里代表某些变量的数.
设h(i)(i=0,1,2,……,N-1)为滤波器的冲击响应,输入信号为x(n),则FIR滤波器就是要实现下列差分方程:
FIR滤波器的最主要特点是没有反馈回路,因此它是无条件的稳定系统,它的单位脉冲响应h(n)是一个有限长序列.所以,FIR滤波器的算法实际上就是一种乘法累加运算.由此差分方程可
画出对应的网络结构,如图4所示:
图4FIR滤波器结构图
3、软件实现
3.1滤波器系数获取
设计中使用Matlab程序获得滤波器系数向量有两种方法。
方法一,设Fs=8000Hz,当带阻滤波器的边界频率fp=[1000,3000],则对应的归一化数字角频率为Wn=fp/(Fs/2)=[0.25,0.75]。
方法二,使用MATLAB中FDATOOL工具箱进行设置相关参数从而得到滤波器系数向量,在命令窗口输入语句格式为:
fdatool,此时将出现对话框,进行相关设置即可。
3.2滤波器C语言编程实现
带阻FIR滤波器的C55x汇编语言实现如下:
(1)主程序sheji.c
/*sheji.c*/
#include"
math.h"
#defineL129
#defineFs8000/*采样频率*/
#defineT1/Fs/*采样时间*/
#definef1500/*正弦信号1频率*/
#definef21500/*正弦信号2频率*/
#definef32800/*正弦信号3频率*/
#definePI3.1415926
#definew1(2*PI*f1*T)/*正弦信号1数字频率=2*pi*f1/Fs*/
#definew2(2*PI*f2*T)/*正弦信号2数字频率=2*pi*f2/Fs*/
#definew3(2*PI*f3*T)/*正弦信号3数字频率=2*pi*f3/Fs*/
#definea10.333/*正弦信号1幅度*/
#definea20.333/*正弦信号2幅度*/
#definea30.333/*正弦信号3幅度*/
externintfir(int*,int*,unsignedint,int);
/*Low-passFIRfiltercoefficients*/
intcoeff[129]={0,0,-28,0,0,0,36,0,0,0,-52,0,0,0,77,0,0,0,-113,0,0,0,161,0,0,0,-223,0,0,0,304,0,0,0,-407,0,0,0,541,0,0,0,-718,0,0,0,965,0,0,0,-1336,0,0,0,1974,0,0,0,-3411,0,0,0,10415,0,16397,0,10415,0,0,0,-3411,0,0,0,1974,0,0,0,-1336,0,0,0,965,0,0,0,-718,0,0,0,541,0,0,0,-407,0,0,0,304,0,0,0,-223,0,0,0,161,0,0,0,-113,0,0,0,77,0,0,0,-52,0,0,0,36,0,0,0,-28,0,0
};
intin[129];
/*inputbuffer*/
intout[129];
/*Outputbuffer*/
main()
{
unsignedinti;
floatsignal;
unsignedintn=0;
intindex=0;
for(i=0;
i<
L;
i++)
{
in[i]=0;
out[i]=0;
}
while
(1)
{
signal=a1*cos((float)w1*n);
signal+=a2*cos((float)w2*n);
signal+=a3*cos((float)w3*n);
n++;
in[index]=(int)((0x7fff*signal)+0.5);
out[index]=fir(in,coeff,L,index);
index--;
if(index==-1)index=L-1;
}
(2)汇编语言整数fir滤波器函数:
fir.asm
;
fir.asm该程序用于实现FIR滤波器,可被C语言程序调用
intfir(int*,int*,unsignedint,int)
参数0:
AR0–输入信号缓冲区指针
参数1:
AR1-FIR滤波器系数向量指针
参数2:
T0-FIR滤波器的阶数L
参数3:
T1-输入信号当前值在循环缓冲区的序数
返回值:
T0-输出信号当前值
.global_fir
.def_fir
_fir
pshmST1_55;
现场ST1,ST2和ST3入栈
pshmST2_55
pshmST3_55
or#0x340,mmap(ST1_55);
设置FRCT,SXMD,SATD
bsetSMUL;
置位SMUL
movmmap(AR0),BSA01;
AR0=输入信号循环缓冲区的起始地址
movmmap(AR1),BSA23;
AR1=滤波器系数循环缓冲区的起始地址
movmmap(T0),BK03;
设置循环缓冲区大小
or#0x5,mmap(ST2_55);
AR0和AR2为循环缓冲区指针
movT1,AR0;
AR0从index偏移量开始
mov#0,AR2;
AR2从0偏移量开始
sub#2,T0;
T0=L-2
movT0,CSR;
设置外部循环次数为L-1
mpym*AR0+,*AR2+,AC0;
执行第一次运算
||rptCSR;
启动循环
macm*AR0+,*AR2+,AC0
movhi(AC0),T0;
用Q15格式存放结果
popmST3_55;
恢复ST1,ST2和ST3
popmST2_55
popmST1_55
ret
.end
3个辅助寄存器AR0-AR2被用作指针。
其中,AR0指向滤波器输入信号,AR1、AR2指向滤波器系数,AR1用于函数调用时传递参量,AR2用于滤波运算。
AR0和AR2均采用循环寻址方式。
开始滤波运算时,AR2指向第一个系数,AR0则指向当前输入信号x(n)。
完成一次滤波运算后,AR2将再次指向第一个系数,而AR0则指向最老的x(n-L+1)。
在下一循环的滤波运算中,新的输入信号值将取代x(n-L+1),作为新的x(n)。
4、设计步骤
1、选题后确定实验计划,搜集基本资料。
2、编写实验程序如下:
sheji.c为主程序,用于设置滤波器、测试信号参数,产生测试信号,调用fir滤波程序。
fir.asm为采用汇编语言编写的fir滤波模块,完成对信号的滤波。
sheji.cmd为命令文件
3、实验准备:
双击桌面图标,启动CodeComposerStudio,选择工作目录。
4、建立工程sheji。
5、向工程sheji中加载文件sheji.c、fir.asm、sheji.cmd,修改sheji.c中的滤波器系数数据。
6、建立配置文件sheji.ccxml(选择VC5509ASimulater模式),如下所示:
图5配置文件sheji.ccxml仿真器模式选择
7、编译、链接工程,下载程序。
8、运行程序至主程序的“index--”语句,打开图形观察窗口。
观察滤波器系数波形、观察滤波器输入信号、输出信号波形。
9、全速运行程序,数秒钟后暂停。
观察滤波器输入信号、输出信号波形。
10、改变输入信号参数(信号频率、幅度等),重复上述第6、7、8步操作,验证实验结果的正确性。
11、退出CCS。
五、实验结果与分析
1、实验现象、数据记录
(1)使用MATLAB软件获取滤波器向量,其结果如下:
方法一,直接利用MATLAB命令窗口输入语句如下图6所示,从而获得滤波器系数向量。
图6滤波器系数向量获取(方法一)
方法二,利用MATLAB中的fdatool工具箱获得滤波器系数向量如图7、图8所示:
图7fdatool设置窗口
图8滤波器系数向量获取(方法二)
(2)运行程序至主程序的“index--”语句,打开图形观察窗口,观察滤波器系数波形如下所示:
图9观察滤波器系数波形设置窗口
图10滤波器系数波形
(3)全速运行程序,数秒钟后暂停。
观察滤波器输入信号、输出信号波形如下:
此时,输入信号为三个正弦波的叠加,其频率分别为f1=500Hz,f2=1500Hz,f3=2800Hz,幅值均为0.333。
图11观察输入信号波形设置窗口
图12滤波器输入信号波形
图13观察输出波形设置窗口
图14滤波器输出信号波形
结果分析:
此时,输出信号为一个正弦波,其频率分别为f1=500Hz幅值为0.333,经验证,带阻滤波器实现了对信号的滤波作用。
由于阻带低端频率和高端频率分别为1000Hz、3000Hz,因此,滤波器将原有的输入信号中的两个分量滤去,即频率为f2=1500Hz,f3=2800Hz的信号被阻隔,仅有f1=500Hz的信号作为输出信号,由结果可知,输出信号正确,即带阻滤波器设计正确。
(4)改变输入信号参数(信号频率、幅度等),重复上述第6、7、8步操作,全速运行程序,数秒钟后暂停。
此时,输入信号为三个正弦波的叠加,其频率分别为f1=500Hz,f2=1500Hz,f3=4000Hz,幅值均为0.333。
图15滤波器输入信号波形
图16滤波器输出信号波形
此时,输出信号为两个正弦波的叠加,其频率分别为f1=500Hz,f3=4000Hz幅值为0.333,经验证,带阻滤波器实现了对信号的滤波作用。
由于阻带低端频率和高端频率分别为1000Hz、3000Hz,因此,滤波器将原有的输入信号中的一个分量滤去,即频率为f2=1500Hz的信号被阻隔,而f1=500Hz,f3=4000Hz的叠加信号作为输出信号,由结果可知,输出信号正确,即带阻滤波器设计正确。
2、对实验现象、数据及观察结果的分析与讨论:
本次设计圆满完成了基于DSP的FIR带阻滤波器的设计与实现,完成了带阻滤波器的基本功能。
3、关键点:
(1)带阻滤波器原理的设计与实现。
(2)MATLAB软件进行波形向量的获取与使用。
(3)CodeComposerStudio4.2软件的应用与学习,学会利用软件设计各种数字滤波器,并进行输入输出结果的仿真和记录。
六、实验结论
采用MATLAB中的fdatool工具箱来对数字滤波器进行辅助设计,实现了基于DSPTMS320C55x芯片的数字带阻滤波器。
该滤波器的应用,不仅克服了模拟滤波器的诸多缺点,而且由于DSP具有良好的可编程性、程序的可移植性及较好的灵活性,所以在实际应用过程中,只按需求在设计界面中修改滤波器的参数,并通过程序的少量的修改,即可方便快捷地设计具有新的需求的数字滤波器,提高了开发效率,缩短了产品的开发周期,提高了检测精度,达到了预期的目的。
七、附件:
源程序清单
1、主程序sheji.c
Intcoeff[129]={0,0,-28,0,0,0,36,0,0,0,-52,0,0,0,77,0,0,0,-113,0,0,0,161,0,0,0,-223,0,0,0,304,0,0,0,-407,0,0,0,541,0,0,0,-718,0,0,0,965,0,0,0,-1336,0,0,0,1974,0,0,0,-3411,0,0,0,10415,0,16397,0,10415,0,0,0,-3411,0,0,0,1974,0,0,0,-1336,0,0,0,965,0,0,0,-718,0,0,0,541,0,0,0,-407,0,0,0,304,0,0,0,-223,0,0,0,161,0,0,0,-113,0,0,0,77,0,0,0,-52,0,0,0,36,0,0,0,-28,0,0};
{signal=a1*cos((float)w1*n);
2、滤波器函数:
popmST