一、实验目的

  1. 熟悉MATLAB编程环境、掌握MATLAB编程特点、了解数字信号处理工具箱;掌握常用图形绘制与标注方法。

  2. 掌握基于计算机软件的正弦序列、指数序列、复正弦序列、多频正弦序列、含噪声序列的生成方法。

  3. 掌握MATLAB的函数编程方法,掌握滑动平均滤波原理及实现方法,掌握窗口长度对滑动平均结果的影响规律。

二、实验过程与结果

  1. 数字信号生成

(1) 简单序列生成

简单序列是能够利用初等数学函数直接生成的离散时间信号。在MATLAB境下编写源代码生成并绘制(stem函数绘图、xlabel与ylabel标注)以下序列:

(a) 正弦序列:生成频率ω1=π/16、长度N1=100的余弦序列x1[n]=cos(ω1n),其中0≤n≤ N1-1;生成频率为ω2=15π/16 、长度N2=100的余弦序列x2[n]=cos(ω2n),其中0≤n≤ N2-1。

(b) 指数序列:生成r1=0.9、长度N1=30的序列x1[n]=r1n,其中0≤n≤ N1-1;生成r2=-0.9、长度N2=30的序列x2[n]=r2n,其中0≤n≤ N2-1。

© 复正弦序列:生成指数因子r=0.9、数字频率ω=π/8长度N=50的序列x[n]=rnejωn,其中0≤n≤ N-1。

(2) 复合序列生成

复合序列是由若干个初等函数生成的离散时间信号叠加而成的序列,在MATLAB环境下编写源代码生成并绘制(stem函数绘图、xlabel与ylabel标注)以下序列:

(a) 多频正弦序列:生成幅度为A1=1.0、频率为ω1=π/32、相位为θ1=0的序列x1[n]=A1cos(ω1n+θ1);生成幅度为A2=0.75、频率为ω2=3π/32、相位为θ2=π/3的序列x2[n]=A2cos(ω2n+θ2);生成幅度为A3=0.25、频率为ω3=5π/32、相位为θ2=2π/3的序列x3[n]=A3cos(ω3n+θ3);以此为基础生成复合序列x[n]=x1[n]+x2[n]+x3[n],其中:N=150,0≤n≤ N-1。

(b) 含噪声正弦序列:生成幅度为A=1.0、频率ω=π/16、相位为θ=0的、长度为N=150的正弦序列s[n]=Acos(ωn+θ);用rand函数生成最大幅度为Am=0.3、均值m=0、长度为N=150的噪声序列z[n]。以此为基础生成含噪声正弦序列x[n]=s[n]+z[n]。

  1. 滑动平均滤波

(1) 编写滑动平均函数:基于2M+1点滑动平均滤波方程img,在MATLAB环境下编写滑动平均函数。

(2) 执行滑动平均滤波:调用第1)步编写的滑动平均函数,对实验内容1生成的含噪声序列x[n],执行3点滑动平均得到y1[n]、执行5点滑动平均得到y2[n]、执行7点滑动平均得到y3[n]、执行9点滑动平均得到y4[n]、执行11点滑动平均得到y5[n]。

三、结果分析与实验结论

  1. 数字信号生成

(1) 简单序列生成

(a) 正弦序列

%% 正弦序列 
 N = 100; n = 0: 1: N-1; 
 omega = 1*pi/16; 
 x = cos(omega * n); 
 subplot(1, 2, 1); 
 stem(n, x); 
 xlabel('n'); ylabel('x1(ω=π/16)'); 
 omega = 31*pi/16; 
 x = cos(omega * n); 
 subplot(1, 2, 2); 
 stem(n, x); 
 xlabel('n'); ylabel('x2(ω=15π/16)'); 
 suptitle("正弦序列");

在这里插入图片描述

从图中可以看出,虽然序列x1[n]和x2[n]的频率ω不同,但是两者经过采样后得到的离散序列确实完全一样的,这是因为cos(pi-x)=cos(x),所以他们看起来是一样的。

(b) 指数序列

源代码:

%% 指数序列 
 r = 0.9; N = 30; 
 n = 0: 1: N-1; 
 x = r.^n; 
 n = 0: 1: N-1; 
 subplot(1, 2, 1); 
 stem(n, x); 
 xlabel('n'); ylabel('x1(r=0.9)'); 
 r = -0.9; 
 subplot(1, 2, 2); 
 x = r.^n; 
 stem(n, x); 
 xlabel('n'); ylabel('x2(r=-0.9)'); 
 suptitle("指数序列");

2

从图中可以看出,由于r<1,两个序列的绝对值都是随着n的增大而减小,但由于r2<0,x2[n]呈现振荡减小的趋势。由数学知识可知,当0<r<1时,r越小,收敛速度越快。

© 复正弦序列

源代码:

*%%* *复正弦序列* 
 r = 0.9; omega = pi/8; N = 50; 
 n = 0: 1: N-1; 
 xc = real((r.^n) .* exp(1i*omega*n)); 
 xs = imag((r.^n) .* exp(1i*omega*n)); 
 n = 0: 1: N-1; 
 subplot(1, 2, 1); 
 stem(n, xs); 
 xlabel('n'); ylabel('虚部序列值'); 
 subplot(1, 2, 2); 
 stem(n, xc); 
 xlabel('n'); ylabel('实部序列值'); 
 suptitle("复正弦序列");

复正弦序列

从图中可以看出,两者的变化趋势一模一样,只是相差了一个pi/2的相位差,这是因为他们都是同一个指数的三角函数形式。

(2) 复合序列生成

(a) 多频正弦序列

源代码:

*%%* *多频正弦序列*

N = 150; n = 0: 1: N-1; 
 A = 1; omega = pi/32; theta = 0; 
 x1 = A*cos(omega*n+theta); 
 A = 0.75; omega = 3*pi/32; theta = pi/3; 
 x2 = A*cos(omega*n+theta); 
 A = 0.25; omega = 5*pi/32; theta = 2*pi/3; 
 x3 = A*cos(omega*n+theta); 
 x = x1 + x2 + x3; 
 figure(1); 
 subplot(2, 2, 1); stem(n, x1); 
 xlabel('n'); ylabel('x1=π/32n'); 
 subplot(2, 2, 2); stem(n, x2); 
 xlabel('n'); ylabel('x2=0.75(3π/32n+π/3)'); 
 subplot(2, 2, 3); stem(n, x3); 
 xlabel('n'); ylabel('x3=0.25(5π/32n+2π/3)'); 
 subplot(2, 2, 4); stem(n, x); 
 xlabel('n'); ylabel('x(叠加正弦序列)'); 
 suptitle("多频正弦序列");

多频正弦序列

从图中可以看出,三个原始正弦序列由于A,ω,θ的不同都成现不同形式的周期正弦波动,叠加后的序列x[n]也呈现出周期性。最后序列的周期为前三个序列周期的最小公倍数,也就是64,从图形中验证得正确。

(b) 含噪声正弦序列

*%%* *含噪声正弦序列* 
 A = 1; omega = pi/16; theta = 0; N =150; n = 0: 1: N-1; 
 s = A * cos(omega * n + theta); 
 z = 0.6*(rand(N)-0.5); z = z(1, :); 
 x = s + z; 
 subplot(1, 2, 1); stem(n, s); 
 xlabel('n'); ylabel('s'); 
 subplot(1, 2, 2); stem(n, x); 
 xlabel('n'); ylabel('x'); 
 suptitle("含噪声正弦序列");

含噪声正弦序列从图中可以看出,叠加噪声之后的正弦序列没有显示出原来的周期性,幅值大小也发生了变化,但整体上仍然能够看出原正弦序列的大致轮廓。

  1. 滑动平均滤波

源代码:

slide_average_filter.m

% x为滤波的序列,m为滑动窗口的大小 
 function y = slide_average_filter(x, m) 
 y = x; 
 for n = m+1: 1: length(x)-m 
   y(n)=0; 
   for k = n-m: 1: n+m 
     y(n) = y(n) + x(k); 
   end 
   y(n) = y(n)/(2*m+1); 
 end 
 end 


%% 滑动平均滤波 
 A = 1; omega = pi/16; theta = 0; N =150; n = 0: 1: N-1; 
 s = A * cos(omega * n + theta); 
 z = 0.6*(rand(N)-0.5); z = z(1, :); 
 x = s + z; 
 y1 = slide_average_filter(x, 1); 
 y2 = slide_average_filter(x, 2); 
 y3 = slide_average_filter(x, 3); 
 y4 = slide_average_filter(x, 4); 
 y5 = slide_average_filter(x, 5); 
 figure(1); 
 subplot(3, 2, 1); stem(n, x); 
 xlabel('n'); ylabel('x'); 
 subplot(3, 2, 2); stem(n, y1); 
 xlabel('n'); ylabel('y1(3点滑动)'); 
 subplot(3, 2, 3); stem(n, y2); 
 xlabel('n'); ylabel('y2(5点滑动)'); 
 subplot(3, 2, 4); stem(n, y3); 
 xlabel('n'); ylabel('y3(7点滑动)'); 
 subplot(3, 2, 5); stem(n, y4); 
 xlabel('n'); ylabel('y4(9点滑动)'); 
 subplot(3, 2, 6); stem(n, y5); 
 xlabel('n'); ylabel('y5(11点滑动)'); 

滑动滤波从图中可以看出,经过滑动平均滤波后的含噪声的正弦序列相比原序列更加平缓,也更趋向于正弦序列,噪声对其影响也在减小。随着M的增大,滤波后的序列与正弦序列更加接近,噪声的影响更小,但是信号也变得越来越平滑,损失了很多原始信息。

)');


从图中可以看出,经过滑动平均滤波后的含噪声的正弦序列相比原序列更加平缓,也更趋向于正弦序列,噪声对其影响也在减小。随着M的增大,滤波后的序列与正弦序列更加接近,噪声的影响更小,但是信号也变得越来越平滑,损失了很多原始信息。



 

 

 
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐