Python信号分析 | 信号运算

1、连续信号的相加与相乘
在MATLAB和Python中,连续信号的相加、相减和相乘都是用符号“+”“-”“*”实现的。
Python代码如下:

"""
    连续信号相加和相乘
"""
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0,2,200)
f1 = np.exp(-3*t)
f2 = np.sin(4*np.pi*t)
plt.subplot(221)
plt.ylim(-1,2)
plt.title(u'f1')
plt.plot(t,f1)
plt.subplot(222)
plt.title(u'f2')
plt.plot(t,f2)
plt.subplot(223)
plt.title(u'f3=f1+f2')
plt.plot(t,f1+f2)
plt.subplot(224)
plt.title(u'f4=f1*f2')
plt.plot(t,f1*f2)
plt.show()

运行结果:
在这里插入图片描述
2、序列的相加与相乘
在MATLAB和Python中,序列的相加和相乘运算不能通过符号运算来实现,必须通过向量表示的方法来实现。且参加运算的两个序列向量要有相同的维数。
Python代码如下:

"""
    序列的相加和相乘
"""
import numpy as np
import matplotlib.pyplot as plt
n1=np.arange(-2,3)
f1=[2,0,0,1,6]
n2=np.arange(0,6)
f2=[1,2,4,5,7,8]

n=np.arange(np.min([np.min(n1),np.min(n2)]),np.max([np.max(n1),np.max(n2)])+1)
s1=np.zeros(np.size(n),np.int)
s2=np.zeros(np.size(n),np.int)
ln=list(n)
s1[ln.index(n1[0]):ln.index(n1[0])+np.size(n1)]=f1
s2[ln.index(n2[0]):ln.index(n2[0])+np.size(n2)]=f2

x=s1+s2
y=s1*s2

plt.subplot(221)
plt.title(u'f1')
plt.stem(n1,f1)
plt.subplot(222)
plt.title(u'f2')
plt.stem(n2,f2)
plt.subplot(223)
plt.title(u'f3=f1+f2')
plt.stem(n,x)
plt.subplot(224)
plt.title(u'f4=f1*f2')
plt.stem(n,y)
plt.show()

运行结果:
在这里插入图片描述
3、序列的差分与部分和
在MATLAB中,用diff函数计算序列相邻元素的差分,用sum函数实现部分和。
Python与之类似。
Python代码如下:

"""
    序列的差分与部分和
"""
import numpy as np
n=np.arange(0,10)
f=[1,2,3,4,5,6,7,8,9,10]
fn=np.diff(f)
print('fn=',fn)
y=np.sum(f)
print('y=',y)

运行结果:
fn= [1 1 1 1 1 1 1 1 1]
y= 55

4、连续信号的微积分
(1)在MATLAB中,
微分:y=diff(ft)
不定积分:y=int(ft)
定积分:quad(‘function_name’,a,b) 其中为被积函数名,a与b为指定积分区间。
(2)在Python中,
微分:diff函数
积分:integrate函数
Python代码如下:

"""
    连续信号的微积分
"""
from sympy import *
x = symbols('x')
y=diff(exp(-3*x),x)
h=integrate(exp(-3*x),x)
plot(y,xlim=[-1,1],ylim=[-10,0.1],ylabel='',title='微分')
plot(h,xlim=[-2,1],ylim=[-10,0.1],ylabel='',title='积分')

运行结果:
在这里插入图片描述
在这里插入图片描述

5、离散信号的卷积和
在MATLAB中用conv函数来求离散信号的卷积和,调用格式为:
y=conv(f1,f2)
在Python中用convolve函数来求解离散信号卷积和,调用格式为:
convolve(a,v,mode=’ ')
mode默认为“full”,该项可以省略。
Python代码如下:

"""
    离散信号的卷积和
"""
import numpy as np
import matplotlib.pyplot as plt
n1=np.arange(0,4)
x1=[1,2,4,5]
n2=np.arange(0,3)
x2=[1,2,1]
n=np.arange(0,np.size(n1)+np.size(n2)-1)
f=np.convolve(x1,x2)
plt.stem(n,f)
plt.show()

运行结果:
在这里插入图片描述

6、连续信号的卷积和
MATLAB中应用conv函数近似计算信号的卷积积分,Python中用convolve函数近似计算。
Python代码如下:

"""
    连续信号的卷积积分
"""
import numpy as np
import matplotlib.pyplot as plt
def unit(t):
    r=np.where(t>0.0,1.0,0.0)
    return r
def fconv(f1,f2,t1,t2):
    d=0.01
    f=np.convolve(f1,f2)
    f=f*d
    ts=t1[0]+t2[0]
    l=np.size(f1)+np.size(f2)-1
    t=np.linspace(ts,ts+l*d,l)
    return t,f

t1=np.linspace(-1,3,400)
f1=unit(t1)-unit(t1-2)
t2=t1
f2=np.exp(-3*t2)*unit(t2)
[t,f]=fconv(f1,f2,t1,t2)
print(np.max(f))
plt.subplot(221)
plt.title(u'f1')
plt.plot(t1,f1)
plt.subplot(222)
plt.title(u'f2')
plt.plot(t2,f2)
plt.subplot(212)
plt.title(u'卷积')
plt.plot(t,f)
plt.show()

运行结果:
在这里插入图片描述


更多精彩内容