DSP的FIR设计低通滤波C语言编写Word文档下载推荐.docx
《DSP的FIR设计低通滤波C语言编写Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DSP的FIR设计低通滤波C语言编写Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
![DSP的FIR设计低通滤波C语言编写Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/31/dfecdee8-2055-43f0-bf87-16a684b348df/dfecdee8-2055-43f0-bf87-16a684b348df1.gif)
fx,在所有n次多项式的集合n中,寻找一个多项式p(x),使它在[a,b]上
对fX的偏差和其它一切属于n的多项式p(x)对f(x)的偏差相比是最小的,即
max?
xfxminmaxpxfx
切比雪夫逼近理论,这样的多项式是存在的,且是唯一的,并指出了构造这种最
佳一致逼近多项式的方法,就是有名的“交错点组定理”。
切比雪夫逼近理论解决了p(x)的存在性、唯一性和如何构造等问题。
J.H.McClellan、T.W.Parks、L.R.Rabiner等人应用切比雪夫逼近理论提出了一种设计FIR滤波器的计算机辅助算法。
这种算法由于是在一致意义上对Hdejw作最佳逼近,因而获得了较好的通带和阻带性能,并能准确地指定通带和阻带的边缘。
但它的效率依赖于初始极值频率点的估计,且通带和阻带内波纹数较多,这是Chebyshev方法的两个主要缺点。
三、FIR滤波器的MATLAB实现
MATLAB辅助DSP实现FIR,其总体过程为在DSP中编写处理程序,在MATLAB中利用滤波器设计、分析工具(FDATOOL),根据指定的滤波器性能快速设计一个FIR,再把滤波器系数以头文件形式导入CCS中,头文件中MATLAB辅助DSP实现FIR数字滤波器含滤波器阶数和系数数组,在MATLAB中调试、运行DSP程序并显示、分析处理后的数据。
使用该方法,便于采用汇编语言来实现程
序。
头文件名不变,当MATLAB中设计的滤波器系数改变时,相应头文件中系数也改变,方便程序调试、仿真。
(1)输入信号的产生
首先利用Matlab产生导入CCS的dat文件,具体实现如下代码所示
sl=500;
%有效信号
ns1=3000;
%高频噪声
ns2=8000;
fs=20000;
%采样频率
N=1000;
T=1/fs;
n=0:
N;
signal=sin(2*pi*sl*n*T);
noise1=0.7*sin(2*pi*ns1*n*T);
noise2=0.4*sin(2*pi*ns2*n*T);
x=(signal+noise1+noise2)%待滤波信号
figure
(1)
plot(x)
figure
(2)
y=abs(fft(x));
%待滤波频谱
df=n*(fs/N);
plot(df,y)
figure(3)
plot(signal)
figure(4)
ysignal=abs(fft(signal));
%滤波后频谱
plot(df,ysignal)
%滤波数据导出
xout=x/max(x);
%归一化
xto_css=round(32767*xout)%数据取整xoutcss=xto_css;
fid=fopen('
input.dat'
'
w'
);
%打开文件fprintf(fid,'
16511000\n);
%输出文件头fprintf(fid,'
%d\n'
xoutcss);
%输出fclose(fid);
产生的时域波形如图所示:
2
图输入信号波形频谱如图所示:
图输入频谱
经过滤波器后的预期时域波形如图:
图输出时域波形
频谱如图所示
图输出频谱
(2)滤波器的设计
MATLAB集成了一套功能强大的滤波器设计工具FDATool(FilterDesign&
AnalysisTool),可以完成多种滤波器的设计、分析和性能评估。
a打开FilterDesign&
AnalysisTool
单击MATLAB主窗口下方的“Start”按钮,选择菜单“ToolBox”—“Filter
Design”—“FilterDesign&
AnalysisTool(FDATool)”命令,打开FDATool,如图所示
MATLAB
ifjroudonetvanttoacethisncssatT
?
Lcrc
roolooKes
Aero-space
4
Simdink
►
Dioinf>
oirmAb«
卜
■--
Blocksets
Communicadons
i
£
Link.)andTa-gct>
CcritrolSy>
tePii
♦
Shortcuts
CurveFitting
DataArqui^tion
»
De&
ldDplecls
I
Web
CitaF#»
d
•
GetIPreduct『rijls
Epanometrics
t
CheckfarUpdetF)
FilterDesign
l
□
FilterBuilderffilterbuiildler)
%
Prcf*ronc«
E^
FilterDe-sigiriHDLCoder
Fit&
rDr*siqn&
AnayssTool(fdatool)
A
FindFile£
.-
MorCM*
・
HieIp
Help
JL|
Oe-moE.
*
Dtrmos
J
Prcducr岭孑圭(Aeb)
dSUrt
图fadatool的启动
b.产生滤波器阶数为81阶,这里应填80,比阶数少1。
窗函数选择切比雪夫型(chebyshe"
采样频率为20000Hz通带截止频率为750Hz
■FiltrrDesign&
Ajnaly^isTdq--Lumitld&
U'
]
FileEdit曲谊声洛Taig^tiView-曹ndwHelp
i—ZifreriFHb-hfzrmKm
廿EE)ESf■[D1U]0£
]E3町
—UairiludE:
Rc^onoei"
ft)
StrictC'
IKI-FQIIitHP
Cudcr00
決sM宕Vss
SOWSDW賞M
■SlgflglFlWr
rlfrrb'
m&
b
2*5ft?
8»
IgsllBMB园
事Lmp±
3-5-
T
Hqn陛占呂
•脱Ki”琳
BaiKistc?
!
时新“tia(商
V
FiL-rGidei
倉SlKdiVordtr-BU
WtFiUiiur4ri
—Opdcnx
4Scab-Psss-zand
wrao'
/z
Cie-C¥
^
IM
Vlww|
i—FrequcntySpedhkptaie
UrnrL?
.Hz
厂^tscriijjdsif^eciicBfccirs—
Thedteni-iHl-Lri宦culoh
rCCi±
「CiW*Sn-■亡HArtB阳
mairtr«
趣in旳“m曲m
Q
—nEsiacrtieype
■Dn光grU"
沏
|R
图滤波器的幅频特性
聽吐rgllHJ-lltell鬲瓦"
LFJgpogp沖m
7LghwrbwHQhpatsiEnrJpoju9肝翻:
3p口ifTersrliettr一De®
期nMefliKJci
GEiutia<
wartri
甘FR
FKitCi-dsi
Q<
三胆口灯ord*r:
BC
Urrw^iBrfrflF
l□口is址
Jg“trPbi-'
sbjihC
Ml如•<
Oh^By.
sdehbeADshi|iOfr
["
"
itow"
|
FTftLiicriZY唇paufaEDHA
■Jnit-FHz
FvZK»
O
LI与「対Ud心=^p£
rjricdi1liznr2—
Th«
itliKn^tihHl*QF1
hr.ijmtisKfs:
锻壬ed<
LJL
Chelf恤mpesmbandad-
31'
oEa
-
吃
吐
Expwt■.sJQEABlBd
H^^irrtl
«
Enwt>
Mi
日F声*HT^ecttxrt*wslh:
-1
41d
V-fii_:
"
iwarif吧
rkJMi^r-Hij^-'
g叫昨些g*04
FAft1Mifal&
^dr
PT*P亍^«
*«
LQ>
n4Ufelul.
Wanitwlni
Drff*i'
di
Cw<
w
■1-1-vh弓Awf占rni-rr-ivhfli-iumCM-!
<
4ZkE
・rjEMEa:
HmhkIatGiO
>
¥
&
OA—'
i
CMr~wr«
ce
C>
L1-ta-flir-H'
flidii'
^*■.rnli
FiletdrtAnal^EhETargats.ViotxWindiowH«
ilp
口味y◎0
LJ旦1皿把需旳厂匿紀❶国因
—C-urrertFitdi『iimmjll&
n
LRewi!
Rrwiw'
rm
■空口昨FIR
0i■…1.■■…4■■…・L・■・■■』■■・・・■•・・■…L■■…・L■■…4…・■!
・■・・・▼・
v\BFii1-■-■1
■■■■■iBatl
11iiI||ih■>
i|
,”Jx■■«
■■—r—--—=—■■IW>
FBIJ——■=・———,■IB-——"
—=4—==——nJfa=_”..—-”■=Ul■■,=”,=——
a1*tai'
■iIF■-i-I
Order80
E0V!
■•iii■“ji
Maa卍¥
:
S»
ick--A:
-■-■■■r片汁-……,卄匕…
Sctj^-e血如眄”
'
1Ff\订冲汕HZwjwmwM■或州
-^T■……!
……i…-1…….'
……i……?
■
Stef-e*ile^
fHer事r
Q1#3亠&
«
ta
Frequency(kHz)
图滤波器的相位特性
C.产生滤波器系数和头文件
图滤波器系数
EHdlvrD«
h>
iy>
-iAlAiIkv>
TejhI-Luhlrlhnd1nJa**||
金网庐炉卜:
口育|区|国田弗毎IU>
r珂口osS
LCm-申咋F■“■V71Q”种-=rt1*rCW1H事»
rt
图头文件的产生
最后将产生的头文件中的滤波器系数数组放入编写好的滤波器函数中,并在
进行CCS中进行调试与测试。
四、FIR滤波器的Simulink仿真
通过Matlab的FDATOOL设计滤波器后,为了确认该滤波器是否有效,现通过simulink进行建模仿真观察该滤波器是否有效。
把三个信号通过加法器相加后,再通过FDATOOL设计的滤波器即可。
注意此处设计的是数字滤波器,需要把三个输入信号数字化。
具体仿真模型建立如下:
分别观察滤波前后的时域波形图
图滤波前时域波形
图滤波后时域波形
五、FIR滤波器的DSP实现
(1)DSP中滤波器的z算法实现
FIR滤波器的输出表达式为
N1N/21
y(n)h(i)x(ni)h(i)s(ni)
n0n0
式中,为滤波器系数;
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滤波器所采用的就是循环缓冲区法。
(2)C语言实现FIR
采用C语言算法在DSP平台上实现了FIR低通数字滤波器,C语言算法相比于汇编算法可移植性很强。
这里是在TMS320VC5510DSP为平台编写的C语言算法,此算法可以稍加改动用在其他DSP芯片上,而汇编算法则不然。
这种方法具有以下优点:
(a)程序的入口和出口由C语言自动管理,不必手工编写汇编程序实现
(b)程序结构清晰,可读性强。
(c)程序调试方便。
由于C程序中的变量全部由C语言来定义,因此采用C源码调试器可以方便地观察C语言变量。
(d)可移植性较强,通用性较好。
具体代码如下:
#include"
stdio.h"
fdacoefs.h"
//头文件包含滤波器的系数
#defineLength200longyn;
intinput[Length];
intoutput[Length];
#defineN81//定义滤波器的阶数为81阶
//定义缓冲区数组大小为200
//存放输入数据
//存放输出数据
voidmain()
{
intm,n;
int*x;
for(n=0;
n<
Length-1;
n++)//循环导入数据
x=&
input[n];
//指针指向每次导入的数据
yn=0;
//每做完一次乘累加后,把值赋给output数组后,从新归0
for(m=0;
m<
N-1;
m++)
yn+=B[m]*(*(x++));
//做N次的乘累加output[n]=yn;
把值赋给output数组
}
while
(1);
//做完滤波后使程序保持在本循环中
(3)CSS仿真调试
CCS是TI推出的用于开发其DSP芯片的继承开发调试工具,集编辑、编译、链接、软件仿真、硬件调试及实时跟踪等功能于一体,极大地方便了DSP程序的设计与开发,此外还提供图形显示功能,方便用户观察特定地址的波形。
此外,还需向工程中添加Link.cmd文件(源码见附录)。
在CCSV3.3中建立工程,把c源代码和.cmd文件导入后,外加rts.lib文件,它是TI提供的运行时支持库,如果是C代码写的源程序,必须要包含该库,该库
由TI公司做好放在CCS\cgtools\lib中,源代码TI网站可以下载。
添加完成后,编译通过后,下载.out文件,导入.dat文件后运行程序。
采用CCS的图形显示功能,分别观察输入信号x(n)、输出信号y(n)的时域波形和频域波形,输入信号波形如图所示。
图滤波前频谱图
经过滤波后,观察输出波形如下
图滤波后频谱图
为了更加直观的观察滤波器的性能和滤波效果,把滤波前后的时域波形和频谱图进行对比和分析,具体如下:
图滤波前后对比时域和频谱
从上图中可以看出,输入信号明显有高频噪声,波形有很明显的失真。
从输入频谱分析,可以看出除了有500Hz的信息信号还有3000Hz和8000Hz的高频噪声。
经过滤波器后,输出的时域波形有了明显改善,几乎接近信息信号。
而频谱
图中也可以看出3000Hz和8000Hz的高频噪声已经被滤除,而且对原来的信息
信号几乎没有影响
综上分析,滤波器实现滤除高频噪声,而且保证原信息信号基本不失真的功能,滤波效果较好,性能优越。
(4)硬件仿真
通过CCS的软件仿真调试,发现滤波器性能符合要求,有较好的滤波效果。
但是软件仿真过于理想,不过精确,因此在硬件平台上进行仿真调试,观察滤波
器性能指标。
本仿真使用的C5509A硬件平台进行仿真,由于C语言的移植性较好,所以本滤波程序可以直接移植到C5509A平台上使用。
首先创建工程,添加源文
件、.cmd文件、csl5509a.lib和rts55.lib库文件,如下图所示;
ViJLeEditewProjectDebug:
窗用日I&
嗨画I叭哙
轴卅□BHSS
蕈Fil砖
_|GELfiLes
-」Tt-ftj
-FirText.pjtCD«
1Tapaiid*ntProje-IESP/BIOSConfi?
_GeiterateAFlies_jJnclude
日Libr«
riax
固csl5509alit圍rtsSE.l^
-□SflUfce
j-1firc因linJt.cmd
图硬件工程
然后编译,导入数据和运行程序,观察输入输出波形如图:
-fwcuop^soiitnrbaita#ibv对机啊」.匕«
*>
・BircLnB:
crwtibb.^jmtdrriwrtLcuwith-dvf=,Q]i:
blsb5:
500WTrd1!
Use
-swst-Bciiaptipnt?
gci4ngp-iefavjt=iiv.
和lid毗磚利■廉百
h‘'
’
1a彊.'
XJBf*
HErrwTu3Mtmiog-SjDRrasrE'
[11h.aJi;
•‘
观察输入输出时域和频域的波形,可以发现滤波器达到滤波效果,而且和软件仿真效果差异不大,从而也可以发现采用C编写的程序通用性较好。