通信系统与信号处理MATLAB仿真基础实验(可选)一、实验目的1.熟悉用MATLAB表示常用连续信号和离散信号的方法,掌握用MATLAB进行信号基本运算的方法;2.熟悉利用MATLAB实现信号傅里叶变换:3.掌握利用MATLAB进行AWGN信道的仿真。二、实验内容1、连续信号和离散信号表示连续信号是指自变量的取值范围是连续的,且对于一切自变量的取值,除了有若干个不连续点之外,信号都有确定的值与之对应。严格来说,MATLAB并不能处理连续信号,而是用等时间间隔点的样值来近似表示连续信号。当取样时间间隔足够小时,这些离散的样值就能较好地近似连续信号。表示连续时间信号有两种方法,一是数值法,二是符号法。数值法是定义某一时间范围和取样时间间隔,然后调用该函数计算这些点的函数值,得到两组数值矢量,可用绘图语句画出其波形;符号法是利用MATLAB的符号运算功能,需定义符号变量和符号函数,运算结果是符号表达的解析式,也可用绘图语句画出其波形图。MATLAB提供了大量的生成基本信号的函数,例如指数信号、正余弦信号等。在MATLAB中,指数信号用exp函数表示;正弦信号用sin函数表示:三角信号用tripuls函数表示;矩形脉冲信号可用rectpuls函数表示。要求一:利用下表中函数产生通信中常见的信号,并绘图画出信号波形:改变相应参量,观察信号波形变化规律。函数名功能函数名功能产生冲激串sawtooth产生锯齿波或三角波信号pulstranrectpulssquare产生方波信号产生非周期的方波信号sinc产生sinc函数波形tripuls产生非周期的三角波信号diricchirp产生调频余弦信号产生Dirichlet或周期sinc函数产生高斯正弦脉冲信号产生高斯单脉冲信号gauspulsgmonopuls电压控制振荡器VCOsincos正弦和余弦信号在MATLAB中,无论是连续时间信号还是离散时间信号,MATLAB都是用一个数字序列来表示信号,这个数字序列在MATLAB中叫做向量(vector)。通常的情况下,需要与时间变量相对应。MATLAB中表示离散时间信时,f(k)需要两个行向量,一个是表示序号k=[],一
通信系统与信号处理 MATLAB 仿真基础实验(可选) 一、实验目的 1. 熟悉用 MATLAB 表示常用连续信号和离散信号的方法,掌握用 MATLAB 进行信号 基本运算的方法; 2. 熟悉利用 MATLAB 实现信号傅里叶变换; 3. 掌握利用 MATLAB 进行 AWGN 信道的仿真。 二、实验内容 1、 连续信号和离散信号表示 连续信号是指自变量的取值范围是连续的,且对于一切自变量的取值,除了有若干个不 连续点之外,信号都有确定的值与之对应。严格来说,MATLAB 并不能处理连续信号,而是 用等时间间隔点的样值来近似表示连续信号。当取样时间间隔足够小时,这些离散的样值就 能较好地近似连续信号。表示连续时间信号有两种方法,一是数值法,二是符号法。数值法 是定义某一时间范围和取样时间间隔,然后调用该函数计算这些点的函数值,得到两组数值 矢量,可用绘图语句画出其波形;符号法是利用 MATLAB 的符号运算功能,需定义符号变量 和符号函数,运算结果是符号表达的解析式,也可用绘图语句画出其波形图。 MATLAB 提供了大量的生成基本信号的函数,例如指数信号、正余弦信号等。在 MATLAB 中,指数信号用 exp 函数表示; 正弦信号用 sin 函数表示;三角信号用 tripuls 函数表 示;矩形脉冲信号可用 rectpuls 函数表示。 要求一:利用下表中函数产生通信中常见的信号,并绘图画出信号波形;改变相应参 量,观察信号波形变化规律。 函数名 功能 函数名 功能 sawtooth 产生锯齿波或三角波信号 pulstran 产生冲激串 square 产生方波信号 rectpuls 产生非周期的方波信号 sinc 产生 sinc 函数波形 tripuls 产生非周期的三角波信号 chirp 产生调频余弦信号 diric 产生 Dirichlet 或周期 sinc 函数 gauspuls 产生高斯正弦脉冲信号 gmonopuls 产生高斯单脉冲信号 vco 电压控制振荡器 sin cos 正弦和余弦信号 在 MATLAB 中,无论是连续时间信号还是离散时间信号,MATLAB 都是用一个数字序列来 表示信号,这个数字序列在 MATLAB 中叫做向量(vector)。通常的情况下,需要与时间变量 相对应。MATLAB 中表示离散时间信时,f(k)需要两个行向量,一个是表示序号 k=[ ],一
个是表示相应函数值f=[],画图命令是stem。在MATLAB可视化绘图中,对于以t为自变量的连续信号,在绘图时统一用plot函数:而对k为自变量的离散序列,在绘图时统一用stem函数。2、信号基本运算信号基本运算包括加法、乘法、尺度变换、反转、平移、微分、积分和卷积等,实现方法有数值法和符号法。信号的相加y=x1+x2MATLAB实现:y(n)=x1(n)+x2(n)信号的相乘y(n)=xl(n)Xx2(n)MATLAB实现:y=x1.*x2。要求信号对应同一时刻信号取值的相加和相乘。序列翻褶:y(n)=x(-n),MATLAB可实现:y=fliplr(x)。两序列卷积运算:J(n)=x(n)*x,(n)=x(m)xz(n-m);MATLAB实现:y=conv(x1,x2)。序列xl(n)和x2(n)必须长度有限。两序列相关运算:J(m)=x(n)x,(n-m);MATLAB实现:y=Xcorr(xl,x2)。(n)-x(i);MATLAB实现: y=cumsum(x)。序列累加的数学描述为:N信号能量E=x[n]·x*[n];MATLAB实现:E=sum(x.*conj(x)n=0或E=sum(abs(x).^2)。1信号功率P=x[n]};MATLAB实现:P=sum(x.*conj(x)/NNO或 E=sum(abs(x).^2)/N要求二:利用要求一中的信号进行上述信号基本运算,画出运算前后的信号波形。3、信号的傅里叶变换MATLAB的符号运算工具箱(symbolicMathToolbox)提供了直接求解傅里叶变换及逆变换的函数。fourierO及ifourierO两者的调用格式如下:Fourier变换的调用格式F=fourier(f),它是符号函数f的fourier变换默认返回是关于w的函数。F=fourier(f,v),它返回函数F是关于符号对象v的函数,而不是默认的w,即F(v)= f(x)e-dxFourier逆变换的调用格式:f=ifourier(F),它是符号函数F的fourier逆变换,默认的独立变量为w,默认返回是关于x的函数。f=ifourier(f,u),它的返回函数f是u的函数,而不是默认的x。注意:在调用函数fourierO及ifourierO之前,要用syms命令对所用到的变量(如t,u,v,w)进行说明,即将这些变量说明成符号变量
个是表示相应函数值 f=[ ],画图命令是 stem。在 MATLAB 可视化绘图中,对于以 t 为自 变量的连续信号,在绘图时统一用 plot 函数;而对 k 为自变量的离散序列,在绘图时统一 用 stem 函数。 2、 信号基本运算 信号基本运算包括加法、乘法、尺度变换、反转、平移、微分、积分和卷积等,实现方 法有数值法和符号法。 信号的相加 y=x1+x2 MATLAB 实现 : y(n)=x1(n)+x2(n) 。 信号的相乘 y(n)=x1(n)×x2(n) MATLAB 实现: y=x1.*x2 。 要求信号对应同一时刻信号取值的相加和相乘。 序列翻褶:y(n)=x(-n),MATLAB 可实现: y=fliplr(x)。 两序列卷积运算: 1 2 12 () () () ( ) ( ) m y n x n x n x mx n m ; MATLAB 实现:y=conv(x1,x2)。序列 x1(n)和 x2(n)必须长度有限。 两序列相关运算: 1 2 ( ) () ( ) n y m x nx n m ;MATLAB 实现:y=xcorr(x1,x2)。 序列累加的数学描述为: ( ) () s n i n y n xi ;MATLAB 实现:y=cumsum(x)。 信号能量 0 [ ] *[ ] N n E xn x n ;MATLAB 实现: E=sum(x.*conj(x)) 或 E=sum(abs(x).^2) 。 信号功率 1 2 0 1 [ ] N n P xn N ;MATLAB 实现: P=sum(x.*conj(x))/N 或 E=sum(abs(x).^2)/N 。 要求二:利用要求一中的信号进行上述信号基本运算,画出运算前后的信号波形。 3、 信号的傅里叶变换 MATLAB 的符号运算工具箱(symbolic Math Toolbox) 提供了直接求解傅里叶变换及 逆变换的函数。fourier()及 ifourier() 两者的调用格式如下: Fourier 变换的调用格式 F=fourier(f) ,它是符号函数 f 的 fourier 变换默认返回是关于 w 的函数。 F=fourier(f,v) , 它返回函数 F 是关于符号对象 v 的函数,而不是默认的 w,即 () () jvx F v f x e dx Fourier 逆变换的调用格式: f=ifourier(F), 它是符号函数 F 的 fourier 逆变换,默认的独立变量为 w,默认返回 是关于 x 的函数。 f=ifourier(f,u), 它的返回函数 f 是 u 的函数,而不是默认的 x。 注意:在调用函数 fourier()及 ifourier()之前,要用 syms 命令对所用到的变量(如 t,u,v,w)进行说明,即将这些变量说明成符号变量
要求三:利用fourierO及ifourierO对常见信号进行频域分析。用MATLAB符号算法求傅里叶变换有一定局限,当信号不能用解析式表达时,会提示出错,这时用MATLAB的数值计算也可以求连续信号的傅里叶变换,计算原理是F(jo)= f"f(t) e-jon dt = lim Zf(nt)e-jomtt1-0当T足够小时,近似计算可满足要求。若信号是时限的,或当时间大于某个给定值时,信号已衰减的很厉害,可以近似地看成时限信号时,n的取值就是有限的,设为N,有N=2元kZf(nt)e-i"t,0≤ksN,O=F(k)=是频率取样点n=0时间信号取样间隔T应小于奈奎斯特取样时间间隔,若不是带限信号可根据计算精度要求确定一个频率WO为信号的带宽。MATLAB中提供了快速傅里叶变换函数fft和逆变换函数ifft。一维快速正傅里叶变换函数fft格式:X=fft(x,N)功能:采用FFT算法计算序列向量x的N点DFT变换,当N缺省时,fft函数自动按x的长度计算DFT。当N为2整数次幂时,fft按基-2算法计算,否则用混合算法。一维快速逆傅里叶变换函数ifft格式:x=ifft(X,N)功能:采用FFT算法计算序列向量X的N点IDFT变换。需要注意的是:对于周期信号Y=fft(x)之后,这个Y一般是一个复数,它的模值应该除以length(x),(亦为信号采样点数)才能得到各个频率信号实际双边幅值(单边幅值除1ength(x)/2);对于非周期信号Y=fft(x)之后,这个Y一般是一个复数,它的模值应该除以length(x)且乘上截短时间T,才能得到各个频率信号实际双边幅值(单边幅值除1ength(x)/2且乘上截短时间T):fftshift作用:将零频点移到频谱的中间,即将FFT的DC分量移到频谱中心。用法:Y=fftshift(x)Y=fftshift(X,dim)描述:fftshift移动零频点到频谱中间,重新排列fft的输出结果,将零频点放到频谱的中间。要求四:利用fft、ifft和fftshift做常见信号的频域双边谱和单边幅度谱分析,并与理论公式对应验证
要求三:利用 fourier()及 ifourier()对常见信号进行频域分析。 用 MATLAB 符号算法求傅里叶变换有一定局限,当信号不能用解析式表达时,会提示出 错,这时用 MATLAB 的数值计算也可以求连续信号的傅里叶变换,计算原理是 n j t j n F j f t e dt f n e ( ) ( ) lim ( ) 0 当 足够小时,近似计算可满足要求。若信号是时限的,或当时间大于某个给定值时, 信号已衰减的很厉害,可以近似地看成时限信号时,n 的取值就是有限的,设为 N,有 k N F k f n e k N k N n j nk 2 ( ) ( ) , 0 , 1 0 是频率取样点 时间信号取样间隔 应小于奈奎斯特取样时间间隔,若不是带限信号可根据计算精度 要求确定一个频率 W0 为信号的带宽。 MATLAB 中提供了快速傅里叶变换函数 fft 和逆变换函数 ifft。 一维快速正傅里叶变换函数 fft 格式:X=fft(x, N) 功能:采用 FFT 算法计算序列向量 x 的 N 点 DFT 变换, 当 N 缺省时,fft 函数自动 按 x 的长度计算 DFT。当 N 为 2 整数次幂时,fft 按基-2 算法计算,否则用混合算法。 一维快速逆傅里叶变换函数 ifft 格式:x=ifft(X, N) 功能:采用 FFT 算法计算序列向量 X 的 N 点 IDFT 变换。 需要注意的是: 对于周期信号 Y=fft(x)之后,这个Y 一般是一个复数,它的模值应该除以 length(x), (亦为信号采样点数)才能得到各个频率信号实际双边幅值( 单边幅值除 length(x)/2 ); 对于非周期信号 Y=fft(x)之后,这个Y 一般是一个复数,它的模值应该除以 length(x) 且乘上截短时间T,才能得到各个频率信号实际双边幅值( 单边幅值除 length(x)/2且乘 上截短时间T ); fftshift 作用:将零频点移到频谱的中间,即将FFT 的DC 分量移到频谱中心。 用法: Y=fftshift(X) Y=fftshift(X,dim) 描述:fftshift 移动零频点到频谱中间,重新排列fft的输出结果,将零频点放到频 谱的中间。 要求四:利用fft、ifft和fftshift做常见信号的频域双边谱和单边幅度谱分析,并 与理论公式对应验证
4、AWGN信道仿真加性高斯白噪声(AWGN)是最常见的一种噪声,它存在于各种传输媒质中,包括有线信道和无线信道。加性高斯白噪声表现为信号围绕平均值的一种随机波动过程。加性高斯白噪声的均值为0,方差是噪声功率的大小。一般情况下,噪声功率越大,信号的波动幅度就越大,接收端接收到的信号的误比特率就越高。在研究通信系统的误码率信道质量的关系时,一般先研究它在AWGN信道下的性能,然后再把它推广到具有快衰落的复杂情况。在MATLAB中提供了AWGN函数用以产生高斯白噪声,常见三种调用方式如下:awgn(xsnr)函数awgn(x,snr)把加性高斯白噪声叠加到输入信号x中,snr以dB的形式指定噪声的功率。在这种情况下,信号x的功率假设设为OdBW,因此,噪声的功率实际上就等于-snr(dBW)。如果x是复数,那么awgn将添加复数噪声。awgn(x,snr,sigpower)这个方法是假设了输入信号的功率为sigpower(单位:dBw)。awgn(x,snr'measured)首先计算输入信号x的功率,然后按照snr添加相应功率的高斯白噪声。此外MATLAB中提供的randn函数也可以用来产生加性高斯白噪声。randn(m,n)返还一个m行n列的随机矩阵,其中每一行和每一列都服从均值为O,方差为1的正态分布。若x为已知时域信号,则n=sqrt(pn)*randn(1,length(x))是产生均值为0、方差为pn的与信号同维的高斯白噪声信号,pn往往可根据信噪比求得。要求五:分别利用awgn函数和randn函数针对正旋波信号产生高斯白噪声,并做图对比正旋波信号、高斯白噪声信号和叠加了噪声以后的信号;分析信号功率、噪声功率和信噪比的理论关系并验证。三、程序实例例指数信号指数信号在MATLAB中用exp函数表示。如f(t)=Ae,调用格式为ft=A*exp(a*t))程序是A=1; a=-0.4;t=0:0.01:10;%定义时间点%计算这些点的函数值fl=A*exp(a*t),plot(t,ft);%画图命令,用直线段连接函数值表示曲线%在图上画方格grid on;例正弦信号正弦信号在MATLAB中用sin函数表示。调用格式为f=A*sin(w*t+phi)A=1; w=2*pi; phi-pi/6t=0:0.01:8;%定义时间点
4、 AWGN 信道仿真 加性高斯白噪声(AWGN)是最常见的一种噪声,它存在于各种传输媒质中,包括有线信 道和无线信道。加性高斯白噪声表现为信号围绕平均值的一种随机波动过程。加性高斯白噪 声的均值为 0,方差是噪声功率的大小。一般情况下,噪声功率越大,信号的波动幅度就越 大,接收端接收到的信号的误比特率就越高。在研究通信系统的误码率信道质量的关系时, 一般先研究它在 AWGN 信道下的性能,然后再把它推广到具有快衰落的复杂情况。 在 MATLAB 中提供了 AWGN 函数用以产生高斯白噪声,常见三种调用方式如下: awgn(x,snr) 函数 awgn(x,snr)把加性高斯白噪声叠加到输入信号 x 中,snr 以 dB 的形 式指定噪声的功率。在这种情况下,信号 x 的功率假设设为 0dBW,因此,噪声的功率实际上 就等于-snr(dBW)。如果 x 是复数,那么 awgn 将添加复数噪声。 awgn(x,snr,sigpower) 这个方法是假设了输入信号的功率为 sigpower(单位:dBW)。 awgn(x,snr,’measured’) 首先计算输入信号 x 的功率,然后按照 snr 添加相应功率的高斯 白噪声。 此外 MATLAB 中提供的 randn 函数也可以用来产生加性高斯白噪声。 randn(m,n) 返还一个 m 行 n 列的随机矩阵,其中每一行和每一列都服从均值为 0, 方差为 1 的正态分布。 若 x 为已知时域信号,则 n=sqrt(pn)*randn(1,length(x)) 是产生均值为 0、方差为 pn 的与信号同维的高斯白噪声信号,pn 往往可根据信噪比求得。 要求五:分别利用 awgn 函数和 randn 函数针对正旋波信号产生高斯白噪声,并做图对 比正旋波信号、高斯白噪声信号和叠加了噪声以后的信号;分析信号功率、噪声功率和信 噪比的理论关系并验证。 三、程序实例 例 指数信号 指数信号在 MATLAB 中用 exp 函数表示。 如 at f (t) Ae ,调用格式为 ft=A*exp(a*t) 程序是 A=1; a=-0.4; t=0:0.01:10; %定义时间点 ft=A*exp(a*t); %计算这些点的函数值 plot(t,ft); %画图命令,用直线段连接函数值表示曲线 grid on; %在图上画方格 例 正弦信号 正弦信号在 MATLAB 中用 sin 函数表示。 调用格式为 ft=A*sin(w*t+phi) A=1; w=2*pi; phi=pi/6; t=0:0.01:8; %定义时间点
ft=A*sin(w*+phi);%计算这些点的函数值%画图命令plot(t,ft),grid on;%在图上画方格例抽样信号抽样信号Sa(t)=sin(t)/t在MATLAB中用sinc函数表示。定义为Sa(t)=sinc(t/元)t=-3*pi:pi/100:3*pi;ft=sinc(t/pi),plot(t,ft),grid on;%定义画图范围,横轴,纵轴axis([-10,10,-0.5,1.2]);title(抽样信号)%定义图的标题名字例三角信号三角信号在MATLAB中用tripuls函数表示。调用格式为ft=tripuls(t,width,skew),产生幅度为1,宽度为width,且以0为中心左右各展开width/2大小,斜度为skew的三角波。width的默认值是1,skew的取值范围是-1~+1之间。一般最大幅度1出现在t=(width/2)*skew的横坐标位置。t=-3:0.01:3;ft=tripuls(t,4,0.5);plot(t,ft); grid on,axis([-3,3,-0.5,1.5]);例虚指数信号调用格式是fexp(G*w)*t)t=0:0.01:15;w=pi/4;X=exp(j*w*t),Xr=real(X),%取实部Xi=imag(X);%取虚部Xa=abs(X);%取模%取相位Xn=angle(X)subplot(2,2,1),plot(t,Xr),axis([0,15,-(max(Xa)+0.5),max(Xa)+0.5),title(实部);subplot(2,2,3),plot(t,Xi),axis([0,15,-(max(Xa)+0.5),max(Xa)+0.5)),title(虚部),subplot(2,2,2),plot(t,Xa),axis([0,15,0,max(Xa)+1)),title(模);subplot(2,2,4),plot(t,Xn),axis([0,15,-(max(Xn)+1),max(Xn)+1)),title(相角');%subplot(m,ni)命令是建立m行n列画图窗口,并指定画图位置i例复指数信号调用格式是f=exp((a+j*b)*t)t=0:0.01:3;a=-1;b=10;f=exp((a+j*b)*t);subplot(2,2,1),plot(t,real(f),title(实部)subplot(2,2,3),plot(t,imag(f),title(虚部)
ft=A*sin(w*t+phi); %计算这些点的函数值 plot(t,ft); %画图命令 grid on; %在图上画方格 例 抽样信号 抽样信号 Sa(t)=sin(t)/t 在 MATLAB 中用 sinc 函数表示。 定义为 Sa(t) sin c(t / ) t=-3*pi:pi/100:3*pi; ft=sinc(t/pi); plot(t,ft); grid on; axis([-10,10,-0.5,1.2]); %定义画图范围,横轴,纵轴 title('抽样信号') %定义图的标题名字 例 三角信号 三角信号在 MATLAB 中用 tripuls 函数表示。 调用格式为 ft=tripuls(t,width,skew),产生幅度为 1,宽度为 width,且以 0 为中心左右各 展开 width/2 大小,斜度为 skew 的三角波。width 的默认值是 1,skew 的取值范围是-1~+1 之间。一般最大幅度 1 出现在 t=(width/2)*skew 的横坐标位置。 t=-3:0.01:3; ft=tripuls(t,4,0.5); plot(t,ft); grid on; axis([-3,3,-0.5,1.5]); 例 虚指数信号 调用格式是 f=exp((j*w)*t) t=0:0.01:15; w=pi/4; X=exp(j*w*t); Xr=real(X); %取实部 Xi=imag(X); %取虚部 Xa=abs(X); %取模 Xn=angle(X); %取相位 subplot(2,2,1),plot(t,Xr),axis([0,15,-(max(Xa)+0.5),max(Xa)+0.5]), title('实部'); subplot(2,2,3),plot(t,Xi),axis([0,15,-(max(Xa)+0.5),max(Xa)+0.5]), title('虚部'); subplot(2,2,2), plot(t,Xa),axis([0,15,0,max(Xa)+1]),title('模'); subplot(2,2,4),plot(t,Xn),axis([0,15,-(max(Xn)+1),max(Xn)+1]),title('相角'); %subplot(m,n,i) 命令是建立 m 行 n 列画图窗口,并指定画图位置 i 例 复指数信号 调用格式是 f=exp((a+j*b)*t) t=0:0.01:3; a=-1;b=10; f=exp((a+j*b)*t); subplot(2,2,1),plot(t,real(f)),title('实部') subplot(2,2,3),plot(t,imag(f)),title('虚部')