<<Signals and systems>> Chapter 2 学习笔记

<<Signals and systems>> Chapter 2 





                                                     Linear Time-Inverariant Systems


2.1 Discrete-time LTI system: the convolution sum


离散的信号可以用叠合的不同幅值的delta函数表示出来





The discret-time unit impulse response and the convolution sum representation of LTI systems







上面的例子很清楚的一步步的解析了卷积和的过程.


卷积和的部分可以去看看我写的这篇Why should we use convolution?

对于为什么是x[k]*h[n-k]

这里研究的是LTI系统,h[n]是LTI系统,对于不同时刻k输入x[k],系统的响应仅仅做偏移即可,

x[0]输入的对应h为h[0],x[1]对应的h为h[n-1]... x[k] 对应的就是h[n-k]


为了加深概念的理解,我们再看看时变系统卷积和的过程

输入是X[n],响应是h,注意时变系统的输入响应不同时刻不同,所以这里有三个不同的响应



我们把输入看作impluse 序列,这样,利用delta函数的性质,就很容易get到输出了哇~




要知道对系统输入的是一系列的impulse,于是应该把所有结果(x[-1]h[-1], ...,x[1]h[1])累加起来,得到输出y[n],

这就是为什么下面y[n]卷积和公式里面会有连加符号的原因!




而正是由于时变系统的特性,会导致一种有趣的现象,对于输入x[n]和响应h[n]



计算过程中直接把h[n]反转,然后偏移k个单位,直接于原来的输入信号做乘法,然后把各个单位的结果做累加,得到的就是此刻的输出y[n],最后系统的输出这里书上有一定的“误导性”,之所以打双引号是因为这里h[n]是一个无限长的step function,所以后面无穷逼近于1/(1-alpha). 


在计算机中,不可能用无穷序列来模拟...输入序列就是有限的,那么输出就会是

(length of x[n]) + (length of h[n]) -1。

为什么会是减一?想想,如果输出到(length of x[n]) + (length of h[n])个点的时候,两者已经没有重叠区域,于是得到的结果是0.这里我们不考虑这个没有意义的点.于是输出就只有(length of x[n]) + (length of h[n]) -1个点

这里我做了个例子



%code writer	:	EOF
%code date	:	2014.10 .1
%e-mail		:	jasonleaster@gmail.com
%code file	:	demo_for_convolution
%code purpose:
%             A demo for convolution in LTI-system
clear all
close all

% you could use this varible to define how many number of points in the input sequence.
points = 10;

% x is used as input points
% h is used as responce sequnce.

% %% input sequence one
% x = exp(-[0: (points-1)]);
% h = ones(1,points*10);

%% Input sequence two
alpha = 2;
x = [1 1 1 1 1];
h = alpha.^([0:6]);

length_x = size(x,2);
length_h = size(h,2);

figure(1);
subplot(121);
scatter(1:length_x,x,'r');
title('x[n]');
subplot(122);
scatter(1:length_h,h,'g');
title('h[n]');

output = zeros(1,length_x+length_h -1);

%% Kernel part of our convolution sum   :- )
for current_point_n= 1:length_x + length_h

        tmp = current_point_n;
        while(tmp > 0)

            if  current_point_n <= length_x  &&  (current_point_n - tmp + 1) <= length_h
                     output(current_point_n) = output(current_point_n) + x(tmp)*h(current_point_n - tmp + 1);
            end
            
            if current_point_n > length_x && current_point_n < (length_h + length_x -1)
                
                if tmp > length_x
                    tmp = tmp -1;
                    continue;
                else
                    if (current_point_n - tmp + 1) <= length_h
                     output(current_point_n) = output(current_point_n) + x(tmp)*h(current_point_n - tmp + 1);       
                    end
                end
                
            end
            
            tmp = tmp -1;
        end

end

figure(2);
scatter(1:size(output,2),output,'filled');
title('output[n]');




上面的输入随意调整都性,程序还是比较健壮的







Properties of LTI systems

交换律,结合律,分配律



对于可逆性的说明demo:


                                                 



对于因果性的探讨,







稳定性的探究:




最后,要认识到,微分方程和差分方程仅仅是分别对于连续和离散系统的输入输出关系的描述而已,他们相似于都是对系统输入输出的描述,不可混淆对比.之前我胡乱的做对比,以至于很苦恼

这里记录了我思考的过程

http://blog.csdn.net/cinmyheart/article/details/39499967



```cpp #ifndef MYENROLL_H #define MYENROLL_H #include <QWidget> #include <QLabel> #include <QPushButton> #include <QLineEdit> #include <QHBoxLayout> #include <QVBoxLayout> #include <QPixmap> class myenroll : public QWidget { Q_OBJECT // 必须 public: explicit myenroll(QWidget *parent = nullptr); // 构造函数,可选参数parent void init_ui(); // 初始化UI函数,无返回值 QLineEdit * name; // 指向QLineEdit对象的指针,用于输入用户名 QLineEdit * pass; // 指向QLineEdit对象的指针,用于输入密码 QLabel * lb1; // 指向QLabel对象的指针,用于显示“用户名”文本 QLabel * lb2; // 指向QLabel对象的指针,用于显示“密码”文本 QPushButton * bnt1; // 指向QPushButton对象的指针,用于触发注册操作 QHBoxLayout * hb1; // 指向QHBoxLayout对象的指针,用于排列“用户名”文本和用户名输入框 QHBoxLayout * hb2; // 指向QHBoxLayout对象的指针,用于排列“密码”文本和密码输入框 QHBoxLayout * hb3; // 指向QHBoxLayout对象的指针,用于排列注册按钮 QVBoxLayout * vb1; // 指向QVBoxLayout对象的指针,用于排列所有UI元素 signals: void sig_enroll_info(QString usrname, QString usrpass); // 自定义的注册信号,发送给myapp public slots: void send_msg(); // 槽函数,用于发送注册信息 }; #endif // MYENROLL_H ``` 该文件定义了一个名为myenroll的QWidget类,并对该类及其成员进行了声明。 - `#ifndef`和`#define`是C++的条件编译指令,用于避免头文件的重复包含。 - `#include`指令用于包含所需的头文件。 - `class`关键字用于定义类。 - `Q_OBJECT`宏必须出现在类的第一个`public`或`protected`区块中,用于支持Qt的元对象系统(MOC)。 - `explicit`关键字用于声明构造函数为显式构造函数。 - `QWidget *parent`是一个可选参数,表示父窗口指针。 - `void init_ui()`是一个初始化UI的函数,无返回值。 - `QLineEdit * name`和`QLineEdit * pass`是指向QLineEdit对象的指针,用于输入用户名和密码。 - `QLabel * lb1`和`QLabel * lb2`是指向QLabel对象的指针,用于显示“用户名”和“密码”文本。 - `QPushButton * bnt1`是指向QPushButton对象的指针,用于触发注册操作。 - `QHBoxLayout * hb1`、`QHBoxLayout * hb2`和`QHBoxLayout * hb3`是指向QHBoxLayout对象的指针,用于排列UI元素。 - `QVBoxLayout * vb1`是指向QVBoxLayout对象的指针,用于排列所有UI元素。 - `signals`关键字定义了一个信号,表示myenroll类可以向外部发送一个名为sig_enroll_info的信号,该信号带有两个QString类型的参数(用户名和密码)。 - `public slots`关键字定义了一个名为send_msg的槽函数,用于发送注册信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值