数字信号处理实验一:序列生成和滑动滤波
一、实验目的
-
熟悉MATLAB编程环境、掌握MATLAB编程特点、了解数字信号处理工具箱;掌握常用图形绘制与标注方法。
-
掌握基于计算机软件的正弦序列、指数序列、复正弦序列、多频正弦序列、含噪声序列的生成方法。
-
掌握MATLAB的函数编程方法,掌握滑动平均滤波原理及实现方法,掌握窗口长度对滑动平均结果的影响规律。
二、实验过程与结果
- 数字信号生成
(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) 编写滑动平均函数:基于2M+1点滑动平均滤波方程
,在MATLAB环境下编写滑动平均函数。
(2) 执行滑动平均滤波:调用第1)步编写的滑动平均函数,对实验内容1生成的含噪声序列x[n],执行3点滑动平均得到y1[n]、执行5点滑动平均得到y2[n]、执行7点滑动平均得到y3[n]、执行9点滑动平均得到y4[n]、执行11点滑动平均得到y5[n]。
三、结果分析与实验结论
- 数字信号生成
(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("指数序列");

从图中可以看出,由于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("含噪声正弦序列");
从图中可以看出,叠加噪声之后的正弦序列没有显示出原来的周期性,幅值大小也发生了变化,但整体上仍然能够看出原正弦序列的大致轮廓。
- 滑动平均滤波
源代码:
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的增大,滤波后的序列与正弦序列更加接近,噪声的影响更小,但是信号也变得越来越平滑,损失了很多原始信息。
更多推荐



所有评论(0)