数字信号处理课程设计滤波器频谱功率谱分析软件.docx
《数字信号处理课程设计滤波器频谱功率谱分析软件.docx》由会员分享,可在线阅读,更多相关《数字信号处理课程设计滤波器频谱功率谱分析软件.docx(15页珍藏版)》请在冰豆网上搜索。
数字信号处理课程设计滤波器频谱功率谱分析软件
基于MATLAB的数字信号处理
一、设计原理
基于MATLAB的面向对象的图形技术和图形用户界面GUI,运用MATLAB工具箱本身所带的数字信号处理函数及相关运算,设计了一个可以实现基本的数字信号处理功能的软件。
该软件可以实现的基本功能包括信号的生成、滤波器的设计、信号滤波处理和谱分析。
其中信号的生成部分,可以实现的确定性信号包括单个正弦信号、方波信号以及多个正弦信号,随机性噪声包括高斯白噪声、均匀分布噪声,且根据选择可以看到信号的频谱或功率谱。
在滤波器设计部分可以生成IIR和FIR两种类型的滤波器,可以实现的IIR型滤波器包括巴特沃斯型、切比雪夫I型、切比雪夫II型,FIR型滤波器设计方法包括窗函数法和最优化法。
矩形窗、汉宁窗、海明窗和布莱克曼窗。
最优化法分两种方法。
并且可以使用设计出的滤波器对生成的信号进行滤波处理,并显示出滤波前与滤波后的信号时域图像的对比。
软件的详细操作过程将在下面列出。
二、设计方案
1.整体界面风格
(1)整个软件结构框图如图1所示:
图1
(2)整个界面如图2所示:
因为考虑到,信号滤波后的图像与信号生成和滤波器设计是有关系的,为了避免代码重复繁琐和界面的简单整洁,所以将这三个模块放于一个界面中,将所需的输入数据按模块分类放置于面板中,通过不同按钮实现不同功能。
下面就不同模块进行介绍。
2.信号发生
该模块输入数据主要有两块面板组成:
信号类型面板和谱分析类型面板。
根据信号类型产生的信号时域图像会在上图中显示,根据谱分析类型选择的信号的谱图像会在下图中显示。
这部分的面板如图3。
图3
软件可以通过popuomenu的下拉菜单选择需要生成的确定性信号,包括单个正弦信号、方波信号、以及多个正弦信号来表达出的常用信号;同时也可以通过下拉菜单选择噪声的生成方式,包括随机性噪声,高斯白噪声,并且可以由用户通过勾选按钮checkbox选择单独生成确定性信号、随机性噪声,或将信号和噪声叠加到一起。
下面以正弦信号、多个正弦信号以及添加均匀分布噪声的正弦信号为例进行信号发生功能的演示。
(1)单个正弦信号
首先在信号类型面板中标有信号的勾选按钮checkbox上打勾,然后再勾选按钮右方的下拉菜单选择单个正弦信号。
然后会出现正弦信号的参数选择对话框,在对话框中输入合适的参数,这里我们用软件初始设置的参数,如图4。
图4
图4图5
然后,在谱分析类型面板中选择要进行的谱分析的类型,这里我们选择频谱分析。
点击信号生成按钮,可以看到信号的时域图像和频谱,如图5。
正弦信号发生部分代码为
sel=get(hObject,'value');
switchsel
case1
prompt={'幅度/v','频率/(rad/s)','初相(rad)','采样率/v','偏移量'};
name='单个正弦信号';
num_lines=1;
defaut={'1','100','0','0','2000'};
a=inputdlg(prompt,name,num_lines,defaut);
Amp=str2double(a{1});
Fre=str2double(a{2});
Ang=str2double(a{3});
Off=str2double(a{4});
fs=str2double(a{5});
dt=1/fs;
tmin=-10/Fre;
tmax=10/Fre-dt;
t=tmin:
dt:
tmax;
x=Amp*sin(2*pi*Fre*t+Ang)+Off;
len=length(t);
(2)多个正弦信号
与正弦信号选择相似,但由于多个正弦信号输入的信号个数不确定,为了使软件运用起来更灵活,所以这里我们让用户自己根据需要直接输入想要发生的信号表达式。
在下拉菜单中选择多个正弦信号后会出现图6的对话框,然后选择频谱,点击按钮,图像如图7所示。
图6
图7
多个正弦信号发生部分代码为:
case3
prompt={'请直接输入信号函数(格式为x=x(t)):
','采样率','tmin','tmax'};
name='多个正弦信号';
num_lines=1;
defaut={'x=2*cos(t)+3*sin(10*t)','100','-10','10'};
c=inputdlg(prompt,name,num_lines,defaut);
fs=str2double(c{2});
dt=1/fs;
tmin=str2double(c{3});
tmax=str2double(c{4});
t=tmin:
dt:
tmax;
eval(c{1});
len=length(t);
(3)添加均匀分布噪声的单个正弦信号
勾选信号和噪声的checkbox,并分别在两个对应的下拉菜单中选择单个正弦信号和均匀分布噪声,其中均匀分布噪声会出现图8的对话框。
因为对于随机信号,一般关心的是它的功率谱,所以这里谱分析类型选择功率谱。
信号图像如图9.
图8
图9
产生均匀分布噪声部分代码为:
case2
prompt={'分布上限','分布下线'};
name='均匀分布噪声';
num_lines=1;
default={'0','0.1'};
f=inputdlg(prompt,name,num_lines,default);
A=str2double(f{1});
V=str2double(f{2});
noise=sqrt(V)*randn(1,len)+A;
绘制图像部分代码为:
ifget(handles.checkbox1,'value')
ifget(handles.checkbox2,'value')
x=x+noise;
elseend
axes(handles.axes1);
plot(t,x);
else
ifget(handles.checkbox2,'value')
axes(handles.axes1);
plot(len,noise);
elseend
end
ifget(handles.radiobutton17,'value')
axes(handles.axes3);
y=fft(x);
f=(0:
length(y)-1)'*fs/length(y);
plot(f,abs(y))
elseend
ifget(handles.radiobutton18,'value')
axes(handles.axes3);
N=length(t);
nfft=2^nextpow2(N);
[Pxx,f]=periodogram(x,[],nfft,fs);
P=10*log10(Pxx);
plot(f,P);
elseend
2.滤波器设计
滤波器设计输入数据主要由三块面板组成,分别是滤波器通带类型选择面板,滤波器设计方法类型选择面板和滤波器参数输入面板。
如图10所示。
通过选择不同按钮,输入数据可以生成IIR和FIR两种类型的滤波器。
可以实现的IIR型滤波器包括巴特沃斯、切比雪夫I型、切比雪夫II型。
FIR型滤波器分两种方法进行设计,分别是窗函数法和最优化法。
窗函数法包括矩形窗、汉宁窗、海明窗和布莱克曼窗。
最优化法包括均方误差最小化方法和最大误差最小化方法。
这里数字滤波器的频率参数一共有四个频率,根据选择的通带类型用户自己输入频率参数,角标小的参数对应的频率小。
下面以IIR设计中的巴特沃斯低通滤波器和FIR设计中的矩形窗高通滤波器以及均方误差最小化带通滤波器为例进行说明。
图10
图10
(1)巴特沃斯低通滤波器
在滤波器类型中选择数字低通滤波器,在IIR滤波器参数中选择巴特沃斯,在数字滤波器参数面板输入参数。
由于是数字低通滤波器,所以ws1=120,ws2可以为空,wp1=0,wp2=100,
其他三个参数我们选择系统初始参数不变。
点击滤波器设计按钮,得到滤波器频域图像如图11。
图11
巴特沃斯低通滤波器部分代码为:
ifget(handles.radiobutton8,'value')
wp=wp2*2/fs;
ws=ws1*2/fs;
ifget(handles.radiobutton11,'value')
[n,wn]=buttord(wp,ws,rp,rs);
[b,a]=butter(n,wn,'low');
[h,w]=freqz(b,a);
f=w/pi*fs/2;
axes(handles.axes1);
plot(f,20*log10(abs(h)));
axes(handles.axes3);
plot(0,0);
elseend
(2)矩形窗高通滤波器
选择窗函数按钮,在下拉菜单选择矩形窗。
ws1为空,ws2=100,wp1=120,wp2=0,其他三个参数选择系统初始参数不变。
点击滤波器设计按钮,得到滤波器频域图像如图12。
图12
矩形窗带通滤波器代码为:
ifget(handles.radiobutton14,'value')
sel1=get(handles.popupmenu6,'value');
switchsel1
case1
ifget(handles.radiobutton8,'value')
wp=wp2*2/fs;
ws=ws1*2/fs;
wd=ws-wp;
N=ceil(1.8/(2*wd));
b=fir1(N,ws,'low',boxcar(N+1));
a=1;
elseend
(3)均方误差最小化带通滤波器
选择最优化法按钮,在下拉菜单选择均方误差最小化原则ws1=200,ws2=600,wp1=250,wp2=550。
在最优化方法下对应的阶数n输入参数框中,输入30。
滤波器波形如图13。
图13
均方误差最小化带通滤波器代码为:
ifget(handles.radiobutton10,'value')
ws1=str2double(get(handles.edit1,'string'));
ws2=str2double(get(handles.edit2,'string'));
wp1=str2double(get(handles.edit3,'string'));
wp2=str2double(get(handles.edit19,'string'));
fs=str2double(get(handles.edit20,'string'));
ws1=ws1/fs;
wp1=wp1/fs;
ws2=ws2/fs;
wp2=wp2/fs;
f=[0,ws1,wp1,wp2,ws2,1];
m=[0,0,1,1,0,0];
elseend
3.信号滤波
当设置好信号类型,滤波器类型,并进行滤波器设计后,可以点击信号滤波按钮对信号进行滤波,并在右边得到滤波前与滤波后图像对比。
这里以正弦信号通过均方误差最小化带通滤波器滤波为例。
信号滤波前与滤波后图像如图14。
图14
信号滤波代码为:
ifget(handles.checkbox1,'value')
ifget(handles.checkbox2,'value')
x=x+noise;
elseend
axes(handles.axes1);
plot(t,x);
axes(handles.axes3);
y=filter(b,a,x);
plot(t,real(y));
else
end
三、实验结果
通过不同滤波器设计对比可以发现,巴特沃斯和切比雪夫2型方法设计的滤波器通带波纹较小,但切比雪夫2型阻带衰减较小(Db),巴特沃斯过渡带过渡较慢,而切比雪夫1型阻带衰减很大,但通带波纹较大。
由此说明通带波纹和阻带衰减不可能同时做的很理想,优化一方必然要牺牲另一方。
而在FIR滤波器设计中,可以发现,矩形窗方法得到的阻带衰减最小。