Matlab判断系统线性

2 篇文章 0 订阅
2 篇文章 0 订阅
该博客通过Matlab代码演示了如何判断一个数字信号处理(DSP)系统是否线性的过程。首先生成随机信号x[n],然后将其加权得到x2[n],再利用stepseq函数生成单位阶跃响应u[n]。接着使用sigmult和sigadd函数分别计算加权信号的输出和加权相加后的信号输出,并比较两者差异以确定系统的线性特性。最终,如果输出差异极小,则系统被认为是线性的。
摘要由CSDN通过智能技术生成

前言:

假设对系统输入信号x[n],输出y[n] = x[n]*u[n],即T{x[n]} = x[n]*u[n],(x[n]可为任意信号)判断该系统是否线性(齐次与可加)。

        判断方法:给两个不同的信号,加权后分别输入系统后相加,与加权相加后输入系统的输出作比较,若两者相等,则视系统线性。我们可以随机生成一个x[n],然后对x[n]加权获得第二个输入信号。

        请看源码,函数请分别添加至与源码相同的工作目录下。


源码:

clc
clear

n = 1:100;
x1 = rand(1,length(n));%生成随机信号x1 = x[n]
x2 = 2*x1;%对x[n]加权,x2 = 2*x[n]
[u0,n0] = stepseq(0,1,100);%生成u[n]
[mx1,nx1] = sigmult(x1,n,u0,n0);%T{x1[n]}
[mx2,nx2] = sigmult(x2,n,u0,n0);%T{x2[n]}
[ax,an] = sigadd(mx1,nx1,mx2,nx2);%ax = T{x1} + T{x2}

[bx,bn] = sigadd(x1,n,x2,n);%bx = x1 + x2
[mb,nb] = sigmult(bx,bn,u0,n0);%mb = T{x1+x2}
%//
%判断ax = T{x1} + T{x2} 与mb = T{x1+x2}的差异,若两者差距极小,则认为系统线性
if(ax - mb)<1e-6
    disp('Linear');
else
    disp('Not Linear');
end

figure;
stem(an,ax,'p');
hold on
stem(nb,mb,'r');

用到的函数:

%stepseq.m
function [x,n] = stepseq(n0,n1,n2)
% Generates x(n) = u(n-n0); n1 <= n <= n2
% ------------------------------------------
% [x,n] = stepseq(n0,n1,n2)
%
close all
n = [n1:n2]; x = [(n-n0) >= 0];%n小于n0逻辑假=0;反之为1;
figure;
stem(n,x);
%sigadd.m
function [y,n] = sigadd(x1,n1,x2,n2)
% implements y(n) = x1(n)+x2(n)
% -----------------------------
% [y,n] = sigadd(x1,n1,x2,n2)
% y = sum sequence over n, which includes n1 and n2
% x1 = first sequence over n1
% x2 = second sequence over n2 (n2 can be different from n1)
%
n = min(min(n1),min(n2)):max(max(n1),max(n2)); % duration of y(n)
y1 = zeros(1,length(n)); y2 = y1; % initialization
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; % x1 with duration of y
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; % x2 with duration of y
y = y1+y2; % sequence addition
%sigmult.m
function [y,n] = sigmult(x1,n1,x2,n2)
% implements y(n) = x1(n)*x2(n)
% -----------------------------
% [y,n] = sigmult(x1,n1,x2,n2)
% y = product sequence over n, which includes n1 and n2
% x1 = first sequence over n1
% x2 = second sequence over n2 (n2 can be different from n1)
n = min(min(n1),min(n2)):max(max(n1),max(n2)); % duration of y(n)
y1 = zeros(1,length(n)); y2 = y1; %
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; % x1 with duration of y
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; % x2 with duration of y
y = y1 .* y2; % sequence multiplication


运行结果:


结语:

        作者初接触Matlab与DSP,不足与错误之处请多指点!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值