【信号与系统-可视化】基本信号的产生( Python Numpy和Matplotlib实现)

信号与系统—基本信号的产生

Python Numpy和Matplotlib实现

前言

通过Python的Numpy库和Scipy库可以用于产生基本的信号,如阶跃信号,
指数信号,脉冲信号等等。 本次实验版本Python=3.6.5, numpy=1.14.5, scipy=1.1.0,
matplotlib= 3.1.1

Numpy与Matplotlib中相关绘图API Reference就不多说了,相信大多数博客和官网文档中都写得很详细了。

导入 需要的 library 库

import numpy as np # 科学计算
import matplotlib.pyplot as plt # 画图
import scipy.signal as sg # 导入 scipy 的 signal 库 命名为 sg
import warnings
warnings.filterwarnings(“ignore”) # 去掉常规警告

阶跃信号

# 阶跃信号
t = np.linspace(-1, 1, 500, endpoint=False) # 产生-1~1的500个点
plt.plot(t, np.array(t>0, dtype=np.int))  # 取t为x轴的分布, t当中大于0的部分为y轴的分布 (即当x<0时y=0,当y>0时y=1)
plt.grid()
_ = plt.ylim(-0.5, 1.5)
plt.show()

在这里插入图片描述

连续指数信号

# 连续指数信号 
# 产生随时间衰减的指数信号	
t = np.linspace(0, 5, 5000, endpoint=False)# 定义时间序列
plt.plot(t, 2*np.exp(-1*t))# 绘制随时间衰减的指数信号图
plt.grid()
plt.show()

在这里插入图片描述

连续正弦信号

import numpy as np
import matplotlib
from matplotlib import pyplot as plt
t = np.linspace(0, 1, 500, endpoint=True)
A = 1
phi = np.pi / 6
f = 10
plt.plot(t, A*np.sin(t * 2 * np.pi * f + phi))
plt.title("Continuous sinusoidal signal",)
plt.grid()
plt.show()

在这里插入图片描述

连续矩形脉冲信号

利用Python产生高度为1、宽度为4、延时2秒、 关于t=0对称的矩形脉冲信号的矩形脉冲信号的Python程序如下:

# 连续矩形脉冲信号
def rect_wave(t, c, c0): # start = c0,  breadth = c
    if t >= (c+c0):
        r = 0.0
    elif t < c0:
        r = 0.0
    else:
        r = 1
    return r

x = np.linspace(-4, 8, 1000)
y = np.array([rect_wave(t, 4.0, -2.0) for t in x])
_ = plt.ylim(-0.2, 1.2)
plt.plot(x, y)
plt.grid()
plt.show()

在这里插入图片描述

连续周期矩形波信号

# 连续周期矩形波信号
t = np.linspace(0, 1, 500, endpoint=False)
plt.plot(t,scipy.signal.square(2*np.pi*5*t)) # 2*pi*w*t
plt.ylim(-2, 2)
plt.grid()
plt.show()

在这里插入图片描述

连续抽样信号

#  连续抽样信号
t = np.linspace(-10, 10, 500, endpoint=False)
plt.plot(t, np.sinc(t))
plt.grid()
plt.show()

单位脉冲序列

# 单位脉冲序列
n = np.linspace(-4, 21, 25, endpoint=False)
x = np.append(np.zeros((1, 7)), np.ones((1, 1))) # 先产生7个0点,1个1点
x = np.append(x, np.zeros((1,17)))
plt.stem(n, x, use_line_collection=True)
plt.grid()
plt.show()

单位阶跃序列的产生

n = np.linspace(-4, 21, 25, endpoint=False) # 定义时间序列
x = np.append(np.zeros((1,7)), np.ones((1,18))) # 产生单位阶跃序列
plt.stem(n, x, use_line_collection=True) # 绘制单位阶跃序列信号图像
plt.grid() # 显示网格
plt.show()

指数序列

# 指数序列的产生
n = np.linspace(-4, 21, 25, endpoint=False) # 定义时间序列
x = 0.3*np.power(1/2, n) # 产生离散指数序列
plt.stem(n, x, use_line_collection=True) # 绘制离散指数序列信号图像
plt.grid() # 显示网格
plt.show() # 显示图像

正弦序列

# 正弦序列的产生
n = np.linspace(-50, 51, 101, endpoint=False) # 定义时间序列
omega = np.pi/10 # 频率
x = 0.3*np.sin(omega*n+ np.pi/5) #产生正弦序列
plt.stem(n, x, use_line_collection=True) # 绘制正弦序列信号图像
plt.grid() # 显示网格
plt.show() # 显示图像

离散周期矩形波序列

n = np.linspace(-10, 11, 21, endpoint=False) # 定义离散时间序列
rad = np.pi / 4 # 基波周期 N=8
plt.stem(n, sg.square(rad * n, 0.5)) # 绘制离散周期方波图像
plt.xticks(np.arange(-10, 10, step=5.0)) # 横坐标间隔
plt.grid() # 显示网格
plt.show() # 显示图像

  • 10
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
傅里叶级数是一种将周期函数表示为三角函数之和的方法,可以用NumPyMatplotlib实现可视化。下面是一个简单的示例,演示如何使用NumPyMatplotlib可视化傅里叶级数: ``` python import numpy as np import matplotlib.pyplot as plt # 定义一个函数,表示需要进行傅里叶级数分析的周期函数 def f(x): return np.sin(2 * np.pi * x) + np.sin(4 * np.pi * x) # 定义傅里叶级数的函数 def fourier_series_coeff(f, T, N): a0 = (1 / T) * np.trapz(f, T) an = np.zeros(N) bn = np.zeros(N) for n in range(1, N): an[n-1] = (2 / T) * np.trapz(f * np.cos(2 * np.pi * n * t / T), t) bn[n-1] = (2 / T) * np.trapz(f * np.sin(2 * np.pi * n * t / T), t) return a0, an, bn # 定义需要进行傅里叶级数分析的周期函数的周期和采样点数 T = 1 N = 20 # 生成采样点 t = np.linspace(0, T, 1000, endpoint=False) # 计算傅里叶级数系数 a0, an, bn = fourier_series_coeff(f(t), T, N) # 计算傅里叶级数的值 fourier_series = np.zeros_like(t) for n in range(1, N): fourier_series += an[n-1] * np.cos(2 * np.pi * n * t / T) + bn[n-1] * np.sin(2 * np.pi * n * t / T) fourier_series += a0 # 可视化结果 plt.plot(t, f(t), label='Original Function') plt.plot(t, fourier_series, label='Fourier Series') plt.legend() plt.show() ``` 在这个示例中,我们定义了一个简单的周期函数,然后用NumPy计算出了它的傅里叶级数系数,并且用Matplotlib可视化了傅里叶级数和原函数的对比。您可以根据需要调整采样点数、周期函数等参数,来实现更复杂的傅里叶级数可视化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值