基于MATLAB的信号处理仿真分析.docx
《基于MATLAB的信号处理仿真分析.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的信号处理仿真分析.docx(37页珍藏版)》请在冰豆网上搜索。
基于MATLAB的信号处理仿真分析
基于MATLAB的信号处理仿真分析
基于MATLAB的信号处理仿真分析
中文摘要:
Matlab在信号分析与处理中有着广泛的应用。
本文以具体的函数信号产生、信号变换、功率谱估计方法,详述了如何应用Matlab语言编程的方法设计对信号进行编辑和仿真分析。
利用MATLAB软件,通过设计图形用户界面(GUI),说明Matlab功能强大、简单实用、调节容易、可视性好,可大大提高计算效率,缩短编程时间,是一种简便实用的计算工具,可成功地应用于信号处理中,在教学和研究等领域具有广泛的应用前景和一定的推广价值。
关键词:
Matlab信号产生信号变换功率谱估计GUI。
Abstract:
Matlabhasawiderangeofapplicationsinsignalanalysisandprocessing,Thisarticlehaspointedoutitscharacteristics,interfacesandbasicmethodofcalculation,Specificfunctionsignalgenerator,functiontransform,classicalspectralestimationmethods,detailedintheapplicationoftheMatlabprogramminglanguagedesignedforeditingofthesignalanalysisandsimulation.Throughthedesignofgraphicaluserinterface(GUI)byUsingMatlab,wecanlearnthatMatlabispowerful,simple,practical,easyadjustment,visibility,andcangreatlyimprovethecomputationalefficiencyandshortentheprogrammingtimeisasimpleandpracticaltool,canbesuccessfullyappliedtosignalprocessing,intheteachingandresearchinareassuchastheapplicationofawiderangeofprospectsandthepromotionofacertainvalue.
KeyWords:
MatlabSignalgenerationSignalchangePowerspectrumestimationGUI
界面下的编程。
随着版本的升级,内容不断扩充,它的功能越来越强大,特别是在系统仿真和实时运行等方面,有很多新进展,更扩大了它的应用前景,是各种科学计算软件中使用频率最高的软件。
MATLAB包括拥有数百个内部函数的主包和三十几种工具包。
工具包又可以分为功能性工具包和学科工具包。
功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能。
学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类。
开放性使MATLAB广受用户欢迎。
除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包。
1993年出现SIMULINK,这是基于框图的仿真平台,SIMULINK挂接在MATLAB环境上,以MATLAB的强大计算功能为基础,以直观的模块框图进行仿真和计算。
SIMULINK提供了各种仿真工具,尤其是它不断扩展的、内容丰富的模块库,为系统的仿真提供了极大便利。
在SIMULINK平台上,拖拉和连接典型模块就可以绘制仿真对象的模型框图,并对模型进行仿真。
在SIMULINK平台上,仿真模型的可读性很强,这就避免了在MATLAB窗口使用MATLAB命令和函数仿真时,需要熟悉记忆大量M函数的麻烦,对广大工程技术人员来说,这无疑是最好的福音。
现在的MATLAB都同时捆绑了SIMULINK,SIMULINK的版本也在不断升级,从1993年的MATLAB4.0/SIMULINK1.0版到2001年的MATLAB6.1/SIMULINK4.1版,2002年即推出了MATLAB6.5/SIMULINK5.0版。
MATLAB已经不再是单纯的“矩阵实验室”了,它已经成为一个高级计算和仿真平台。
1.2MATLAB的特点和优势
特点:
(1)此高级语言可用于技术计算
(2)此开发环境可对代码、文件和数据进行管理
(3)交互式工具可以按迭代的方式探查、设计及求解问题
(4)数学函数可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分
(5)二维和三维图形函数可用于可视化数据
(6)各种工具可用于构建自定义的图形用户界面
(7)各种函数可将基于MATLAB的算法与外部应用程序和语言(如C、C++、Fortran、Java、COM以及MicrosoftExcel)集成
优势:
(1)友好的工作平台和编程环境
(2)简单易用的程序语言
(3)强大的科学计算机数据处理能力
(4)出色的图形处理功能
(5)应用广泛的模块集合工具箱
(6)实用的程序接口和发布平台
(7)应用软件开发(包括用户界面)
1.3图形用户界面(GUI)
MATLAB提供的图形用户界面开发环境(GUIDE)来完成界面设计。
GUIDE主要是一个界面设计工具集,MATLAB将所有GUI支持的用户控件都集成在这个环境中并提供界面外观、属性和行为响应方式的设置方法。
GUI将用户保存设计好的GUI界面保存在一个FIG资源文件中,同时自动生成包含GUI初始化和组件界面布局控制代码的M文件,为实现回调函数提供了一个参考框架。
这种提供图形用户界面的应用程序能够使用户的学习和使用更为方便、直观和实用。
1.4设计内容
(1)信号产生及其MATLAB实现
a.离散信号及其MATLAB实现
b.连续信号及其MATLAB实现
c.噪声及波形信号的MATLAB实现
(2)信号变换及其MATLAB实现
a.Z变换
b.离散傅里叶变换DFT
c.快速傅里叶变换FFT
(3)功率谱估计
a.直接法
b.间接法
c.改进直接法
(4)图形用户界面(GUI)的实现
第二章信号产生及其MATLAB实现
在MATLAB中产生信号,很多可以通过MATLAB内部的一些简单函数如zeros、ones等来实现。
同时MATLAB可实现信号的基本运算,如移位、相加、相乘等。
MATLAB内部提供了大量的函数用来产生噪声及常用的信号波形。
下面对数字信号处理中的常用信号的产生进行阐述。
2.1离散信号及其MATLAB实现
(1)单位冲激序列
编写程序产生32点并右移20的单位冲激序列。
MATLAB程序如下:
N=32;
K=20;
x=zeros(1,N);
x(K)=1;
xn=0:
N-1;
stem(xn,x)
axis([-13301.1])
运行结果:
(2)单位阶跃序列
编写程序产生N=32点的单位阶跃序列。
MATLAB程序如下:
x=ones(1,N);
xn=0:
N-1;
stem(xn,x);
axis([-13201.1]);
运行结果:
(3)斜坡序列
编写程序产生斜率为3移位为4的斜坡序列。
MATLAB程序如下:
N=32;
k=4;
B=3;
x=[zeros(1,k)ones(1,N-k)];
fori=1:
N
x(i)=B*x(i)*(i-k);
end
xn=0:
N-1;
stem(xn,x)
axis([-132090])
运行结果:
(4)正弦序列
编写程序产生幅度A=3,频率f=100,初始相位fai=1.2的正弦序列。
MATLAB程序如下:
N=32;
A=3;
f=100;
fai=1.2;
xn=0:
N-1;
x=A*sin(2*pi*f*(xn/N)+fai);
stem(xn,x)
axis([-132-3.23.2])
运行结果:
(5)实指数序列
编写程序产生幅度A=3,a=0.7的实指数序列。
MATLAB程序如下:
N=32;
A=3;
a=0.7;
xn=0:
N-1;
x=A*a.^xn;
stem(xn,x)
运行结果:
2.2连续信号及其MATLAB实现
(1)单位冲激信号
编写程序产生t=1/50的单位脉冲信号。
MATLAB程序如下:
t1=-0.5:
0.0001:
0;
A=50;
A1=1/A;
n1=length(t1);
u1=zeros(1,n1);
t2=0:
0.001:
A1;
t0=0;
u2=A*stepfun(t2,t0);
t3=A1:
0.001:
1;
n3=length(t3);
u3=zeros(1,n3);
t=[t1t2t3];
u=[u1u2u3];
plot(t,u)
axis([-0.51052])
运行结果:
(2)单位阶跃信号
编写程序产生单位阶跃函数。
MATLAB程序如下:
t=-0.5:
0.001:
1;
t0=0;
u=stepfun(t,t0);
plot(t,u);
axis([-0.51-0.21.2]);
运行结果:
(3)实指数函数
编写程序产生实指数函数f(t)=3e0.5t。
MATLAB程序如下:
t=0:
0.001:
3;
A=3;
a=0.5;
u=A*exp(a*t);
plot(t,u)
axis([-0.23.1-0.214])
运行结果:
(4)正弦函数
编写程序产生正弦函数f(t)=3cos(6πt+1)。
MATLAB程序如下:
t=-0.5:
0.001:
1;
A=3;
f=3;
fai=1;
u=A*sin(2*pi*f*t+fai);
plot(t,u)
axis([-0.51-3.23.2])
运行结果:
(5)指数调制正弦函数
编写程序产生指数调制正弦函数f(t)=3e0.5tcos(10πt-1)。
MATLAB程序如下:
t=0:
0.001:
2.5;
A=3;
a=0.5;
f=5;
fai=1;
u1=A*exp(a*t);
u2=sin(2*pi*f*t+fai);
u12=u1.*u2;
t0=1;
u3=stepfun(t,t0);
u=u12.*u3;
plot(t,u)
axis([02.6-10.210.2])
运行结果:
2.3噪声及波形信号的MATLAB实现
MATLAB内部提供了大量的函数用来产生噪声及常用的信号波形。
这些信号在信号处理中非常重要。
下面将对这些波形产生函数及其使用进行介绍:
(1)SQUARE函数
SQUARE函数分为SQUARE(T)和SQUARE(T,DUTY)两种格式。
SQUARE(T):
相对于时间变量T产生周期为2π,幅值为±1的方波。
SQUARE(T,DUTY):
产生指定周期的方波。
DUTY:
信号为正值的区域在一个周期内所占的比例。
①编写程序产生占空比为30%,幅度为1的方波信号。
MATLAB程序如下:
t=0:
0.01:
6*pi;
x=square(t,30);
plot(t,x);
axis([06*pi-11.1])
运行结果:
②编写程序产生频率为10Hz的锯齿波。
MATLAB程序如下:
f=10;
fs=1000;
t1=0:
1/fs:
1;
t=2*pi*f*t1;
y=sawtooth(t);
plot(t,y)
运行结果:
③编写程序产生频率为10Hz的三角波。
MATLAB程序如下:
f=10;
fs=1000;
width=0.5;
t1=0:
1/fs:
1;
t=2*pi*f*t1;
y=sawtooth(t,width);
plot(t,y)
运行结果:
(2)SINC函数
SINC函数的调用格式是SINC(T),对输入的变量T计算数学sinc函数的值。
即
它是宽度为2π,幅度为1的矩形脉冲的逆傅里叶变换:
用MATLAB编写一段程序得到SINC函数的曲线。
MATLAB程序如下:
t=linspace(-10,10);
x=sinc(t);
plot(t,x)
运行结果:
(3)DIRIC函数
DIRIC用来求取Dirichlet函数。
Dirichlet函数的定义如下:
其中n为正整数。
当n为偶数时,Dirichlet函数的周期为4π,当n为奇数时,Dirichlet函数的周期为2π。
用MATLAB编写一段程序得到DIRIC函数的曲线。
MATLAB程序如下:
t=linspace(-10,10);
y=diric(t,8);
plot(t,y)
运行结果:
(4)CHIRP函数
CHIRP函数用于产生调频的余弦脉冲。
其调用格式为:
CHIRP(T,F0,T1,F1)——在时间范围T内产生线性调频脉冲,在0时刻信号的瞬时频率为F0赫兹,在T1时刻信号的瞬时频率为F1赫兹。
CHIRP(T,F0,T1,F1,'METHOD')——METHOD用来指定调频方法,可以提供的调频方法有线性、二次型和对数3种。
默认为线性调频。
当采用对数调频时,必须满足F1>F0。
CHIRP(T,F0,T1,F1,'METHOD',PHI)——PHI用来指定初始相位。
编写MATLAB程序产生f0=10Hz,f1=100Hz的线性调频信号。
程序如下:
fs=1000;
t=0:
1/fs:
1;
f0=10;
t1=1;
f1=100;
y=chirp(t,f0,t1,f1);
plot(t,y)
运行结果:
第三章信号变换及其MATLAB实现
在MATLAB中有离散傅里叶变换DFT、z变换、离散余弦变换DCT、Hilbert变换等几种变换函数。
下面结合例题重点介绍z变换、离散傅里叶变换DFT和快速傅里叶变换FFT在MATLAB中的应用。
3.1.Z变换
Z变换是离散系统与离散信号分析与综合的重要工具,下面结合例题说明在MATLAB中用Z变换求解差分方程的方法。
令y(n)-2y(n-1)+3y(n-2)=4u(n)-5u(n-1)+6u(n-2)-7u(n-3),其初始条件为x(-1)=1,x(-2)=-1,y(-1)=-1,y(-2)=1,求系统的输出y(n)。
程序如下:
b=[4,-5,6,-7];
a=[1-23];
x0=[1-1];
y0=[-11];
xic=filtic(b,a,y0,x0)
bxplus=1;
axplus=[1-1];
ayplus=conv(a,axplus)
byplus=conv(b,bxplus)+conv(xic,axplus)
[R,P,K]=residuez(byplus,ayplus)
Mp=abs(P)
Ap=angle(P)*180/pi
N=100;
n=0:
N-1;
xn=ones(1,N);
yn=filter(b,a,xn,xic);
plot(n,yn);
运行结果:
xic=
-1616-7
ayplus=
1-35-3
byplus=
-1227-170
R=
-5.5000-1.0607i
-5.5000+1.0607i
-1.0000
P=
1.0000+1.4142i
1.0000-1.4142i
1.0000
K=
0
Mp=
1.7321
1.7321
1.0000
Ap=
54.7356
-54.7356
0
其系统输出响应曲线为:
3.2离散傅里叶变换DFT
有限长序列x(n)的离散傅里叶变换公式:
若x(n)=cos(nπ/6)是一个N=32的有限序列,利用MATLAB计算它的DFT并画出图形。
程序如下:
N=32;%DFT的长度
n=0:
N-1;%n的行向量
xn=cos(pi*n/6);%产生信号
k=0:
N-1;%k的行向量
WN=exp(-j*2*pi/N);%旋转因子
nk=n'*k;%产生一个含nk值的N乘N维矩阵
WNnk=WN.^nk;%DFT矩阵
Xk=xn*WNnk;%DFT系数的行向量
figure
(1)
stem(n,xn);
figure
(2)
stem(k,abs(Xk));
有限序列及其DFT的图形:
3.3快速傅里叶变换FFT
快速傅里叶变换算法FFT可分为时间抽取法(DIT-FFT)和频率抽取(DIF-FFT)。
Fft是MATLAB内部函数,常用格式为:
y=fft(x,n)。
ifft函数用来计算序列的逆傅里叶变换,常用格式为:
y=ifft(x,n)。
设某信号x(n)是由两种频率的正弦信号加白噪声组成,即:
x(n)=a1sin(2πf1n/fs)+a2sin(2πf2n/fs)+n(t)。
求当a1=5,a2=3,f1=2Hz,,f2=2.05Hz,以及采样频率取为fs=10Hz,信号x(n)的FFT频谱及其IFFT变换。
程序如下:
%产生两个正弦加白噪声
N=256;
f1=.1;
f2=.2;
fs=1;
a1=5;
a2=3;
w=2*pi/fs;
x=a1*sin(w*f1*(0:
N-1))+a2*sin(w*f2*(0:
N-1))+randn(1,N);
axes(handles.axes1)
plot(x(1:
N/4));
%应用FFT求频谱
f=-0.5:
1/N:
0.5-1/N;
X=fft(x);
axes(handles.axes4)
plot(f,fftshift(abs(X)))
%应用IFFT求原信号
y=ifft(X);
axes(handles.axes5)
plot(real(x(1:
N/4)))
运行结果:
第四章基于MALTAB的功率谱估计
功率谱估计涉及到信号与系统、随机信号分析、概率统计、随机过程及矩阵代书等一系列基础科学,应用广泛。
功率谱估计方法可分为经典谱估计法与现代谱估计法。
经典谱估计法又可分为直接法与间接法。
现代谱估计的提出主要是针对经典谱估计的分辨率低和方差性能不好等问题提出的。
现代谱估计方法大致可分为参数模型谱估计和非参数模型谱估计。
下面将举例对其中一些方法进行介绍。
4.1直接法
又称周期图法,是把随机序列x(n)的N个观测数据视为一能量有限的序列,直接计算x(n)的离散傅里叶变换,得X(k),然后再取其幅值的平方除以N,作为序列x(n)真实功率谱的估计,即:
在MATLAB中,函数periodogram也可实现周期图法功率谱估计。
其调用格式为:
[Pxx,F]=PERIDODGRAM(x,WINDOW,NFFT,Fs)
x——进行功率谱估计的输入有限长序列
WINDOW——用于指定采用的窗函数
NFFT——设定FFT算法的长度
Fs——采样频率,默认值为1
Pxx——输出的功率谱估计值
F——得到的频率点
下面举例对这两种不同算法进行比较:
计算噪声序列sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n))的功率谱。
%FFT直接法
Fs=2000;
NFFT=1024;
n=0:
1/Fs:
1;
x=sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n));%噪声序列
X=fft(x,NFFT);%计算FFT
pxx=abs(X).^2/length(n);%求解PSD
t=0:
round(NFFT/2-1);
k=t*Fs/NFFT;
P=10*log(pxx(t+1));%
axes(handles.axes1)
plot(k,P);
%periodogram函数法
Fs=2000;
NFFT=1024;
n=0:
1/Fs:
1;
x=sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n));%噪声序列
window=boxcar(length(x));
periodogram(x,window,NFFT,Fs);
运行结果比较如下:
4.2间接法
间接法先由序列x(n)估计出自相关函数
,然后对
求傅里叶变换,便得到x(n)的功率谱估计,即:
利用间接法计算噪声序列sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n))的功率谱。
程序如下:
Fs=2000;
NFFT=1024;
n=0:
1/Fs:
1;
x=sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n));%噪声序列
Cx=xcorr(x,'unbiased');%计算序列的自相关函数
Cxk=fft(Cx,NFFT);%计算FFT
pxx=abs(Cxk);%求解PSD
t=0:
round(NFFT/2-1);
k=t*Fs/NFFT;
P=10*log(pxx(t+1));%纵坐标的单位为dB
axes(handles.axes3)
plot(k,P);
运行结果:
4.3改进直接法—Bartlett法
Bartlett平均周期图的方法是将N点的有限长序列x(n)分段求周期图再平均。
在MATLAB中,可以利用函数psd来实现对Bartlett平均周期图方法的功率谱估计。
其调用格式为:
[Pxx,Pxxc,F]=PSD(x,NFFT,Fs,WINDOW,NOVERLAP,P)
利用Bartlett计算噪声序列sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n))的功率谱。
程序如下:
Fs=2000;
NFFT=1024;
n=0:
1/Fs:
1;
x=sin(2*pi*100*n)+4*sin(2*pi*500*n)+randn(size(n));%噪声序列
window=boxcar(1024);
noverlap=0;
p=0.9;
[Pxx,Pxxc]=psd(x,NFFT,Fs,window,noverlap,p);
index=0:
round(NFFT/2-1);
k=index*Fs/NFFT;
plot_Pxx=10*log10(Pxx(index+1));
plot_Pxxc=10*log10(Pxxc(index+1));
axes(handles.axes4)
plot(k,plot_Pxx)
运行结果:
第五章图形用户界面(GUI)的实现
5.1GUI界面设计概述
GUI设计面板是GUI设计工具应用的平面,面板上部提