实验项目 | 离散时间系统的时域分析 | ||
实验类别 | 基本性实验 | 实验学时 | 4学时 |
实验目的及设备 | 一、实验目的 1.在时域中仿真离散时间系统,进而理解离散时间系统对输入信号或延迟信号进行简单运算处理,生成具有所需特性的输出信号的方法。 2.仿真并理解线性与非线性、时变与时不变等离散时间系统。 3.掌握线性时不变系统的冲激响应的计算,并用计算机仿真实现。 4.仿真并理解线性时不变系统的级联、验证线性时不变系统的稳定特性。 二、实验设备 计算机,MATLAB语言环境。 |
预 习 |
三、实验基础理论 1.系统的线性性质 线性性质表现为系统满足线性叠加原理:若某一输入是由N个信号的加权和组成的,则输出就是系统对这N个信号中每一个的响应的相应加权和组成的。 设x1(n)和x2(n)分别作为系统的输入序列,其输出分别用y1(n)和y2(n)表示,即 y1(n)=T[x1(n)],y2=T[x2(n)] 若满足 T[a1x1(n)+a2x2(n)]=a1y1(n)+a2y2(n) 则该系统服从线性叠加原理,或者称该系统为线性系统。 2.系统的时不变特性 若系统的变换关系不随时间变化而变化,或者说系统的输出随输入的移位而相应移位但形状不变,则称该系统为时不变系统(或称为移不变系统)。 对时不变系统,若y(n)=T[x(n)],则T[x(n-m)]=y(n-m) 3.系统的因果性 系统的因果性即系统的可实现性。如果系统时刻的输出取决于时刻及时刻以前的输入,而和时刻以后的输入无关,则该系统是可实现的,是因果系统。系统具有因果性的充分必要条件为 h(n)=0,n<0 4.系统的稳定性 稳定系统是指有界输入产生有界输出(BIBO)的系统。如果对于输入序列,存在一个不变的正有限值,对于所有值满足 则称该输入序列是有界的。稳定性要求对于每个有界输入存在一个不变的正有限值,对于所有值,输出序列满足 系统稳定的充分必要条件是系统的单位取样响应绝对可和,用公式表示为 5.系统的冲激响应 设系统输入 ![]() ,系统输出y(n)的初始状态为零,这时系统输出用h(n) 表示,即 ![]() 则称h(n)为系统的单位脉冲响应。 对于任意输入信号x(n),系统输出为 ![]() 利用系统满足叠加原理得到 ![]() 利用系统时不变性质得到 ![]() 上式的运算关系称为卷积运算。 6.卷积的性质 1)交换律 ![]() 2)结合律 ![]() 3)分配律 ![]() |
实 验 内 容 |
(说明:此部分应包含:实验内容、实验步骤、实验数据与分析过程等) 实验内容与步骤: 1.离散时间系统的仿真 1)M点因果滑动平滑系统的仿真,时域表达为 ![]() 过上述时域平滑系统可实现由若干个正弦信号之和所组成的信号中滤出高频分量。据此,可以理解M点因果滑动平滑系统。 实验步骤: 1.一个多个正弦信号成分的输入信号 如: (2*sin(2 * pi * f1 * t)+sin(2 * pi * f2 * t)) 2.定义因果滑动平滑系统,其中M是滑动窗口的大小。 3.遍历信号并在每个时刻计算窗口内信号的均值,将这个均值作为输出信号的值。 4.绘制和平滑后的信号,以便观察平滑系统的效果。 代码: % 定义输入信号,可以包含多个正弦波成分 fs = 1000; % 采样频率 t = 0:1/fs:1; % 时间向量 f1 = 5; % 正弦波1频率 f2 = 50; % 正弦波2频率 signal = 2*sin(2 * pi * f1 * t) +sin(2 * pi * f2 * t); % 定义M点因果滑动平滑系统 M = 15; % 滑动窗口大小 output = zeros(1, length(signal)); % 用于存储输出信号 for n = M:length(signal) % 计算窗口内信号的均值 window_data = signal(n - M + 1:n); smoothed_value = mean(window_data); output(n) = smoothed_value; end % 绘制原始信号和平滑后的信号 figure; subplot(2, 1, 1); plot(t, signal); title('原始信号'); xlabel('时间 (秒)'); ylabel('幅度'); subplot(2, 1, 2); plot(t, output); title('平滑后的信号'); xlabel('时间 (秒)'); ylabel('幅度'); % 显示图形 grid on; 结果: ![]() 2)线性与非线性离散时间系统的仿真。 简单的非线性系统实例:y(n)=x(n)^2 实验思路:定义简单的非线性系统,其中输出信号取决于输入信号的平方,并且在输入信号为负时取相反数。然后,生成线性输入信号 % 生成输入信号 N = 100; % 信号长度 x = linspace(-1, 1, N); % 从-1到1的线性输入信号 % 定义非线性系统 y_nonlinear = zeros(1, N); for n = 1:N if x(n) > 0 y_nonlinear(n) = x(n)^2; else y_nonlinear(n) = -x(n)^2; end end % 绘制输入和输出信号 subplot(2, 1, 1); stem(x); title('输入信号'); subplot(2, 1, 2); stem(y_nonlinear); title('输出信号'); 结果: ![]() 简单的线性系统实例: y[n]=2.24x[n]+2.409x[n-1]+2.2403x[n-2] 代码: % 定义差分方程的系数 a = [2.24, 2.409,2.2403]; % 系统的自回归系数 b = [0, 1, 2]; % 系统的滞后系数 % 生成输入信号 N = 100; % 信号长度 u = randn(1, N); % 随机输入信号 % 使用 filter 函数模拟系统响应 y_linear = filter(b, a, u); % 绘制输入和输出信号 subplot(2, 1, 1); stem(u); title('输入信号'); subplot(2, 1, 2); stem(y_linear); title('输出信号'); 结果: ![]() 3)时变与时不变系统的仿真。 时不变系统实例: ![]() 代码: n=0:40;D=10;a=3;b=-2;x=a*cos(2*pi*0.1*n)+b*cos(2*pi*0.4*n); xd=[zeros(1,D) x]; num=[2.2403 2.4908 2.2403]; den=[1 -0.4 0.75]; ic=[0 0]; y=filter(num,den,x,ic); yd=filter(num,den,xd,ic); d=y-yd(1+D:41+D); subplot(3,1,1) stem(n,y); ylabel('幅度'); title('输出 y[n]'); grid; subplot(3,1,2); stem(n,yd(1:41)); ylabel('幅度'); title(['output due to delayed input x[n,num2str(D)]']);grid; subplot(3,1,3); stem(n,d); xlabel('time index n'); ylabel('幅度');title('差异比较信号'); grid 结果: ![]() 分析: 时不变系统则是在时间平移变换下保持形式不变的系统,由结果图可看出时间的延迟对信号波形没有改变,两者幅度差异为0,因此此系统可看作是时不变系统。 时变系统实例: ![]() 代码: n=[-20:20]; x1=sin(0.05*pi*n); subplot(2,2,1); stem(n,x1); xlabel('n');ylabel('x1'); x2=sin(0.05*pi*(n-1)); subplot(2,2,2); stem(n,x2); xlabel('n');ylabel('x2'); d=x1-x2; subplot(2,2,3);stem(n,d) xlabel('n');ylabel('差异大小d'); 结果: ![]() 通过比较两实验结果可看出:时不变系统是当输入序列延迟n0后,输出的序列也会有n0的延迟,且波形不变,可用y(n-n0)=x(M(n-n0))来表示,而时变系统中,y(n)=x(M(n-n0)) 2.线性时不变系统仿真 1)冲激响应的计算 用MATLAB语言编程实现线性时不变系统的冲激响应计算。 假设我们有一个简单的FIR系统(有限脉冲响应系统): [ H(z) = b_0 + b_1 z^{-1} + b_2 z^{-2} ] 其中 (b_0 = 1), (b_1 = 0.5), (b_2 = 0.2). MATLAB 中,可以使用 impz 函数来计算线性时不变系统的冲激响应。 代码: % 定义系统的传递函数系数 b = [1, 0.5, 0.2]; % 分子多项式系数 % 计算系统的冲激响应 impulse_response = impz(b); % 绘制冲激响应的图形 stem(impulse_response); title('冲激响应'); xlabel('离散时间点'); ylabel('幅度'); 结果: ![]() 2) 在实际应用中高阶因果线性时不变系统可以用低阶因果线性时不变系统级联得到,这可简化系统的设计与实现。例如,对于四阶线性时不变系统 ![]() 可以用二个二阶系统级联实现。 第一级 ![]() 第二级 ![]() 用MATLAB语言编程验证系统的级联。 代码: B1=[1,0.9,0.8]; A1=[0.2,-0.2,0.4]; xn=[1,zeros(1,30)]; hn1=filter(B1,A1,xn); B2=[1,0.7,0.85]; A2=[0.2,-0.5,0.3]; hn2=filter(B2,A2,hn1); n2=0:length(hn2)-1; subplot(2,1,1) stem(n2,hn2,'-') title('级联后的响应') xlabel('n');ylabel('h2(n)') hold on %原始序列 B3=[1,1.6,2.28,1.325,0.68]; A3=[0.06,-0.19,0.27,-0.26,0.12]; xn=[1,zeros(1,30)]; hn=filter(B3,A3,xn); n=0:length(hn)-1; subplot(2,1,2) stem(n,hn,'.'),title('原始序列响应') xlabel('n') ylabel('h(n)') 结果: ![]() 3.线性时不变系统的稳定性 若一个线性时不变系统的冲激响应是绝对可和,则此系统就是BIBO的稳定系统。由此,无限冲激响应线性时不变系统稳定的必要条件是,随着输入序列点的增加,冲激响应衰减到零。用MATLAB语言编程计算一个IIR线性时不变系统冲激响应的绝对值的和,验证稳定特性。 实验思路: 首先定义一个IIR系统,这里使用了一个简单的低通滤波器的传递函数系数(b 和 a)。然后,我们使用 impz 函数计算系统的冲激响应。接下来,我们计算冲激响应的绝对值的和,并输出该值。最后,我们验证系统的稳定性,如果绝对值的和是有限的(不是无穷大),则系统是稳定的(BIBO稳定)。 代码: % 定义一个IIR系统,例如一个简单的低通滤波器 b = [0.1, 0.2, 0.1]; % 分子多项式系数 a = [1, -0.8, 0.64]; % 分母多项式系数 % 计算系统的冲激响应 impulse_response = impz(b, a); % 获取冲激响应序列 % 计算冲激响应的绝对值的和 absolute_sum = sum(abs(impulse_response)); % 输出冲激响应的绝对值的和 disp(['冲激响应的绝对值的和为:', num2str(absolute_sum)]); % 验证系统的稳定性 if absolute_sum < Inf disp('系统是稳定的(BIBO稳定)'); else disp('系统是不稳定的'); end 结果: ![]() 4.滤波概念实验 通过具体的时间系统理解信号滤波概念。如: 系统1 ![]() 系统2 ![]() 对于输入信号 ![]() 实现各系统的滤波输出结果。 代码: B1=[1];A1=[0.5,0.27,0.77]; B2=[1,-0.53,0.46];A2=[0.45,0.5,0.45]; N=0:299; xn=cos((20*pi*n)/256)+cos((200*pi*n)/256); hn1=filter(B1,A1,xn); n1=0:length(hn1)-1; subplot(2,1,1) stem(n1,hn1); xlabel('n'),ylabel('h1(n)'),title('系统1冲激响应') hn2=filter(B2,A2,xn); n2=0:length(hn2)-1;subplot(2,1,2) stem(n2,hn2),xlabel('n'),ylabel('h2(n)'),title('系统2冲激响应') 结果: ![]() 实验扩展与思考: 1. 线性与非线性系统在信号输入/输出上有何不同?时变与时不变系统又有何不同呢? 线性与非线性系统在信号输入/输出上区别: 线性系统:线性系统具有线性性质,这意味着它遵循叠加原理。在线性系统中,如果你将输入信号的线性组合应用到系统中,输出将是这些输入信号的线性组合。数学上,如果 x1(t) 和 x2(t) 是输入信号,y1(t) 和 y2(t) 是相应的输出信号,那么对于线性系统,以下关系成立:a1 * x1(t) + a2 * x2(t) -> a1 * y1(t) + a2 * y2(t),其中 a1 和 a2 是常数。 非线性系统:非线性系统不满足线性性质,即不遵循叠加原理。在非线性系统中,输出信号的行为不仅取决于输入信号的幅度和相位,还可能受到非线性操作的影响,如平方、开方、乘法等。非线性系统通常更复杂,难以分析和建模。 时变系统与时不变系统区别: 时不变系统:时不变系统的性质是系统的响应不会随时间发生变化。无论何时输入信号 x(t) 进入系统,系统的响应都是相同的。在数学上,如果 y(t) 是系统对 x(t) 的响应,那么对于时不变系统,下面的关系成立:x(t - τ) -> y(t - τ),其中 τ 是任何时间延迟。 时变系统:时变系统的性质是系统的响应可能随时间发生变化。这意味着系统的性能可能取决于输入信号的时刻。数学上,如果系统的响应是 y(t, τ),其中 τ 是一个时间参数,那么对于时变系统,系统的性能可能取决于 τ 的值,这意味着 x(t - τ) 的响应可能与 x(t) 的响应不同。 2. 冲激响应的计算实验中,就此系统计算它的阶跃响应,并与冲激响应比较,理解他们之间的关系。 关系:阶跃响应微分就是冲激响应。 代码: % FIR系统的系数,例如,一个3点的FIR系统 h = [1, 2, 1]; % 计算冲激响应(单位冲激信号的响应) impulse_response = h; % 计算阶跃响应(单位阶跃信号的响应) step_response = cumsum(impulse_response); % 绘制冲激响应和阶跃响应 n = 0:length(h) - 1; subplot(2, 1, 1); stem(n, impulse_response, 'b', 'filled'); title('冲激响应'); subplot(2, 1, 2); stem(n, step_response, 'r', 'filled'); title('阶跃响应'); % 打印系统系数 disp('FIR系统系数:'); disp(h); % 打印冲激响应和阶跃响应 disp('冲激响应:'); disp(impulse_response); disp('阶跃响应:'); disp(step_response); 结果: ![]() 从中可看出:阶跃响应是冲激响应的累积,因此它包含了每个时间点上系统对前面单位冲激信号的响应的总和。 3. 系统级联实验中,四阶线性时不变系统若改用并联实现,又该如何进行? 如果将一个四阶线性时不变系统改为并联实现,可以将其分成两个独立的二阶系统,然后将它们并联在一起。这意味着输入信号将同时传递到两个二阶系统,然后两个系统的输出信号将被并联在一起。 以下是MATLAB代码,展示如何验证这种并联系统: % 定义第一个二阶系统的传递函数系数 b1 = [b11, b12, b13]; % 第一个二阶系统的分子多项式系数 a1 = [a11, a12, a13]; % 第一个二阶系统的分母多项式系数 % 定义第二个二阶系统的传递函数系数 b2 = [b21, b22, b23]; % 第二个二阶系统的分子多项式系数 a2 = [a21, a22, a23]; % 第二个二阶系统的分母多项式系数 % 创建两个二阶系统 system1 = tf(b1, a1); % 第一个二阶系统 system2 = tf(b2, a2); % 第二个二阶系统 % 输入信号 input_signal = ones(1, 100); % 100个采样点的输入信号 % 计算并联系统的输出信号 output_signal1 = lsim(system1, input_signal); % 第一个二阶系统的输出 output_signal2 = lsim(system2, input_signal); % 第二个二阶系统的输出 parallel_output = output_signal1 + output_signal2; % 并联系统的输出 % 绘制并联系统的输出信号 subplot(3,1,1); plot(output_signal1); title('第一个二阶系统输出'); subplot(3,1,2); plot(output_signal2); title('第二个二阶系统输出'); subplot(3,1,3); plot(parallel_output); title('并联系统输出'); 在此过程中,首先定义了两个二阶系统的传递函数系数。然后,创建了这两个系统,并使用相同的输入信号来计算它们的输出。最后,将两个系统的输出信号相加,得到并联系统的输出,并可绘制出输出信号的图形。 4. 滤波概念实验中,两个系统的输出有何不同,为什么?若改用最低频率为0、最高频率为0.5,长度为301的扫频正弦序列,则结果又将如何? 首先创建两个具有不同频率响应的系统(system1和system2),然后生成一个频率从0到0.5的扫频正弦输入信号。接下来,使用MATLAB的filter函数模拟这两个系统的输出,并绘制输入信号以及两个系统的输出。 代码: % 创建一个频率响应不同的系统1 b1 = [1 0.5]; % 系统1的分子多项式 a1 = [1 -0.5]; % 系统1的分母多项式 % 创建一个频率响应不同的系统2 b2 = [1 -0.5]; % 系统2的分子多项式 a2 = [1 0.5]; % 系统2的分母多项式 % 创建一个扫频正弦输入信号,频率从0到0.5,长度为301 t = 0:1/300:1; % 时间向量 frequencies = linspace(0, 0.5, 301); input_signal = sin(2 * pi * frequencies .* t); % 使用filter函数模拟系统1和系统2的输出 output_system1 = filter(b1, a1, input_signal); output_system2 = filter(b2, a2, input_signal); % 绘制输入信号和两个系统的输出 figure; subplot(3, 1, 1); plot(t, input_signal); title('输入信号'); subplot(3, 1, 2); plot(t, output_system1); title('系统1的输出'); subplot(3, 1, 3); plot(t, output_system2); title('系统2的输出'); 结果: ![]() 结果显示两个系统对输入信号的响应有所不同,这是因为它们的频率响应不同。可以观察到两个输出信号在振幅和相位上的差异,这反映了两个系统对不同频率成分的不同滤波效果。 |
实 验 总 结 |
通过本次实验,我借助matlab在时域中仿真离散时间系统,进一步理解了离散时间系统对输入信号与延迟信号进行简单运算处理,生成具有所需特性的输出信号的具体方法。通过仿真线性与非线性、时变与时不变等离散时间系统,我对线性与非线性系统、时变与时不变系统的定义和区别有了更加深刻的认识,同时,仿真实现了线性时不变系统的冲激响应的计算和线性时不变系统的级联,通过可视化过程验证了线性时不变系统的稳定特性,本次实验目标基本达成,通过matlab实现数据、函数、系统的可视化过程,我也对课本上的一些基本概念有了更清晰的认识与理解。 实验过程中学到了有关信号处理的新的函数,如: M = mean(A) 返回 A 沿大小不等于 1 的第一个数组维度的元素的均值。 y = filter(b,a,x) 使用由分子和分母系数 b 和 a 定义的有理传递函数 对输入数据 x 进行滤波。y = filter(b,a,x,zi) 将初始条件 zi 用于滤波器延迟。zi 的长度必须等于 max(length(a),length(b))-1。 |