自学内容网 自学内容网

实验二 系统响应及系统稳定性

实验目的

(1)学会运用Matlab 求解离散时间系统的零状态响应;

(2)学会运用Matlab 求解离散时间系统的单位取样响应;

(3)学会运用Matlab 求解离散时间系统的卷积和。

实验原理及实例分析

1. 离散时间系统的响应

【例2-1】已知某LTI系统的差分方程为:

3 y ( n ) − 4 y ( n − 1 ) + 2 y ( n − 2 ) = x ( n ) + 2 x ( n − 1 ) 3y(n)-4y(n-1)+2y(n-2)=x(n)+2x(n-1) 3y(n)4y(n1)+2y(n2)=x(n)+2x(n1)

试用Matlab命令绘出当激励信号为 x ( n ) = ( 1 2 ) n u ( n ) x(n)=(\frac{1}{2})^n u(n) x(n)=(21)nu(n) 时该系统的零状态响应。

a=[3 -4 2];
b=[1 2];
n=0:30;
x=(1/2).^n;
%%%
% 函数名:filter(b,a,x)
% 功能:计算离散系统的零状态响应
% 格式:filter(b,a,x), 其中a 为响应的系数行向量,b 为激励的系数行向量,x 为激励序列。
y=filter(b,a,x);
%%%
stem(n,y,'filled'),grid on
xlabel('n'),title('系统响应y(n)')

2. 离散时间系统的单位取样响应

系统的单位取样响应定义为系统在 δ ( n ) \delta (n) δ(n) 激励下系统的零状态响应,用 h ( n ) h(n) h(n) 表示。

Matlab 求解单位取样响应可利用函数filter,并将激励设为单位抽样序列。

例如,求解实例2-1 中系统的单位取样响应时,MATLAB 源程序为:

a=[3 -4 2];
b=[1 2];
n=0:30;
x=(n==0);% 产生单位抽样序列
h=filter(b,a,x);
stem(n,h,"fill"),grid on
xlabel('n'),title('系统单位取样响应h(n)')

Matlab另一种求单位取样响应的方法是利用控制系统工具箱提供的函数impz来实现。

a=[3 -4 2];
b=[1 2];
%%%
% 函数名:impz(b,a,N)
% 功能:求离散系统的单位响应并绘出图形
% 格式:其中,a 为响应的系数行向量,b 为激励的系数行向量,参数N通常为正整数,代表计算单位取样响应的样值个数。
impz(b,a,30);
%%%
grid on;
title('系统单位取样响应h(n)');

程序运行结果如图2-3 所示,比较图2-1 和图2-2,不难发现结果相同。

3. 离散时间信号的卷积和运算

【例2-2】利用Matlab 的conv 命令求两个长为4 的矩形序列的卷积和。

即: g ( n ) = [ u ( n ) − u ( n − 4 ) ] ∗ [ u ( n ) − u ( n − 4 ) ] \textrm{g}\left(n\right)=\left\lbrack u\left(n\right)-u\left(n-4\right)\right\rbrack *\left\lbrack u\left(n\right)-u\left(n-4\right)\right\rbrack g(n)=[u(n)u(n4)][u(n)u(n4)]

x1=ones(1,4);
x2=ones(1,4);
%%%
% 函数名f=conv(f1,f2)
% 功能:求卷积
% 格式:f1,f2 为参与卷积运算的两个序列,f 为卷积的结果,f 的长度为length(f1)+length(f2)-2
g=conv(x1,x2);
%%%
n=0:length(x1)+length(x2)-2;
stem(n,g,'filled'),grid on,xlabel('n')

【例2-3】已知某系统的单位取样响应为 h ( n ) = 0. 8 n [ u ( n ) − u ( n − 8 ) ] h\left(n\right)=0.8^n \left\lbrack u\left(n\right)-u\left(n-8\right)\right\rbrack h(n)=0.8n[u(n)u(n8)] ,试求Matlab 求当激励信号为 x ( n ) = u ( n ) − u ( n − 4 ) x\left(n\right)=u\left(n\right)-u\left(n-4\right) x(n)=u(n)u(n4) 时,系统的零状态响应。

解:Matlab 中可通过卷积求解零状态响应,即 x ( n ) ∗ h ( n ) x\left(n\right)*h\left(n\right) x(n)h(n) 。由题意可知,

描述 h ( n ) h\left(n\right) h(n) 向量的长度至少为 8,描述 x ( n ) x\left(n\right) x(n) 向量的长度至少为 4,因此为了图形

完整美观,我们将 h ( n ) h\left(n\right) h(n) 向量和 x ( n ) x\left(n\right) x(n) 向量加上一些附加的零值。

addpath('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件');

% 定义x(n)向量显示范围(添加了附加的零值)
nx = -1:5;
% 定义h(n)向量显示范围(添加了附加的零值)
nh = -2:10;

% 生成单位阶跃序列
x = uDT(nx) - uDT(nx-4);
% 生成h(n)序列
h = 0.8.^nh .* (uDT(nh) - uDT(nh-8));

% 计算卷积
y = conv(x, h);

% 计算卷积结果的起始点和终点
ny1 = nx(1) + nh(1);
ny2 = nx(end) + nh(end);
ny = ny1:ny2;

% 绘制x(n)的图像
subplot(311);
stem(nx, x, 'fill');
grid on;
xlabel('n');
title('x(n)');
axis([-4 16 0 3]);

% 绘制h(n)的图像
subplot(312);
stem(nh, h, 'fill');
grid on;
xlabel('n');
title('h(n)');
axis([-4 16 0 3]);

% 绘制y(n)的图像
subplot(313);
stem(ny, y, 'fill');
grid on;
xlabel('n');
title('y(n) = x(n) * h(n)');
axis([-4 16 0 3]);

实验内容

(1)试用Matlab 命令求解以下离散时间系统的单位取样响应,并判断系统的稳定性。

$ 1)~~3y\left(n\right)+4y\left(n-1\right)+y\left(n-2\right)=x\left(n\right)+x\left(n-1\right) $

clear;
clc;
close;

a1=[3 4 1];
b1=[1 1];
n=0:30;
x=(n==0);% 产生单位抽样序列
h=filter(b1,a1,x);
subplot(211);
stem(n,h,"fill")
grid on
xlabel('n')
title('filter法-系统单位取样响应h(n)')

subplot(212);
impz(b1,a1,30);
grid on;
title('impz法-系统单位取样响应h(n)');
%%%
% 函数名:zplane(b,a)
% 功能:得到系统函数H(z)的零极点分布图
% 格式:其中b和a分别表示H(z)的分子和分母多项式的系数向量,函数的作用是在z平面上画出单位圆,零点和极点。
%%%
zplane(b1,a1);

$ 2)~~\frac{5}{2}y\left(n\right)+6y\left(n-1\right)+10y\left(n-2\right)=x\left(n\right) $

close;
a2=[5/2 6 10];
b2=[1];
n=0:30;
x=(n==0);% 产生单位抽样序列
h=filter(b2,a2,x);
subplot(211)
stem(n,h,"fill")
grid on
xlabel('n')
title('filter法-系统单位取样响应h(n)')
subplot(212)
impz(b2,a2,31)
axis([0 30 -3*10^8 2*10^8]);
grid on
title('impz法-系统单位取样响应h(n)')
zplane(b2,a2);

(2)已知某系统的单位取样响应为 h ( n ) = ( 7 8 ) n [ u ( n ) − u ( n − 10 ) ] h\left(n\right)={\left(\frac{7}{8}\right)}^n \left\lbrack u\left(n\right)-u\left(n-10\right)\right\rbrack h(n)=(87)n[u(n)u(n10)] , 试用MATLAB 求当激励信号为 x ( n ) = u ( n ) − u ( n − 5 ) x\left(n\right)=u\left(n\right)-u\left(n-5\right) x(n)=u(n)u(n5) 时,系统的零状态响应。

clear;
addpath('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件');
% 定义x(n)向量显示范围(添加了附加的零值)
nx = -1:6;
% 定义h(n)向量显示范围(添加了附加的零值)
nh = -1:11;

% 生成单位阶跃序列
x = uDT(nx) - uDT(nx-5);
% 生成h(n)序列
h = (7/8).^nh .* (uDT(nh) - uDT(nh-10));

% 计算卷积
y = conv(x, h);

% 计算卷积结果的起始点和终点
ny1 = nx(1) + nh(1);
ny2 = nx(end) + nh(end);
ny = ny1:ny2;

% 绘制x(n)的图像
subplot(311);
stem(nx, x, 'fill');
grid on;
xlabel('n');
title('x(n)');
axis([-4 18 0 2]);

% 绘制h(n)的图像
subplot(312);
stem(nh, h, 'fill');
grid on;
xlabel('n');
title('h(n)');
axis([-4 18 0 2]);

% 绘制y(n)的图像
subplot(313);
stem(ny, y, 'fill');
grid on;
xlabel('n');
title('y(n) = x(n) * h(n)');
axis([-4 18 0 4]);

(3)用数字图像处理中的Sobel 算子,调用conv2 函数对lena 图像进行滤波。

设两个3×3 的Sobel 矩阵算子Gx=[-1 0 1;-2 0 2;-1 0 1],Gy=[1 2 1;0 0 0;-1-2 -1]。

  1. 读取lena 图像数据,保存到B 矩阵中;

  2. 分如下三种情况对B 进行卷积滤波

     ① 采用Gx 与B 进行卷积;

     ② 采用Gy 与的B 进行卷积;

     ③ 先采用Gx 与B 进行卷积,然后再采用Gy 与B 进行卷积;

     ④ 在一个figure 中,分四个子图显示出:原始图像,经过Gx 卷积滤波后

图像、经过Gy 卷积滤波后图像,先后采用Gx 和Gy 与的B 进行卷积滤波后

的图像,观察滤波后的图像的效果。

clear;
% 定义Sobel算子
Gx = [-1 0 1; -2 0 2; -1 0 1];
Gy = [1 2 1; 0 0 0; -1 -2 -1];

% 读取Lena图像
B = imread('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件\lena.bmp') 
B = 512x512 uint8 矩阵    
   131   136   133   132   137   137   135   138   133   134   132   128   128   129   126   122   122   120   118   116   113   108   103    99    84    86    77    74    71    67    68    60    59    57    52    56    67    67    62    65    70    73    67    64    70    71    72    79    73    74
   134   135   132   134   139   133   130   138   140   138   133   126   124   124   122   118   122   120   118   117   114   109   103    98    91    94    81    76    70    65    66    57    60    69    70    68    66    59    60    73    75    75    73    72    71    71    70    71    80    69
   136   129   137   134   130   135   132   133   135   130   127   128   131   131   126   121   121   114   116   115   108   107   102    90    89    84    78    84    70    69    60    57    55    54    56    60    56    67    59    65    68    72    77    76    69    65    71    80    74    76
   137   130   137   135   131   135   132   132   135   131   128   129   132   132   127   122   124   122   117   112   114   109   102    99   100    89    76    76    62    66    65    67    62    62    65    67    64    73    67    73    58    62    69    73    70    65    65    68    76    77
   137   132   137   135   131   134   133   132   135   132   129   129   132   132   128   124   127   125   116   110   115   108   105   103    97    89    79    81    67    69    64    64    56    57    62    62    59    66    62    69    66    66    69    74    75    73    73    75    75    71
   137   133   136   136   132   133   133   131   134   130   128   128   130   130   127   124   127   120   115   112   114   104   108   101    95    87    79    83    69    69    63    61    53    53    60    58    56    61    59    65    67    67    70    74    75    73    75    79    76    79
   136   134   134   136   132   131   134   130   131   128   126   126   128   128   126   124   124   120   115   114   120   103   108    99    90    85    79    83    70    69    61    58    62    60    68    65    66    68    67    72    63    68    77    82    80    74    74    78    65    66
   134   133   132   135   132   130   135   130   129   127   125   125   126   126   125   124   121   125   116   113   131   105   105   103    89    83    77    83    69    69    61    59    64    60    68    63    68    69    68    70    68    72    79    82    78    73    75    80    72    78
   132   132   130   134   131   129   136   130   129   127   126   125   126   127   126   126   120   125   114   111   132   102   105   103    96    86    75    76    63    67    66    68    60    53    60    55    64    65    63    62    71    70    70    71    69    66    68    73    76    74
   131   132   129   134   131   129   136   130   130   128   127   126   127   127   127   127   120   119   111   110   125    97   107   100    92    85    77    82    69    71    66    66    64    55    61    56    67    68    65    63    76    73    73    76    77    74    70    68    77    73


% ① 采用Gx与B进行卷积
B_Gx = conv2(B, Gx, 'same');

% ② 采用Gy与B进行卷积
B_Gy = conv2(B, Gy, 'same');

% ③ 先采用Gx与B进行卷积,然后再采用Gy与B进行卷积
B_Gx_Gy = conv2(B_Gx, Gy, 'same');

% ④ 在一个figure中,分四个子图显示图像
figure;
subplot(2,2,1), imshow(B), title('原始图像');
subplot(2,2,2), imshow(B_Gx, []), title('Gx卷积滤波后图像');
subplot(2,2,3), imshow(B_Gy, []), title('Gy卷积滤波后图像');
subplot(2,2,4), imshow(B_Gx_Gy, []), title('Gx和Gy卷积滤波后图像');

原始图像:未经处理的灰度图像。

Gx卷积滤波后图像:突出水平边缘。

Gy卷积滤波后图像:突出垂直边缘。

Gx和Gy卷积滤波后图像:结合两者,全面突出边缘。

思考题

(1) Matlab 的工具箱函数conv,能用于计算两个有限长序列之间的卷积,但conv 函数假定这两个序列都从n=0 开始。试编写M 文件计算x(n) = [3,11,7,0,−1,4,2],−3≤ n ≤ 3 和 h(n) = [2,3,0,−5,2,1],−1≤ n ≤ 4 之 间 的 卷积,并绘制y(n)的波形图。

close;
clear;
% 定义序列 x(n) 和 h(n)
nx = -3:3; % n 的范围
x = [3, 11, 7, 0, -1, 4, 2]; % x(n)

nh = -1:4; % n 的范围
h = [2, 3, 0, -5, 2, 1]; % h(n)

% 计算卷积
y = conv(x, h);

% 定义 y(n) 的范围
ny = nx(1) + nh(1) : nx(end) + nh(end); % y(n) 的范围

% 绘制x(n)的图像
subplot(311);
stem(nx, x, 'fill');
grid on;
xlabel('n');
title('x(n)');
axis([-4 8 -5 15]);

% 绘制h(n)的图像
subplot(312);
stem(nh, h, 'fill');
grid on;
xlabel('n');
title('h(n)');
axis([-4 8 -5 5]);

% 绘制y(n)的图像
subplot(313);
stem(ny, y, 'fill');
grid on;
xlabel('n');
title('y(n) = x(n) * h(n)');
axis([-4 8 -80 80]);

(2) 在数字图像处理边缘检测技术中,除了Sobel 算子外,还有哪些边缘检测算子?通过查找资料,选择某种边缘检测算子,在Matlab 平台上编程实现对lena 或其他图像进行边缘检测,显示出原图和边缘检测后的图像。

  • Prewitt 算子
  • Canny 边缘检测
  • Roberts 交叉梯度算子
  • Laplacian 边缘检测
  • Scharr 算子

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)_ubuntu写出roberts、sobel、laplace边缘检测算法-CSDN博客

图像特征与边缘检测:从Sobel算子到Canny边缘检测【计算机视觉】-CSDN博客

clear;
% 读取图像
img = imread([...
    '.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件\lena_colour.bmp'
    % '运动.jpg'
    % '东方明珠.jpg'
    ]);
img_RGB = img; % MATLAB 读取图像默认是 RGB 格式

% 灰度化处理图像
grayImage = rgb2gray(img);

% 高斯滤波
gaussianBlur = imgaussfilt(grayImage, 1); % 1 为标准差

% 阈值处理
binary = imbinarize(gaussianBlur, 0.5); % 0.5 为阈值

% Roberts算子
kernelx = [-1 0; 0 1];
kernely = [0 -1; 1 0];
x_roberts = imfilter(double(binary), kernelx);
y_roberts = imfilter(double(binary), kernely);
Roberts = uint8(sqrt(x_roberts.^2 + y_roberts.^2));

% Prewitt算子
kernelx = [1 1 1; 0 0 0; -1 -1 -1];
kernely = [-1 0 1; -1 0 1; -1 0 1];
x_prewitt = imfilter(double(binary), kernelx);
y_prewitt = imfilter(double(binary), kernely);
Prewitt = uint8(sqrt(x_prewitt.^2 + y_prewitt.^2));

% Sobel算子
Sobel_x = imfilter(double(binary), fspecial('sobel'));
Sobel_y = imfilter(double(binary), fspecial('sobel')');
Sobel = uint8(sqrt(Sobel_x.^2 + Sobel_y.^2));

% Laplacian算子
Laplacian = uint8(imfilter(double(binary), fspecial('laplacian')));

% 显示图像
figure;
subplot(2, 3, 1), imshow(img_RGB), title('原始图像'), axis off;
subplot(2, 3, 2), imshow(binary,[]), title('二值图'), axis off;
subplot(2, 3, 3), imshow(Roberts,[]), title('Roberts算子'), axis off;
subplot(2, 3, 4), imshow(Prewitt,[]), title('Prewitt算子'), axis off;
subplot(2, 3, 5), imshow(Sobel,[]), title('Sobel算子'), axis off;
subplot(2, 3, 6), imshow(Laplacian,[]), title('Laplacian算子'), axis off;
clear;

% 读取图像
img = imread('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件\lena_colour.bmp');
img_RGB = img; % MATLAB 读取图像默认是 RGB 格式

% 灰度化处理图像
grayImage = rgb2gray(img);

% 高斯滤波
gaussianBlur = imgaussfilt(grayImage, 1); % 1 为标准差

% 阈值处理
binary = imbinarize(gaussianBlur, 0.); % 0.5 为阈值

% Roberts算子(使用 conv2)
kernelx = [-1 0; 0 1];
kernely = [0 -1; 1 0];
x_roberts = conv2(double(binary), kernelx, 'same');
y_roberts = conv2(double(binary), kernely, 'same');
Roberts = uint8(sqrt(x_roberts.^2 + y_roberts.^2));

% Prewitt算子(使用 conv2)
kernelx_prewitt = [1 1 1; 0 0 0; -1 -1 -1];
kernely_prewitt = [-1 0 1; -1 0 1; -1 0 1];
x_prewitt = conv2(double(binary), kernelx_prewitt, 'same');
y_prewitt = conv2(double(binary), kernely_prewitt, 'same');
Prewitt = uint8(sqrt(x_prewitt.^2 + y_prewitt.^2));

% Sobel算子(使用 conv2)
Sobel_x = conv2(double(binary), fspecial('sobel'), 'same');
Sobel_y = conv2(double(binary), fspecial('sobel')', 'same');
Sobel = uint8(sqrt(Sobel_x.^2 + Sobel_y.^2));

% Laplacian算子(使用 conv2)
Laplacian = uint8(conv2(double(binary), fspecial('laplacian'), 'same'));

% 显示图像
figure;
subplot(2, 3, 1), imshow(img_RGB), title('原始图像'), axis off;
subplot(2, 3, 2), imshow(binary, []), title('二值图'), axis off;
subplot(2, 3, 3), imshow(Roberts, []), title('Roberts算子'), axis off;
subplot(2, 3, 4), imshow(Prewitt, []), title('Prewitt算子'), axis off;
subplot(2, 3, 5), imshow(Sobel, []), title('Sobel算子'), axis off;
subplot(2, 3, 6), imshow(Laplacian, []), title('Laplacian算子'), axis off;


原文地址:https://blog.csdn.net/weixin_73384981/article/details/144011291

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!