基于DSP的数字滤波器的设计与仿真

发布时间:2018-07-01 11:42:19

2.1系统功能介绍

一个实际的应用系统中,总存在各种干扰。数字滤波器在语音信号处理、信号频谱估计、信号去噪、无线通信中的数字变频以及图像信号等各种信号处理中都有广泛的应用,数字滤波器也是使用最为广泛的信号处理算法之一。

在本设计中,使用MATLAB模拟产生合成信号,然后利用CCS进行滤波。设定模拟信号的采样频率为48000Hz,。设计一个FIR低通滤波器,其参数为:

滤波器名称: FIR低通滤波器

采样频率: Fs=48000Hz

通带截止频率 15000Hz

阻带截止频率: 16000Hz

通带最大衰减 0.1dB

阻带最少衰减: 80dB

滤波器系数: MATLAB根据前述参数求得。

2.2 总体设计方案流程图

1 总体设计方案


主要内容和步骤

3.1 滤波器原理

对于一个FIR滤波器系统,它的冲击响应总是又限长的,其系统函数可记为:

其中FIR的滤波器的阶数,为延时结,为端口信号函数。

最基本的FIR滤波器可用下式表示:

其中输入采样序列,是滤波器系数,是滤波器的阶数表示滤波器的输出序列,也可以用卷积来表示输出序列的关系,如下:

3.2 操作步骤

1)打开FDATOOL,根据滤波要求设置滤波器类型、通带截止频率、指定阶数、采样频率等。指定完设计参数后单击按钮Design Filter,生成滤波器系数。

2)把生成的滤波器系数传到目标DSP。选择菜单Targets->Export to Code Composer Studio(tm)IDE,打开Export to C Header File对话框,选择C header file,指定变量名(滤波器阶数和系数向量),输出数据类型可选浮点型或32 b16 b整型等,根据自己安装选择目标板板号和处理器号,单击OK,保存该头文件,需指定文件名(filtercoeffh)和路径(保存在c\ti\myprojects\fir工程中)

3)修改CCS汇编程序,删掉数据前的所有文字,在开头加上.data,第二行加coeff .word,在每行的前面加上.word,比且把每行的最后的逗号去掉。

4)编译汇编程序,如果有错误,按错误进行修改;没错误,则往下执行。

5)加载初始化DATA数据。运行程序,查看输入输出波形,修改相应参数进行调试


4 详细设计

在本实验中使用MATLAB模拟产生信号,观察滤波前的时域波形和频域波形。MATLAB仿真后,使用得到的滤波器参数,进行DSP编程,在DSP中实现带通滤波,并使用CCS的频谱分析功能,查看DSP的滤波效果。

MATLAB程序流程图如图4.1所示

4.1 MATLAB程序流程图

CCS汇编程序流程图如图4.2所示

4.2 CCS汇编程序流程图


5 实验过程

5.1 汇编语言实验步骤与内容

MATLAB辅助DSP 实现FIR ,其总体过程为在DSP 中编写处理程序,在MATLAB中利用滤波器设计、分析工具( FDATOOL) ,根据指定的滤波器性能快速设计一个FIR ,然后把滤波器系数以头文件形式导入CCS ,头文件中MATLAB 辅助DSP 实现FIR 数字滤波器含滤波器阶数和系数数组,MATLAB中调试、运行DSP 程序并显示、分析处理后的数据。使用该方法,便于采用汇编语言来实现程序。头文件名不变,MATLAB中设计的滤波器系数改变时,相应头文件中系数也改变,方便了程序调试、仿真。

1)在MATLAB中先编写程序,查看待滤波和已滤波的信号的时域和频域波形,如图5.1和图5.2所示。

5.1 待滤波信号的时域图 5.2 待滤波信号的频域图

利用FDA TOOL 设计FIR 滤波器的参数,操作步骤如图5.3所示。

5.3 FIR滤波器的参数

打开Export,把Numerator改为B,如图5.4所示。

5.4 Export设置

已滤波的信号的时域和频域波形,如图5.5和图5.6所示。

5.5 已滤波信号时域波形图 5.6 已滤波信号频域波形图

MATLAB滤波器设计工具在完成FIR设计后,如图5.7所示,在Export as中选择16bit符号整数输出,然后单击OK按钮。生成fir.h C语言头文件。将系数稍作修改,调整后拷贝到程序的系数初始化空间即可。

5.7 MATLAB输出数值转换

2)在CCS中编写汇编语言程序,进行调试,实现带通滤波的功能。在CCS IDE 中建立LHM.pjt工程,用汇编语言编写处理主程序fir.asm。另外根据板上的存储器配置方式,编写存储器配置文件fir.cmd文件,MATLAB生成的LHM.hinput1.dat文件拷贝到LHM.pjt工程文件夹下,进行编译、链接,生成可执行文件LHM.out

3)加载初始化data数据,图5.8所示。

5.8 data初始化图

运行程序,查看输入输出波形,修改相应参数进行调试。

5.2 实验过程中出现的错误及解决的办法

1)在MATLAB程序设计中,采样频率设置的过小,截止频率大于采样频率的一半,运行的时候图形出现错误。

2FIR.m中的采样频率要和开始设置时的采样频率一致,否则结果会出现偏差。

3)在CCS中未定义标号,程序运行错误。

4)在.h文件中未把coeff顶格写,编译时出现错误。

5)未将fir.hinput.dat文件考入工程文件中。

6)间接寻址过程中,程序中丢失。

(7) ViewGraph中单击Time/frequency出现graph property dialog框,未修改抽样点数。显示的图形出现差异

5.3 CCS程序运行后的各种输出结果

ViewGraph中单击Time/frequency出现graph property dialog框。

将显示类型,图形名称,起始地址,抽样点数,数据类型等分别进行设置,输出各种波形。输出滤波前的信号时域波形。首先,设置如图5.9所示,输出滤波前的信号时域波形。

5.9 Graph property dialog设置框图

单击OK后生成如下图5.10波形。

5.10滤波前信号波形图

5.10为滤波前的信号,波形很杂乱,从时域上很难看出信号的周期性。修改相应设置,输出如图5.11所示滤波前信号频谱。

5.11滤波前信号频谱波形图

经过滤波后,时域波形频谱波形如图5.125.13所示。

5.12 滤波后信号时域波形图

5.13 滤波后信号频谱图

由上述的所有截图可知,输入参数中,通带截止频率和阻带截止频率是比较重要的两个参数,不宜过小,过小滤掉的高频成分太多,很难还原出远波形的形状,也不宜过大,过大滤波效果欠佳。在本课程设计中,通带截止频率选用4000Hz,阻带截止频率选用4500Hz,因此,显示图形时的,时域显示的抽样点数为1024,频域显示的带宽为0.5Hz对比滤波前后信号的时域图5.105.12、频谱波形图5.115.13可以知道,滤波前的时域信号的波形图的波形很杂乱,很难看出信号的周期性,滤波后周期性也相对的明显起来了;滤波前信号分布在整个频带上,滤波后阻带范围内的基本被滤掉,这些都可以从上述截图看出。


附件:源程序清单

用线性缓冲区实现FIR滤波器程序清单:

.title “FIR1.ASM”

.mmregs

.def start

x .usect “x”8

PA0 .set 0

PA1 .set 1

.data

COEF .word 1*32768/10

.word 2*32768/10

.word -4*32768/10

.word 3*32768/10

.word -4*32768/10

.word 2*32768/10

.word 1*32768/10

.text

start: SSBX FRCT

STM #x+7,AR2

STM #6,AR0

LD #x+1,DP

PORTR PA1,@x+1

FIR1: RPTZ A,#6

MACD *AR2-,COEF,A

STH A,*AR2

PORTW *AR2+,PA0

BD FIR1

PORTR PA1,*AR2+0

.end

用循环缓冲区实现FIR滤波器程序清单:

.title “FIR2.ASM”

.mmregs

.def start

.bss y,1

xn .usect “xn”,7

b0 .usect “b0”,7

PA0 .set 0

PA1 .set 1

.data

table: .word 1*32768/10

.word 2*32768/10

.word 3*32768/10

.word 4*32768/10

.word 5*32768/10

.word 6*32768/10

.word 7*32768/10

.text

start: SSBX FRCT

STM #b0,AR1

RPT #6

MVPD table,*AR1+

STM #xn+6,AR2

STM #b0+6,AR3

STM #7,BK

STM #-1,AR0

LD #xn,DP

PORTR PA1,@xn

FIR2: RPTZ A,#6

MAC *AR2+0%,*AR3+0%,A

STH A,@y

PORTW @y,PA0

BD FIR2

PORTR PA1,*AR2+0%

.end

汇编程序清单

lhm.h文件内容

.data

coeff .word -85, -64, -61, -36, 8, 62, 110, 136, 131

.word 96, 42, -11, -44, -44, -11, 39, 85, 106

.word 88, 37, -29, -83, -101, -73, -7, 70, 124

.word 131, 82, -5, -96, -151, -144, -72, 37, 140

.word 191, 162,61, -76, -191, -231, -174, -35, 132

.word 256, 278, 180, -7, -208, -337, -330, -176, 72

.word 316, 445, 392, 156, -178, -475, -599, -470, -108

.word 361, 745, 857, 594, -6, -748, -1336, -1456, -893

.word 386, 2192, 4154, 5816, 6768, 6768, 5816, 4154, 2192

.word 386, -893, -1456, -1336, -748, -6, 594, 857, 745

.word 361, -108, -470, -599, -475, -178, 156, 392, 445

.word 316, 72, -176, -330, -337, -208, -7, 180, 278

.word 256, 132, -35, -174, -231, -191, -76, 61, 162

.word 191, 140, 37, -72, -144, -151, -96, -5, 82

.word 131, 124, 70, -7, -73, -101, -83, -29, 37

.word 88, 106, 85, 39, -11, -44, -44, -11, 42

.word 96, 131, 136, 110, 62, 8, -36, -61, -64

.word -85

Fir.asm内容

.title "fir.asm"

.mmregs

.global _c_int00

ORDER .set 154

D_LEN .set 1024 ; The Length of Input Data

xn .usect "xn", (ORDER-1)

a0 .usect "a0", (ORDER-1)

input .usect "input", D_LEN

output .usect "output", D_LEN

.copy "HM.h" ; Get coefs from "coef.h"

.text

.asg AR0, FIR_INDEX

.asg AR2, FIR_DATA

.asg AR3, FIR_COEF

.asg AR5, DATA_IN

.asg AR6, DATA_OUT

_c_int00:

SSBX FRCT

STM #a0,FIR_COEF ; Copy a0(coefs) to FIR_COEF(AR3)

RPT #ORDER-1

MVPD #coeff,*FIR_COEF+

STM #1, FIR_INDEX

STM #xn, FIR_DATA ; Copy xn(data) to FIR_DATA(AR2)

RPTZ A,#ORDER-1

STL A, *FIR_DATA+

STM #(xn+ORDER-1), FIR_DATA

STM #(a0+ORDER-1), FIR_COEF

STM #input, DATA_IN ; Get data from "input"

STM #output, DATA_OUT ; Write data to "output"

STM #D_LEN-1, BRC

RPTBD next-1

STM #ORDER, BK

LD *DATA_IN+, A

FIR: STL A, *FIR_DATA+%

RPTZ A, (ORDER-1)

MAC *FIR_DATA+0%, *FIR_COEF+0%, A ; FIRS

STH A, *DATA_OUT+

next

FIR_END:

B FIR_END

.end

FIR.m的程序如下

fs=40000; %/采样Hz

N=1024 %数据个数

T=1/fs; %采样周期

n=0:N-1;

df=n*(fs/N)%待滤波信号波形

xin=randn(1,1024)

figure(1)

plot(xin)%待滤波信号频谱

xinff=abs(fft(xin));

figure(2)

plot(df,xinff)%滤波后信号波形

y_filter_out=filter(B,1,xin)% Y = FILTER(B,A,X)

figure(3)

plot(y_filter_out)%滤波后信号频谱

yff=fft(y_filter_out);

figure(4)

plot(df,yff)

xin=xin/max(xin);%归一化

xto_ccs=round(32767*xin)%取整

fid=fopen('input1.dat','w');%打开文件

fprintf(fid,'1651 1 0 0 0\n');%输出文件头

fprintf(fid,'%d\n',xto_ccs);%输出

fclose(fid);

基于DSP的数字滤波器的设计与仿真

相关推荐