Python和MATLAB数字信号波形和模型模拟

68 篇文章 5 订阅
11 篇文章 1 订阅
本文详细介绍了如何使用Python和MATLAB进行波形模拟,包括正弦、方波、矩形脉冲和线性调频等信号的生成,以及快速傅里叶变换的原理和应用,涵盖了采样、量化、编码、解调、功率谱密度计算和希尔伯特变换等内容,展示了信号处理的基本技术和实例。
摘要由CSDN通过智能技术生成

要点

  1. Python和MATLAB实现以下波形和模型模拟
    1. 以给定采样率模拟正弦信号,生成给定参数的方波信号,生成给定参数隔离矩形脉冲,生成并绘制线性调频信号。
    2. 快速傅里叶变换结果释义:复数离散傅里叶变换、频率仓和快速傅里叶变换移位,逆快速傅里叶变换移位,数值NumPy对比观察FFT移位和逆FFT移位。
    3. 离散时域表示:余弦信号生成取样,使用FFT频域信号表示,使用FFT计算离散傅里叶变换DFT,获得幅度谱并提取正确的相位谱,从频域样本重建时域信号。
    4. 功率谱密度:使用数值计算库NumPy和科学计算包SciPy以及韦尔奇功率谱密度估计方法 绘制载波调制信号的功率谱密度。
    5. 信号功率:生成的 10 个正弦波周期并绘图,使用数值库NumPy计算信号功率,使用科学计算包SciPy计算频域中总功率。
    6. 信号中多项式:SciPy计算托普利茨矩阵
    7. 信号卷积计算方法:暴力方法计算卷积矢量,托普利茨矩阵方法,快速傅里叶变换方法,对比不同方法计算结果。
    8. 使用频域方法生成分析信号,研究分析信号的组成部分,使用傅立叶变换进行希尔伯特变换:演示从实值调制信号构造的分析信号中提取瞬时幅度和相位,演示使用希尔伯特变换简单的相位解调。
    9. 使用二元相移键控调制传入二元流的函数,解调二元相移键控信号,使用二元相移键控调制的信息传输波形模拟生成。
    10. 差分编码和差分解码波形模拟生成
    11. 差分编码二元相移键控调制解调模拟波形
    12. 使用正交相移键控调制传入的二元流模拟波形,解调正交相移键控模拟波形
    13. 偏移正交相移键控调制解调模拟波形
    14. 差分编码偏移正交相移键控调制解调相位映射器和调制解调

信号处理Python示例

信号处理是一门科学领域,涉及信号从时域到频域的处理,反之亦然,平滑信号,从信号中分离噪声,即过滤,从信号中提取信息。自然界中存在的信号都是连续信号。连续时间(或模拟)信号存在于连续间隔 ( t 1 , t 2 ) (\mathrm{t} 1, \mathrm{t} 2) (t1,t2) 范围从 − ∞ -\infty + ∞ +\infty +

模拟量转数字量

  • 采样:采样是将连续时间信号还原为离散时间信号。一个常见的例子是将声波(连续信号)转换为样本序列(离散时间信号)
  • 量化:量化是将输入值从大集合(通常是连续集合)映射到(可数)较小集合(通常具有有限数量的元素)中的输出值的过程。 路由和截断是量化过程的典型示例。
  • 编码:对每个样本进行量化并确定每个样本的位数后,可以将每个样本变为nb位码字。每个样本的位数由量化级别的数量确定。
import numpy as np
import matplotlib.pyplot as plt

import scipy
from scipy import signal
t = np.arange(0, 11)
x = (0.85) ** t

连续信号

plt.figure(figsize = (10,8)) # set the size of figure

# 1. Plotting Analog Signal
plt.subplot(2, 2, 1)
plt.title('Analog Signal', fontsize=20)

plt.plot(t, x, linewidth=3, label='x(t) = (0.85)^t')
plt.xlabel('t' , fontsize=15)
plt.ylabel('amplitude', fontsize=15)
plt.legend(loc='upper right')

# 2. Sampling and Plotting of Sampled signal
plt.subplot(2, 2, 2)
plt.title('Sampling', fontsize=20)
plt.plot(t, x, linewidth=3, label='x(t) = (0.85)^t')
n = t

markerline, stemlines, baseline = plt.stem(n, x, label='x(n) = (0.85)^n')
plt.setp(stemlines, 'linewidth', 3)
plt.xlabel('n' , fontsize = 15)
plt.ylabel('amplitude', fontsize = 15)
plt.legend(loc='upper right')

# 3. Quantization
plt.subplot(2, 2, 3)
plt.title('Quantization', fontsize = 20)

plt.plot(t, x, linewidth =3)
markerline, stemlines, baseline=plt.stem(n,x)
plt.setp(stemlines, 'linewidth', 3)
plt.xlabel('n', fontsize = 15)
plt.ylabel('Range of Quantizer', fontsize=15)

plt.axhline(y = 0.1, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.2, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.3, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.4, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.5, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.6, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.7, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.8, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.9, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 1.0, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)

plt.subplot(2, 2, 4)
plt.title('Quantized Signal', fontsize = 20)
xq = np.around(x,1)
markerline, stemlines, baseline = plt.stem(n,xq)
plt.setp(stemlines, 'linewidth', 3) 
plt.xlabel('n', fontsize = 15)
plt.ylabel('Range of Quantizer', fontsize=15)

plt.axhline(y = 0.1, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.2, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.3, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.4, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.5, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.6, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.7, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.8, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 0.9, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)
plt.axhline(y = 1.0, xmin = 0, xmax = 10, color = 'r', linewidth = 3.0)

plt.tight_layout()

单位脉冲信号

impulse = signal.unit_impulse(10, 'mid')
shifted_impulse = signal.unit_impulse(7, 2)

# Sine wave
t = np.linspace(0, 10, 100)
amp = 5 # Amplitude
f = 50
x = amp * np.sin(2 * np.pi * f * t)

# Exponential Signal
x_ = amp * np.exp(-t)
plt.figure(figsize=(10, 8))

plt.subplot(2, 2, 1)
plt.plot(np.arange(-5, 5), impulse, linewidth=3, label='Unit impulse function')
plt.ylim(-0.01,1)
plt.xlabel('time.', fontsize=15)
plt.ylabel('Amplitude', fontsize=15)
plt.legend(fontsize=10, loc='upper right')

plt.subplot(2, 2, 2)
plt.plot(shifted_impulse, linewidth=3, label='Shifted Unit impulse function')

plt.xlabel('time.', fontsize=15)
plt.ylabel('Amplitude', fontsize=15)
plt.legend(fontsize=10, loc='upper right')

plt.subplot(2, 2, 3)
plt.plot(t, x, linewidth=3, label='Sine wave')

plt.xlabel('time.', fontsize=15)
plt.ylabel('Amplitude', fontsize=15)
plt.legend(fontsize=10, loc='upper right')

plt.subplot(2, 2, 4)
plt.plot(t, x_, linewidth=3, label='Exponential Signal')

plt.xlabel('time.', fontsize=15)
plt.ylabel('Amplitude', fontsize=15)
plt.legend(fontsize=10, loc='upper right')

plt.tight_layout()

正弦波

# Sine wave
n = np.linspace(0, 10, 100)
amp = 5 # Amplitude
f = 50
x = amp * np.sin(2 * np.pi * f * n)

# Exponential Signal
x_ = amp * np.exp(-n)

离散信号

plt.figure(figsize=(12, 8))

plt.subplot(2, 2, 1)
plt.stem(n, x, 'yo', label='Sine wave')

plt.xlabel('time.', fontsize=15)
plt.ylabel('Amplitude', fontsize=15)
plt.legend(fontsize=10, loc='upper right')

plt.subplot(2, 2, 2)
plt.stem(n, x_, 'yo', label='Exponential Signal')

plt.xlabel('time.', fontsize=15)
plt.ylabel('Amplitude', fontsize=15)
plt.legend(fontsize=10, loc='upper right')

傅里叶变换

傅里叶变换是分析信号的强大工具,可用于从音频处理到图像处理再到图像压缩的各个领域。傅里叶分析是研究如何将数学函数分解为一系列更简单的三角函数的领域。 傅立叶变换是该领域的一种工具,用于将函数分解为其分量频率。 换句话说,傅立叶变换是一种工具,可让您获取信号并查看其中每个频率的功率。 看看这句话中的重要术语:

  • 信号是随时间变化的信息。例如,音频、视频和电压迹线都是信号的示例。
  • 频率是某事物重复的速度。例如,时钟以一赫特 (Hz) 的频率滴答,或每秒重复一次。
  • 在这种情况下,功率仅指每个频率的强度。

下图是一些正弦波的频率和功率的直观演示:

高频正弦波的峰值比低频正弦波的峰值更接近,因为它们重复得更频繁。低功率正弦波的峰值比其他两个正弦波小。

傅立叶变换在许多应用中都很有用。 图像压缩使用傅立叶变换的变体来去除图像的高频分量。 语音识别使用傅里叶变换和相关变换从原始音频中恢复口语单词。

一般来说,如果您需要查看信号中的频率,则需要傅立叶变换。如果在时域处理信号很困难,那么使用傅立叶变换将其移至频域值得尝试。

参阅一:计算思维
参阅二:亚图跨际
  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
涡流传感器是一种非接触式传感器,主要用于检测导电材料中的裂纹、缺陷等问题。对于涡流传感器的波形模拟,可以通过以下步骤进行: 1. 建立模型:首先需要建立一个涡流传感器的模型,可以使用MATLAB中的有限元分析工具对传感器进行建模。 2. 定义材料参数:根据实际情况,定义涡流传感器的材料参数,如电导率、磁导率等。 3. 定义激励信号:定义涡流传感器的激励信号,可以使用正弦波、方波等形式进行激励。 4. 模拟传感器响应:根据建立的模型、材料参数和激励信号,模拟涡流传感器的响应波形。 以下是一段MATLAB程序,可以用于涡流传感器的波形模拟: ```matlab % 定义材料参数 sigma = 5.8e7; % 电导率 mu = pi*4e-7; % 磁导率 f = 50e3; % 激励信号频率 omega = 2*pi*f; % 激励信号角频率 % 定义传感器几何参数 r = 0.01; % 传感器半径 d = 0.005; % 传感器厚度 % 定义空间网格 [x,y] = meshgrid(-r:0.0005:r,-r:0.0005:r); z = -d/2:0.0005:d/2; % 计算感应电场和感应磁场 Ex = -j*omega*mu.*y.*exp(-j*omega*sqrt(x.^2+y.^2)/sqrt(2*sigma*mu)); Ey = j*omega*mu.*x.*exp(-j*omega*sqrt(x.^2+y.^2)/sqrt(2*sigma*mu)); Bz = mu.*exp(-j*omega*sqrt(x.^2+y.^2)/sqrt(2*sigma*mu)); % 计算感应电流密度 Jx = sigma.*Ex; Jy = sigma.*Ey; % 计算感应电流 J = sqrt(Jx.^2+Jy.^2); % 计算感应电压 V = J.*d; % 绘制波形图 figure; plot(z,V(round(size(V,1)/2),round(size(V,2)/2),:)); xlabel('厚度 / m'); ylabel('电压 / V'); title('涡流传感器波形图'); ``` 程序中,首先定义了涡流传感器的材料参数、激励信号频率和传感器几何参数。然后,使用meshgrid函数生成空间网格,并通过计算感应电场和感应磁场、感应电流密度、感应电流和感应电压等步骤,模拟了涡流传感器的响应波形。最后,使用plot函数绘制了波形图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值