- 1. Introduction
- 1.1. 周期信号
- 1.1.1. 连续信号周期
- 1.1.2. 离散信号周期
- 1.1.3. 信号的 Python 表示与绘图
- 1.2. 信号分类
- 1.2.1. 能量信号
- 1.2.2. 功率信号
- 1.2.3. 因果信号
- 1.2.4. 反因果信号
- 1.2.5. 其他类型
- 1.2.6. Remark
- 1.3. 冲激函数
- 1.3.1. 单位冲激函数 Dirac delta function
- 1.3.2. 阶跃函数
- 1.3.3. 广义函数定义
- 1.3.4. 取样性质
- 1.3.5. 导数
- 1.3.6. 尺度变化
- 1.4. LTI 连续系统
- 1.4.1. 微分方程的经典解法
- 1.4.2. 初始值
- 1.4.3. 响应
- 1.4.4. Python 求解系统的响应
- 1.4.5. 冲激响应
- 1.4.6. 阶跃响应
- 1.4.7. Python 冲激响应与阶跃响应
- 1.4.8. 卷积积分 Convolution
- 1.4.9. Python 求卷积积分
- 1.4.10. 连续系统的算子 P
- 1.5. 差分方程
- 1.5.1. 定义
- 1.5.2. 经典解法
- 1.5.3. 初始值
- 1.5.4. 响应
- 1.5.5. Python 求解离散系统的零状态响应
- 1.5.6. 单位脉冲序列
- 1.5.7. 单位阶跃序列
- 1.5.8. 单位脉冲响应
- 1.5.9. 单位阶跃响应
- 1.5.10. Python 求解单位脉冲响应
- 1.5.11. 卷积和
- 1.5.12. Python 求卷积和
- 1.5.13. 差分算子 E
- 信号与系统(Python) 学习笔记摘录 (2) 傅里叶 Fourier
1. Introduction
1.1. 周期信号
- Period Signal
1.1.1. 连续信号周期
- 连续周期信号 , 周期为 , 满足
- 典型周期连续信号: 余弦信号 周期为
1.1.2. 离散信号周期
- 离散周期信号 , 周期为 , 满足
1.1.3. 信号的 Python 表示与绘图
- 连续信号
# 导入 需要的 library 库
import numpy as np # 科学计算
import matplotlib.pyplot as plt # 画图
import scipy.signal as sg # 导入 scipy 的 signal 库 命名为 sg
a,b = 0.8,5
t = np.linspace(0,5,100) # 另一种表达式 t = np.mgrid[0:5:0.01]
y = b*np.exp(-a*t)*np.sin(np.pi*t)
plt.xlabel('time')
plt.ylabel('Y')
plt.plot(t,y)
plt.grid(True)
plt.show()
1.2. 信号分类
- 将信号 施加于 电阻上, 所消耗的瞬时功率为 , 在区间 的能量和平均功率定义为
1.2.1. 能量信号
- 能量有限信号: 信号的能量 , 简称 能量信号 , 此时 .
- 离散:
1.2.2. 功率信号
- 功率有限信号: 信号的功率 , 简称 功率信号 , 此时 .
- 离散:
1.2.3. 因果信号
- 因果信号: 的信号
- 例如: 阶跃信号
1.2.4. 反因果信号
- 反因果信号:
1.2.5. 其他类型
- 一维信号, 多维信号; 实信号,复信号; 左信号, 右信号。。。。。。
1.2.6. Remark
- 时限信号为能量信号
- 周期信号为功率信号
- 非周期信号 可能为能量也可能为功率信号
1.3. 冲激函数
1.3.1. 单位冲激函数 Dirac delta function
- 单位冲激函数: 奇异函数, 强度极大, 作用时间极短的物理量的理想化模型
- aka Dirac delta function
- 高度无穷大, 宽度无穷小, 面积为 1 的对称窄脉冲
1.3.2. 阶跃函数
- 阶跃函数:
- 积分:
- 与 冲激函数 关联:
1.3.3. 广义函数定义
- Dirac Delta function 广义函数定义:
- 冲激函数 作用于检验函数 的结果是赋值为 , 称为 冲激函数的取样性质。
- 例如:
- 高斯函数
- 取样函数
1.3.4. 取样性质
- Dirac Delta function 取样性质:
- Notice: 积分区间要包含
1.3.5. 导数
- Dirac Delta function 导数:
- 冲激偶 :
1.3.6. 尺度变化
- Dirac Delta function 尺度变化:
1.4. LTI 连续系统
1.4.1. 微分方程的经典解法
- 经典解法:
- 完全解
- 齐次解 homogeneous solution
- 特解
- 特征根: eigenvalue 特征值
1.4.2. 初始值
- 初始值: 是n阶系统在 时接入激励, 其响应在 时刻的值, 即
- 初始状态: 是系统在激励尚未接入的 时刻的响应值 , 该值反映了系统的历史情况,且与激励无关。
1.4.3. 响应
- 零输入响应:
- 零状态响应:
- 响应分类:
- 固有响应:系统固有频率 或叫自由响应
- 强迫响应:与激励函数有关
- 暂态响应:随时间增长而消失
- 稳态响应:通常为阶跃函数和周期
1.4.4. Python 求解系统的响应
- 系统的微分方程为
- 在 时,接入激励 , 求零状态响应
- 可得
# 使用方程解
from scipy.integrate import odeint, solve_bvp, solve_ivp
# odeint: Integrate a system of ordinary differential equations
# solve_bvp: Solve a boundary-value problem for a system of ODEs
# solve_ivp: Solve an initial value problem for a system of ODEs
# 一阶微分方程组
def fvdp(t,y):
'''
来源:https://www.jianshu.com/p/ab57b600b854?utm_campaign=shakespeare
要把y看出一个向量,y = [dy0,dy1,dy2,...]分别表示y的n阶导
对于二阶微分方程,肯定是由0阶和1阶函数组合而成的,所以下面把y看成向量的话,y0表示最初始的函数,也就是我们要求解的函数,y1表示一阶导,对于高阶微分方程也可以以此类推
'''
y0, y1 = y
ft = 10*np.sin(2*np.pi*t)
y2 = -2*y1-77*y0+ft
# y0是需要求解的函数,y1是一阶导
# 返回的顺序是[一阶导, 二阶导],这就形成了一阶微分方程组
return [y1, y2]
y0 = [0, 0] # 初值[0,0]表示y(0)=0,y'(0)=0
t = np.linspace(0,5,100)
y = odeint(fvdp, y0, t, tfirst=True) # 用 odeint 计算 y(t)
y_ = solve_ivp(fvdp, t_span=(0,5), y0=y0, t_eval=t) # 用 solve_ivp 计算 y(t)
# 开始绘图
plt.subplot(211)
y1, = plt.plot(t, y[:,0], label='y')
y1_, = plt.plot(t,y[:,1],label='y‘')
plt.legend(handles=[y1,y1_], loc='upper right')
plt.grid(True)
plt.subplot(212)
y2, = plt.plot(y_.t, y_.y[0,:],'g--',label='y(0)')
y2_, = plt.plot(y_.t, y_.y[1,:],'r-',label='y(1)')
plt.legend(handles=[y2,y2_], loc='upper right')
plt.grid(True)
plt.show()
# 用已有库的方法解 sg is scipy.signal
sys = sg.lti([1],[1, 2, 77]) # 方程里的系数
ft = 10*np.sin(2*np.pi*t)
_,y,_ = sg.lsim(sys,ft,T=t)
# 开始绘图
plt.plot(t,y,label='simple way')
plt.grid(True)
plt.show()
1.4.5. 冲激响应
- 由单位冲激函数 所引起的零状态响应,记为 。
- 隐含条件:
对二阶系统
1.4.6. 阶跃响应
- 由单位阶跃函数 所引起的零状态响应,记为
- 隐含条件:
- 关联:
1.4.7. Python 冲激响应与阶跃响应
- 求以下系统的冲激响应和阶跃响应:
sys = sg.lti([1,1],[7,4,6]) # 方程里的系数 由高次幂到低次幂
st, sy = sg.step2(sys)
it, iy = sg.impulse2(sys)
sy1, = plt.plot(st, sy, label='step')
iy1, = plt.plot(it, iy, label='impluse')
# 开始绘图
plt.legend(handles=[sy1,iy1], loc='upper right')
plt.grid(True)
plt.show()
1.4.8. 卷积积分 Convolution
- 来源 , p 为脉冲
- 由
可得
- 卷积积分
- 定义:
- 与 的 卷积:
- 记为
- 代数性质:
- 三定律:
- 交换律:
- 分配律:
- 结合律:
- 特性:
- 衍生:
- 微分特性:
- if
- 常用公式汇总:
- 周期为 的周期单位冲激函数序列 , 常称为梳状 comb 函数。
- 相关函数:
- 雷达卷积函数:
- Normally
- 自相关函数:
- 其他:
- 多径传输中存在失真问题, 发射机经某些物体反射产生回波现象,就算是反射信号也被采集。
把在多条路径上 由延迟时间与衰减系数 的情况 称为混响。
为了从 有干扰信号的回波系统中提取正常信号,可以设计逆系统进行补偿。
为了保证 输出为原激励信号 必须满足
求 的问题 称为 解卷积 或 反卷积 - 自适应滤波器 AF (Adaptive Filter) 可以根据误差信号调整系数 去对消 噪声信号,使得输出信号趋近于真实信号。
1.4.9. Python 求卷积积分
- 已知两个连续时间信号为:
# sg is scipy.signal
t1 = np.array([t*0.1 for t in range(-10,31)]) # t in [-1, 3]
f1t = np.array([2 if 0<t<10 else 0 for t in range(-10,31)])
t2 = np.array([t*0.1 for t in range(-10,31)]) # t in [-1,3]
f2t = np.array([t*0.1 if 0<t<20 else 0 for t in range(-10,31)])
yt = sg.convolve(f1t, f2t,'full')*0.1 # 计算卷积 calculate convolution
t3 = np.array([t*0.1 for t in range(-20,61)]) # t in [-1+-1, 3+3]
# 开始绘图
plt.plot(t3, yt, label='conv')
plt.grid(True)
plt.show()
1.4.10. 连续系统的算子 P
- 微分算子: ;
- 积分算子:
- 性质:
- 的 正幂 多项式可以因式分解
- 设 为 的正幂多项式,则
- 微分算子方程公因子 不能随意 消去
- 设 为 的正幂多项式,
有
但
- 传输算子:
1.5. 差分方程
1.5.1. 定义
- 一阶差分:
- 线性性质:
- 二阶差分:
- m阶差分:
1.5.2. 经典解法
- 差分方程 本质上是 递推的代数方程, 若已知初始条件和激励, 利用迭代法可求其数值解。
- 经典解法:
- 完全解
- 齐次解 homogeneous solution
- 特解
- 特征根: eigenvalue 特征值
1.5.3. 初始值
- 初始状态: 用
1.5.4. 响应
- 零输入响应:
- 离散系统的激励为零,仅由系统的初始状态引起的响应
- 零状态响应:
- 系统的初始状态 为零,仅由激励
- 初始值:由迭代法求出
- 响应分类:
- 固有响应:系统固有频率 或叫自由响应
- 强迫响应:与激励函数有关
- 暂态响应:随时间增长而消失
- 稳态响应:通常为阶跃函数和周期
1.5.5. Python 求解离散系统的零状态响应
- 输入信号 , 其中 是随机噪声信号。求以下系统的零状态响应(均值滤波结果),取 。
# sg is scipy.signal
d = np.random.rand(1,51)-0.5 # random.rand 出来的是 0到1 的随机数
k = np.array([k for k in range(0,51)])
s = 2*k*np.power(0.9,k)
f = s+d[0]
plt.subplot(211)
plt.stem(k,f,'-',use_line_collection=True)
plt.grid(True)
M = 5
a = 1
b = np.ones(5)/5
plt.subplot(212)
y = sg.filtfilt(b,a,f) # digital filter forward and backward to a signal
plt.stem(k,y,':',use_line_collection=True)
plt.grid(True)
plt.xlabel('time index k')
plt.show()
1.5.6. 单位脉冲序列
- 单位脉冲序列 (单位样值序列/单位取样序列)
- 位移:
- 加:
- 乘:
- 延时:
- 迭分:
- 取样性质:
- 偶函数:
1.5.7. 单位阶跃序列
- 单位阶跃序列
- 位移:
- 加:
- 乘:
- 延时:
- 迭分:
- 与 的关系:
1.5.8. 单位脉冲响应
- 由单位脉冲序列 所引起的零状态响应,记为 。
- 隐含条件:
对二阶系统
1.5.9. 单位阶跃响应
- 由单位阶跃序列 所引起的零状态响应,记为
- 隐含条件:
对二阶系统
- 关联:
1.5.10. Python 求解单位脉冲响应
- 求以下离散系统的单位脉冲响应:
# sg is scipy.signal
k = np.array([k for k in range(11)])
a = [1., 3., 2.]
b = [1.]
h = sg.lfilter(b,a,k) # IIR or FIR filter
plt.stem(k,h,'-', use_line_collection = True)
plt.grid(True)
plt.show()
1.5.11. 卷积和
- 由
可得
- 卷积和
- 定义:
- 与 在区间 的 卷积:
- 记为
- 若 是因果序列 (), 则:
- 若 是因果序列 (), 则:
- 若 均是因果序列 (), 则:
- 代数性质:
- 三定律:
- 交换律:
- 分配律:
- 结合律:
- 特性:
- 衍生:
1.5.12. Python 求卷积和
- 求以下两个离散序列的卷积:
# sg is scipy.signal
k1 = np.linspace(0,10,11)
x1 = np.sin(k1)
plt.subplot(221)
plt.stem(k1,x1,'-',use_line_collection=True)
plt.grid(True)
plt.title('x_1(k)=sin(k)')
k2 = np.linspace(0,15,16)
x2 = np.power(0.8,k2)
plt.subplot(222)
plt.stem(k2,x2,'-',use_line_collection=True)
plt.grid(True)
plt.title('x_2(k) = 0.8^k')
plt.subplot(212)
y = sg.convolve(x1, x2,'full') # 使用 scipy.signal 的卷积函数 convolve
k3 = np.linspace(0, 25,26)
plt.stem(k3,y,'-',use_line_collection=True)
plt.grid(True)
plt.title('y(k)')
plt.xlabel('time index k')
plt.subplots_adjust(top=1, wspace=0.4, hspace=0.5) # 调整视图
plt.show()
1.5.13. 差分算子 E
- 性质:
- 的 正幂 多项式可以因式分解 也可以相乘
- 设 为 的正幂或负幂多项式,则
- 差分算子方程公因子 不能随意 消去
- 设 为 的正幂多项式,
有
但
- 传输算子:
To TOP 至目录