FIR 滤波器的DSP 实现*
2012-12-22谢海霞孙志雄
谢海霞,孙志雄
(琼州学院电子信息工程学院,海南 三亚572022)
从20 世纪60 年代以来,随着信息技术、计算机和半导体集成电路的飞速发展,数字信号处理DSP(Digital Signal Processing)技术应运而生并得到迅速发展。在数字信号处理中,滤波占有极其重要的地位。数字滤波器可分为无限脉冲响应(IIR)数字滤波器和有限脉冲响应(FIR)数字滤波器。IIR 滤波器的最大缺点就是不容易实现线性相位,而在语音、图像、数据通信等系统普遍都要求数字滤波器具有线性相位特性,FIR 滤波器正是因为具有线性相位特性而获得了广泛的应用。用DSP 芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好的特点。用可编程DSP 芯片实现数字滤波可通过修改滤波器的参数十分方便地改变滤波器的特性[1-4]。
1 FIR 数字滤波器的结构
FIR 滤波器只存在N 个抽头h(n),N 也称为滤波器的阶数,单位脉冲响应h(n)是有限长序列,则滤波器的输出是每一分节的输出加权累加,其数学表达式为:
很明显,这就是线性时不变系统的卷积和公式,也就是输入信号x(n)的延时级联的横向结构。根据式(1)可得FIR 滤波器的横向结构,如图1 所示[5-6]。
图1 FIR 滤波器的横向结构示意图
因此,要设计一个FIR 滤波器关键是从所需的FIR 滤波器性能指标来确定单位脉冲响应h(n)。下面以设计一个FIR 低通滤波器为例,说明采用MALTAB 和DSP 相结合来设计FIR 滤波器的实现方法。其设计的流程如图2 所示。
图2 用MATLB 和CCS 实现FIR 滤波器的流程图
2 FIR 滤波器的系数设计
2.1 设计指标
本文设计的FIR 数字滤波器是低通滤波器,其设计指标为:采样频率是100 kHz,通带截止频率5 kHz,阻带截止频率10 kHz,通带最大衰减0.1 dB,阻带最小衰减65 dB。
2.2 抽头系数确定
FDATool 是MATLAB 信号处理工具箱里专用的滤波器设计分析工具。FDATool 中可以灵活地采用不同方法设计几乎所有的经典滤波器,查看滤波器的各种指标,并得到所设计滤波器的系数[7-9]。图3是FDATool 操作界面,图中下半部分是用来设置滤波器的设计参数,根据设计指标,选择Kaiser 窗设计方法,填写数据,Fs=100 kHz,Fpss=5 kHz,Fstop=10 kHz,Ap=0.1 dB,Astop=65 dB,上半部分是显示滤波器各种特性,其中包括设计滤波器所需最少的阶数是80、直接型结构及良好的幅频响应特性。
图3 FIR 数字低通滤波器频域特性图
最后导出C header file 类型文件,得到设计的滤波器的参数,其长度和抽头系数如下:
const int BL=81;
const int16_T B[81]={0,-2,-6,-10,-13,-13,-7,5,21,39,53,57,44,14,-32,-86,-134,-161,-152,-97,0,127,256,355,387,325,161,-92,-394,-679,-871,-893,-683,-214,504,1411,2410,3380,4189,4727,4915,4727,4189,3380,2410,1411,504,-214,-683,-893,-871,-679,-394,-92,161,325,387,355,256,127,0,-97,-152,-161,-134,-86,-32,14,44,57,53,39,21,5,-7,-13,-13,-10,-6,-2,0};
3 MATLAB 产生输入信号
用MALTAB 产生该滤波器的待测信号,该信号包含输入信号频率fa为3 kHz、fb为5 kHz 和fc为12 kHz 3 种合成信号,用于滤波器滤波效果测试,采样频率Fs为100 kHz,通过设计的低通滤波器将12 kHz 信号滤除。下面是MALTB 输入信号程序,导出名为input.dat 文件,方便导入CCS 环境。
fa=3000; % /Hz
fb=5000;
fc=12000;
fs=100000; % /采样频率100 kHz
N=1200 %数据个数
T=1/fs; %采样周期
n=0:N;
xa=cos(2* pi* fa* n* T);
xb=sin(2* pi* fb* n* T);
xc=0.5* cos(2* pi* fc* n* T);
x_lubo=(xa+xb+xc);
figure(1)
plot(x_lubo) %待滤波信号波形
figure(2)
yff=abs(fftshift(fft(x_lubo)));
df=n* (fs/N)-fs/2
plot(df,yff) %待滤波信号频谱
xout=x_lubo/max(x_lubo); %归一化
x_ccs=round(32768* xout); %采用定点Q15 表示,然后四舍五入取整
fid=fopen('input.dat','w'); %打开文件,将此文件定义为可写,fid 是此文件的整数标示
fprintf(fid,'1651 1 0 0 0 '); %输出文件头,只有此文件头DSP 芯片才能识别
fprintf(fid,'%d ',x_ccs); %输出x_ccs,并写到input.
dat 文件里
fclose(fid);
运行以上的程序,可得到三种合成信号如图4所示,利用MATLAB 中的fftshift(x)函数该信号的频谱重排,其频谱图如图5 所示,在3 kHz、5 kHz 和12 kHz 处有谱线。
图4 待滤波信号波形
图5 待滤波信号频谱
4 FIR 滤波器的DSP 实现
TI 公司推出可视化的CCS 集成开发工具,它集代码生成软件和代码调试工具于一体,具有强大的应用开发功能,为DSP 用户提供了十分便利的开发环境[10-12]。
在CCS 上建立FIRfilter 工程,编写实现FIR 低通滤波器的FIRfilter.c 程序:
#include "stdio.h"
#include "coef.h"
//coef.h 为Matlab 生成的系数表头文件
#define N 81 //FIR 滤波器的级数+1,本例中滤波器级数为80
#define LEN 200 //待滤波的数据长度
long yn;
int input[LEN]; //输入缓冲,在仿真时将从内存载入
int output[LEN]; //输出缓冲,直接存放在内存中
void main()
{
int i,j;
int * x;
for(j=0;j<LEN-1;j++)
{
x=&input[j];
yn=0;
for(i=0;i<N-1;i++)
yn+=B[i]* (* x++);
output[j]=yn≫15;
}
while(1);
}
最后将MATLAB 导出的头文件coef. h 和链接文件FIRfilter.cmd 添加到工程中,对程序进行调试、链接;调试无误后生成FIRfilter. out 程序,将该文件装载入内存,然后进行仿真。仿真时用MATLAB 生成的input.dat 作为仿真测试文件。
采用CCS 图形显示功能,图6 和图7 左边是观察到的输入信号时域波形,而右边对应的是频域波形。和图6 的仿真波形相比较可知,图7 中12 kHz信号被滤掉,仿真结果与输出信号理论吻合,仿真结果正确。
图6 输入信号时域和频域波形图
图7 输出信号时域和频域波形图
5 结束语
采用MATLAB 软件来辅助DSP 平台实现FIR低通滤波器,大大简化了数字滤波器的设计,并且通过CCS 仿真图形说明了该设计、验证的方法都是可行的,而且根据不同实际应用来改变滤波器参数即可实现各种类型的滤波器,灵活性好,具有很高的实用性。
[1] 张雄伟,曹铁勇,陈亮,等. DSP 芯片的原理与开发应用[M].北京:电子工业出版社,2008.
[2] 刘悦.FIR 数字滤波器的设计与实现[J]. 信息技术,2009(2):8-9.
[3] 史明泉.基于DSP 的FIR 滤波器的C 语言算法实现[J]. 无线电工程,2011,41(1):13-14.
[4] 赵顺珍,马英.基于DSP 的FIR 数字滤波器设计与实现[J].微计算机信息,2009,25(2):162-163.
[5] 谢海霞,孙志雄.可编程FIR 滤波器的FPGA 实现[J]. 电子器件,2012,35(2):232-235.
[6] 陈后金,薛健,胡健.数字信号处理[M].2 版. 北京:高等教育出版社,2008.
[7] 郑争兵.基于MATLAB 和DSP 的数字滤波器设计[J]. 电子质量,2011(10):30-31.
[8] 李娟. MATLAB 平台下的FIR 数字滤波器设计与分析[J].Journal of Science of Teachers’College and University,2010,30(3):64-67.
[9] 彭启琮.DSP 集成开发环境:CCS 及DSP/BIOS 的原理与应用[M].北京:电子工业出版社,2004.
[10] 万永革.数字信号处理的MATLAB 实现[M]. 北京:科学出版社,2007.
[11] 赵红怡. DSP 技术与应用实例[M]. 北京:电子工业出版社,2003.
[12] 戴明桢,周建江. TMS320C54xDSP 结构、原理及应用[M]. 4版.北京:北京航空航天大学出版社,2008.