基于DSP的FIR数字低通滤波器设计.docx
《基于DSP的FIR数字低通滤波器设计.docx》由会员分享,可在线阅读,更多相关《基于DSP的FIR数字低通滤波器设计.docx(25页珍藏版)》请在冰豆网上搜索。
![基于DSP的FIR数字低通滤波器设计.docx](https://file1.bdocx.com/fileroot1/2022-11/24/e33533c5-5f79-428b-8977-1c9a0abdcca9/e33533c5-5f79-428b-8977-1c9a0abdcca91.gif)
基于DSP的FIR数字低通滤波器设计
电气控制技术应用设计
题目基于DSP的FIR数
字低通滤波器设计
二级学院电子信息与自动化学院
专业电气工程及其自动化
班级113070404
学生姓名黄鸿资学号
学生姓名姜天宇学号
指导老师蒋东荣
时间:
2021年8月29日至2021年9月9日
考核工程
平时成绩20分
设计35分
报告15分
辩论30分
得分
总分
考核等级
老师签名
摘要
DSP芯片是一种特别合适数字信号处理运算的微处理器,主要用来实时、快速实现各种数字信号处理算法。
FIR数字滤波器具有严格的线性相位、总是稳定等特点而广泛应用于数字信号处理的各个领域,是一个重要的研究课题。
本文主要研究了低通数字滤波器的根本理论,在MATLAB坏境下设计FIR低通数字滤波器,主要用窗函数法及利用MATLAB的滤波器设计工具的设计方法,编写相应的MATLAB语言,进展详细的仿真分析。
用TMS320C5402的DSP芯片软件,编写了DSP的FIR低通数字滤波算法,用MATLAB中生成的滤波器系数导入DSP中设计的滤波器函数中。
在ccs环境中,首先根据算法编写C语言文件,在编写完成后再编写cmd文件和在库中添加lib文件保证C语言程序文件可以正确编译链接。
DSP的输入信号可以又MATLAB软件进展编写,在程序测试的时候可以导入进展观察。
在这次课程设计末尾,为了验证DSP设计的低通滤波器相对于运算放大器所设计的硬件电路的优势,利用protues软件和FilterPro软件进展硬件电路的设计仿真。
采用信号发生器产生所需信号,利用示波器显示。
将DSP设计的滤波器与硬件设计的滤波器进展比拟分析其优劣。
最后根据得到的结果对滤波后的结果进展分析,找出设计过程中存在的问题,并想方法从电路元件或者软件算法方面对其进展一定改进。
通过这次课程设计可以掌握CCS,MATLAB,protues等软件的根本使用和焊接简单电路的动手才能。
关键词:
数字低通滤波器FIRMATLABTMS320C54XXDSP
引言
现代生活中,越来越多的电子产品把数字信号处理〔DSP)作为技术核心,DSP已经作为推动数字化进程的动力。
作为数字化最重要的技术之一,DSP无论是在其应用领域的深度还是广度,正在以前所未有的速度开展。
数字信号处理器,也称DSP芯片,是针对数字信号处理需要而设计的一种具有特殊构造的微处理器。
随着数字化技术的飞速开展,DSP在电子信息、通信、无线电、自动控制、仪表技术等方面应用广泛。
在数字信号处理中,数字滤波器占有极其重要的位置。
是象处理、指纹识别、形式识别、谱分析等应用中一个根本的处理算法。
在许多信号处理应用中运用数字信号滤波器代替模拟信号滤波器有很大的优势,数字信号滤波器容易实现不同幅度和相位频率特性指标,克制了与模拟信号处理器性能相关的电压漂移、温度漂移和噪声问题。
用DSP实现数字滤波具有稳定性好、准确度高和不受环境影响。
数字滤波器又分为无限冲激响应滤波器(IIR)和有限冲激响应滤波器(FIR)。
FIR滤波器具有不含反应环路、构造简单以及可以实现的严格线性相位等优点,因此在对相位要求比拟严格的条件下,采用F1R数字滤波器。
同时,由于在许多场合下,需要对信号进展实时处理,因此对于单片机的性能要求也越来越高。
采用DSP控制器就可以进步数字信号处理运算的才能,可以对数字信号做到实时处理。
而普通的单片机例如MCS-51难以满足这一要求。
用可编程DSP芯片实现数字滤波的又一优势是:
通过修改滤波器的参数非常方便的改变滤波器的特性。
有限长单位冲激响应((FIR)数字滤波器,与传统的通过硬件电路实现的模拟滤波器相比有以下优点:
(1)简化了硬件电路的设计,进步了硬件电路的集成度和可靠性。
(2)对干扰信号的抑制才能有了明显进步,这对系统的控制精度和稳定性的进步起到了促进作用。
(3)数字滤波器的参数调节比起模拟滤波器来更加方便、灵敏。
(4)数字滤波器可以实现数据的并行处理,进步了系统运行速度。
一绪论
(一)课题设计的目的
设计的目的首先是为了纯熟使用DSP,利用所学的数字信号处理知识设计一FIR滤波器,并在基于DSP平台的仿真软件CCS下通过软件模拟仿真实现根本的滤波功能,其中输入信号和滤波器的各个参数根据设计要求自行确定。
首先可以借助Matlab来产生输入数据,并根据输入信号确定滤波器参数,然后根据产生滤波器参数在CCS下编写程序实现滤波器功能,最后进展滤波器性能的测试,完本钱次课程设计。
为了对于设计有帮助首先理解什么是滤波器以及功能和滤波器的根本构造以及工作方式,可以研究滤波器的硬件原理图和数字滤波器的各种算法来加深理解。
〔二〕课题内容
我们小组将课题研究分为两个局部:
一局部为简单的滤波器硬件电路的设计仿真与实物焊接测试。
另一局部着重研究DSP中的滤波器程序的编写与使用matlab软件辅助编写输入文件与滤波器系数。
在完成数据的编写之后,首先在ccs环境中根据选择的滤波器的滤波算法用c语言编写相应程序,随后编写asm,smd文件和添加ti库中的lib文件使得编写的c语言程序可以编译链接并且下载到DSP开发板中进展验证。
〔三〕设计方法
数字滤波器的实现方法一般有几种:
(1)在通用计算机上软件编程实现。
(2)用加法器、乘法器、延时器设计实现专用的滤波电路。
(3)用单片机实现。
(4)用通用的可编程DSP芯片实现。
(5)用专用的DSP芯片实现。
在这几种方法中,第一种方法的速度比拟慢,主要用来进展算法的模拟仿真,只能用于非实时系统;第二种和第五种方法是专用的,应用范围不广;第三种方法比拟容易实现人机接口,但系统比拟复杂,对乘法运算的速度很慢;第四种方法因DSP芯片的哈佛构造、并行构造、指令系统等构造特点,使得数字滤波器比拟好的容易实现。
在这里我们小组采用方法4编写数字滤波器程序框架,使用matlab软件设计滤波器导出系数,最后完成一个完好低通滤波器的设计。
(四〕课程设计的意义
21世纪是数字化的时代,随着越来越多的电子产品将数字信号处理(PSP)作为技术核心,DSP已经成为推动数字化进程的动力。
DSP的数字处理才能可以解决许多问题,例如电机控制,图像处理等等。
我们的课程设计是研究滤波器,一方面要理解滤波器的原理和不同的实现方式,另一方面学习滤波器如何通过编写程序实现。
最终目的是可以在实际环境之中运用滤波器对于采集的信号进展处理完成滤波要求。
二FIR滤波器根本理论
〔一〕FIR滤波器的特点
第一理解数字滤波器的功能,就是把输入序列通过一定的运算变换成输出序列。
它的实现方法有很多,其中比拟常用到的是无限长脉冲响应滤波器IIR和有限长脉冲响应滤波器FIR两种。
在计算量相等的情况下,IIR数字滤波器比FIR滤波器的幅频特性优越,频率选择性也好。
但是,它有着致命的缺点,其相位特性不好控制。
它的相位特性)是使频率产生严重的非线性的原因。
但是在图像处理、数据传输等波形传递系统中都越来越多的要求信道具有线性的相位特性。
在这方面FIR滤波器具有它独特的优点,设FIR滤波器单位脉冲响应h(n)长度为N,其系统函数H(z)是H(N-1)次多项式,它在z平面上有(N-1)个零点,原点z=0是(N-1)阶重极点。
因此,H(z)永远稳定,它可以在幅度特性随意设计的同时,保证准确、严格的线性相位。
〔二〕FIR滤波器的根本构造
数字滤波就是将输入的信号序列,按规定的算法进展处理,从而得到所期望的输出序列,H(z)是1z的N-1次多项式,它在z平面内有N-1个零点,同时在原点处有N-1个重极点。
N阶滤波器通常采用N个延迟单元、N个加法器与N+1个乘法器。
另外,假设对h(n)提出一些约束条件,那么可以很容易地使H(z)具有线性相位,这在信号处理的很多领域是非常重要的。
FIR滤波器的设计任务,是要决定一个转移函数H(z),使它的频率响应满足给定的要求。
这里所说的要求,除了通带频率p、阻带频率及两个带上的最大和最小衰减p和s外,很重要的一条是保证H(z)具有线性相位。
〔三〕Chebyshev逼近法
窗函数法和频率采样法设计出的滤波器的频率特性都是在不同意义上对所给理想频率特性的逼近。
由数值逼近理论可知,对某个函数f(x)的逼近一般有以下三种方法:
插值法(InterpolatingWay)最小平方逼近法(LeastSquareApproachingWay)一致逼近法(ConsistentApproachingWay)切比雪夫最正确一致逼近的根本思想是,对于给定区间[a,b]上的连续函数xf,在所有n次多项式的集合n中,寻找一个多项式p(x),使它在[a,b]上对xf的偏向和其它一切属于n的多项式p(x)对f(x)的偏向相比是最小的,即切比雪夫逼近理论,这样的多项式是存在的,且是唯一的,并指出了构造这种最正确一致逼近多项式的方法,就是有名的“交织点组定理〞。
三用MATLAB辅助DSP设计FIR滤波器
在进展设计过程中首先利用matlab进展滤波器的设计,在这里运用了两种方法进展滤波器的设计,一种为利用matlab自带的fir函数进展设计,并利用matlab自带的命令进展输入信号的编写并且输出输出信号的幅频曲线与相频曲线图。
第二种使用matlab的FDATool工具进展滤波器的设计得到的滤波器参数,同时使用matlab软件编写“〞文件,详细内容为三个正弦函数叠加生成的含有高次谐波的正弦信号。
总流程图
〔一〕利用fir函数设计FIR滤波器并在在MATLAB环境仿真
MATLAB辅助DSP实现FIR,其总体过程为在DSP中编写处理程序,在MATLAB中利用滤波器设计、分析工具(FDATOOL),根据指定的滤波器性能快速设计一个FIR,再把滤波器系数以头文件形式导入CCS中,头文件中MATLAB辅助DSP实现FIR数字滤波器含滤波器阶数和系数数组,在MATLAB中调试、运行DSP程序并显示、分析处理后的数据。
使用该方法,便于采用汇编语言来实现程序。
头文件名不变,当MATLAB中设计的滤波器系数改变时,相应头文件中系数也改变,方便程序调试、仿真。
在matlab环境下进展设计与仿真
f1=10;%第一个点频信号分量频率
f2=30;%第二个点频信号分量频率
fs=100;%采样率
T=2;%时宽
B=20;%带宽
n=round(T*fs);%采样点个数
t=linspace(0,T,n);
y=cos(2*pi*f1*t)+cos(2*pi*f2*t);
figure;
plot(t,y);
title('原始信号时域');
xlabel('t/s');
ylabel('幅度');
figure;
fft_y=fftshift(fft(y));
f=linspace(-fs/2,fs/2,n);
plot(f,abs(fft_y));
title('原始信号频谱');
xlabel('f/Hz');
ylabel('幅度');
axis([0500100]);
b=fir1(40,B/(fs/2));%滤波产生指定带宽的噪声信号
figure;
freqz(b);%画滤波器频响
y_after_fir=filter(b,1,y);
figure;
plot(t,y_after_fir);
title('滤波后信号时域');
xlabel('t/s');
ylabel('幅度');
fft_y1=fftshift(fft(y_after_fir));
f=linspace(-fs/2,fs/2,n);
figure;
plot(f,abs(fft_y1));
title('滤波后信号频谱');
xlabel('f/Hz');
ylabel('幅度');
axis([0500100]);
所设计的低通滤波器的幅频特性曲线与相频特性曲线
输入信号的幅频曲线
输入信号的相频曲线
经过滤波后的信号幅频曲线
经过滤波后的信号幅频曲线
〔二〕Matlab中自带工具箱FDATool快速的实现滤波器的设计
假设需要设计一个16阶的FIR滤波器〔h(0)=0〕,给定的参数如下:
(1) 低通滤波器
(2)
(3) 输入序列位宽为9位〔最高位为符号位〕
在此利用MATLAB来完成FIR滤波器系数确实定。
MATLAB集成了一套功能强大的滤波器设计工具FDATool〔FilterDesign&AnalysisTool〕,可以完成多种滤波器的设计、分析和性能评估。
单击MATLAB主窗口下方的“Start〞按钮,选择菜单“ToolBox〞→“FilterDesign〞→“FilterDesign&AnalysisTool〔FDATool〕〞命令
Filter
FDATool界面左下侧排列了一组工具按钮,其功能分别如下所述:
● 创立多速率滤波器〔Create a Multirate Filter〕
● 滤波器转换〔TransForm Filter〕
● 设置量化参数〔Set Quantization Parameters〕
● 实现模型〔Realize Model〕
● 零极点编辑器〔Pole-zero Editor〕
● 导入滤波器〔Import Filter〕
● 设计滤波器〔Design Filter〕
选择其中的按钮,进入设计滤波器界面
滤波器类型〔Filer Type〕为低通〔Low Pass〕
● 设计方法〔Design Method〕为FIR,采用窗函数法〔Window〕
● 滤波器阶数〔Filter order〕定制为15
●
●
最后单击Design Filter图标,让MATLAB计算FIR滤波器系数并作相关分析。
因为FIR滤波器的输出结果经过了一个单位延时单元,所以在FDATool中,把它看成15阶FIR滤波器来计算参数。
因此,设置滤波器阶数时,要比要求的小1。
计算完FIR滤波器系数以后,往往需要对设计好的FIR滤波器进展相关的性能分析,以便理解该滤波器是否满足设计要求。
分析操作步骤如下:
选择FDATool的菜单“Analysis〞→“MagnitudeResponse〞,启动幅频响应分析如图B.4所示,x轴为频率,y轴为幅度值〔单位为dB〕
选择菜单“Analysis〞→“PhaseResponse〞,启动相频响应分析。
由该图可以看到设计的FIR滤波器在通带内其相位响应为线性的,即该滤波器是一个线性相位的滤波器。
求出的FIR滤波器的系数可以通过选择菜单“Analysis〞→“Filter Coefficients〞来观察。
图中列出了FDATool计算的15阶直接I型FIR滤波器的局部系数。
为导出设计好的滤波器系数,选择FDATool菜单的“File〞→“Export〞命令,翻开Export〔导出〕对话框
〔三〕滤波器设计总结
FIR滤波器实现一般采用窗函数法和等纹波设计法。
窗函数法还包含两个分支,一种是用公式先手动算出N值和其他对应得窗函数参数值,再代入窗函数和fir1实现,一种是用函数*rord估算出N和相应参数再用fir1实现。
不过要注意*rord会低估或高估阶次n,可能会使滤波器达不到指定的性能,这时应略微增加或降低阶次。
假如截止频率在0或Nyquist频率附近,或者设定的dev值较大,那么得不到正确结果。
滤波器实现形式及特点:
由于一般的滤波器在利用窗函数是其通带波纹和阻带波纹不同〔一般为第一个阻带波纹最大〕因此,在满足第一个阻带衰减旁瓣时,比其频率高的旁瓣,它们的衰减都大大超出要求。
而根据阻带衰减与项数的近似关系N=P(δ2)*fs/TW,可得当阻带衰减越大,所需项数越多。
〔四〕DSP所需文件配置
Fdacoefs.h中存放着所设计的滤波器的系数。
Input.dat中为设计好的一个带有杂波的正弦波,用于dsp仿真时的数据输入。
所生成的两个文件,系数文件内的数据到时候直接添加到c语言编写的dsp程序中,input文件用于dsp仿真进展时作为输入信号输入。
四基于DSP的FIR滤波器实现
在完成matlab的FIR滤波器的参数提取与输入文件“〞的编写以后就可以开场dsp的滤波器的实现。
详细思路为:
首先寻找一种滤波器的算法,在这种算法的根底上运用C语言进展程序编写,再编写linkd文件将程序进展编译,之后导入输入信号,利用ccs自带的工具对于前后的波形进展分析。
Dsp中程序运行流程图
〔一〕DSP中滤波器的算法实现
FIR滤波器的输出表达式中x(n)表示滤波器在n时刻的输入;y(n)为n时刻的输出。
它的根本算法是一种乘法-累加运算,即不断地输入样本x(n),经过延时后,再进展乘法-累加,最后输出滤波结果y(n)。
1.线性缓冲区法
线性缓冲区法又称延迟线法,其特点:
〔a〕对于N级的FIR滤波器,在数据存储器中开拓一个N单元的缓冲区〔滑窗〕,用来存放最新的N个输入样本;
b〕从最老样本开场取数,每取一个样本后,将此样本向下移位;
〔c〕读完最后一个样本后,输入最新样本存入缓冲区的顶部。
2.循环缓冲区法
循环缓冲区法的特点如下:
〔a〕对于N级FIR滤波器,在数据存储器中开拓一个N单元的缓冲区〔滑窗〕,用来存放最新的N个输入样本;
〔b〕从最新样本开场取数;
〔c〕读完最后一个样本〔最老样本〕后,输入最新样本来代替最老样本,而其他数据位置不变;
〔d〕用片内BK〔循环缓冲区长度〕存放器对缓冲区进展间接寻址,使循环缓冲区地址首尾相邻。
本次设计的FIR滤波器所采用的就是循环缓冲区法。
〔二〕C语言实现FIR
采用C语言算法在DSP平台上实现了FIR低通数字滤波器,C语言算法相比于汇编算法可移植性很强。
这里是在TMS320VC5510DSP为平台编写的C语言算法,此算法可以稍加改动用在其他DSP芯片上,而汇编算法那么不然。
这种方法具有以下优点:
(a)程序的入口和出口由C语言自动管理,不必手工编写汇编程序实现。
(b)程序构造明晰,可读性强。
(c)程序调试方便。
由于C程序中的变量全部由C语言来定义,因此采用C源码调试器可以方便地观察C语言变量。
(d)可移植性较强,通用性较好。
详细代码如下:
#include"stdio.h"
#include"D:
\extern\include\tmwtypes.h"//fdacoefs.h为Matlab生成的系数表头文件//如运行不通过,请修改fdacoefs.h中的代码,将〞#include〞这行修改为如下:
//#include"d:
\MATLAB7\extern\include\tmwtypes.h"//也就是自己机器上的Matlab安装的绝对途径
#defineN33//FIR滤波器的级数+1,本例中滤波器级数为32
#defineLEN200//待滤波的数据长度
longyn;intinput[LEN];//输入缓冲,在仿真时将从内存载入
intoutput[LEN];//输出缓冲,直接存放在内存中
voidmain()
{inti,j;
int*x;
constint16_TB[33]={
82,22,-127,-268,-240,42,463,702,434,
-382,-1321,-1620,-595,1865,5078,7808,8879,7808,
5078,1865,-595,-1620,-1321,-382,434,702,463,
42,-240,-268,-127,22,82
};
for(j=0;j{x=&input[j];
yn=0;
for(i=0;iyn+=B[i]*(*x++);
output[j]=yn>>15;}
while
(1);
}
〔三〕CSS仿真调试
CCS是TI推出的用于开发其DSP芯片的继承开发调试工具,集编辑、编译、链接、软件仿真、硬件调试及实时跟踪等功能于一体,极大地方便了
DSP程序的设计与开发,此外还提供图形显示功能,方便用户观察特定地址的波形。
此外,还需向工程中添加Link.cmd文件
MEMORY{
PAGE0:
EPROG:
origin=0x1400,len=0x7c00VECT:
origin=0xff80,len=0x80
PAGE1:
USERREGS:
origin=0x60,len=0x1cBIOSREGS:
origin=0x7c,len=0x4
IDATA:
origin=0x80,len=0x1380
EDATA:
origin=0x1400,len=0x8000EDATA1:
origin=0x9400,len=0x4c00}
SECTIONS{
.vectors:
{}>VECTPAGE0
.sysregs:
{}>BIOSREGSPAGE1
.trcinit:
{}>EPROGPAGE0
.gblinit:
{}>EPROGPAGE0
frt:
{}>EPROGPAGE0
.text:
{}>EPROGPAGE0
.cinit:
{}>EPROGPAGE0
.pinit:
{}>EPROGPAGE0
.sysinit:
{}>EPROGPAGE0
.bss:
{}>IDATAPAGE1
.far:
{}>IDATAPAGE1
.const:
{}>IDATAPAGE1
.switch:
{}>IDATAPAGE1
.sysmem:
{}>IDATAPAGE1
.cio:
{}>IDATAPAGE1
.MEM$obj:
{}>IDATAPAGE1
.sysheap:
{}>IDATAPAGE1
.stack:
{}>IDATAPAGE1
}
另外还要导入rts.lib文件,在D:
\DSP\cgtools\lib文件夹下。
在CCSV5中建立工程,把c源代码和d文件导入后,外加rts.lib文件,它是TI提供的运行时支持库。
假如是C代码写的源程序,必需要包含该库该库。
〔四〕滤波器的仿真测试
编译成功后会在〞<工程所以目录>/debug〞文件夹下产生*.out文件,在CCS软件的File->LoadProgram里翻开这个.out文件。
选择File->Data->Load…翻开之前Matlab生成的input.dat文件。
将Address设置为input,Length设置为200,Page设置为Data。
运行程序,点击
按钮,程序即开场运行。
翻开View->Gr