Python模拟调制
分享一下我用Python模拟的AM,PM,FM调制,起因就是刚开始了解调制的时候,有点理解不了,那模拟一下呗,然后就写了一个代码。
代码地址
先放一个AM的演示图
然后看一个程序调用,我不喜欢奇奇怪怪的操作,程序调用要符合操作逻辑:创建信息波和载波,然后生成调制信号波,最后画图。
fig = plt.figure() # 创建画布# 初始化波的参数:频率和幅度
A = 2 # carrier wave amplitude
m = 1 # m is the amplitude sensitivity
mes_fre = 1 # message wave frequence
car_fre = 10 # carrier wave frequence # 创建信息波
signal = Signal()
mes_wave = SinWave(fre=mes_fre, Amp=A*m, Phi=0)
information_signal = signal + mes_wave
# 创建载波
carrier_signal = CosWave(fre=car_fre, Amp=A, Phi=0)
# 创建时间轴
time = np.arange(0, 2*np.pi, 0.01)
# 生成调制信号
am_sig = AM(information_signal, carrier_signal, A=A)# 画出动图
ud = UpdateDist(fig, time, information_signal, carrier_signal, am_sig)
ani = animation.FuncAnimation(fig=fig,func=ud,frames=20,interval=100,blit=True)
plt.show()
我比较喜欢模块化应用,我在网上也调研了一部分的模拟代码,发现大多是一次性的工作,基本没有移植性。所以我就按照我的思想写了一个脚本,虽然代码会显得有点臃肿,但是移植性还是蛮不错的。接下来就分享一下我的思路,我不会讲调制的原理,就讲代码的实现方式。
创建大体的框架
1. 构建基本类变量
模拟的是调制,调制也就是两个信号的相互作用。信号也就是波的叠加,简化一下,载波(carrier wave)用单一频率的波表示,信号波(message wave)用波实现简单运算得到。这个时候还有点复杂,波的种类繁多,所以我就只考虑Sin和Cos波。对应到代码构造,我比较喜欢用类编程,于是就有了下面的结构
class Wave:def __init__(self, fre, Amp, Phi):# 定义波的公共属性:幅度、频率、相位pass def __str__(self):# 打印波的信息,方便后期调试pass class SinWave(Wave):# 继承 Wave 类,子类实现 波与波的乘法运算def __init__(self, fre, Amp, Phi, modu_wave=None):super().__init__(fre, Amp, Phi, modu_wave, info='Sin')def __call__(self, t):# 定义调用接口,实现将t带入运算passdef __mul__(self, scalar):# 定义 波与波 之间的乘法运算法则passdef __rmul__(self, scalar):# 也是 实现 波与波的运算 passclass CosWave(Wave):# 构造与 SinWave 类似,不同的只是乘法运算法则不同class Signal:def __init__(self, sig=None):# 初始化 "Signal", 可以是 Wave 也可以是 实数,内部用 list 保存passdef max_fre(self):# 获取 Signal 的最大频率passdef max_Amp(self):# 获取 Signal 的最大幅值passdef __iter__(self):# 使得 Signal 变为可迭代对象,满足 Signal*Wave的运算passdef __add__(self, sig):# Signal 满足加法运算passdef __radd__(self, sig):# Signal 满足加法运算passdef __call__(self, t):# Signal 满足可调用passdef __str__(self):# 打印 Signal 的信息,方便以后调试。pass
2. 完善调制函数
信号Signal
和波Wave
初始化完成后,需要考虑调制的函数。这里用3个函数表示三种调制就行了
def AM(information_signal, carrier_signal, A):# AM 幅度调制,A 是调幅的参数,参考AM调制的原理passdef PM(information_signal, carrier_signal):# PM 相位调制 passdef FM(information_signal, carrier_signal, h=1):# FM 频率调制,h是调频参数 参考FM调制的原理pass
3. 构建作图函数
创建画图类 UpdateDist
class UpdateDist:# 画动图时候推荐采用类编程,比函数好管理def __init__(self, fig, x, *func_y):# 初始化刚开始的图像显示,我这里初始化了三个波passdef __call__(self, i):# 调用函数,这里的 i 也就是 t=i 时刻函数的图像,这样达到了动态显示的效果pass
代码的完善
对代码的完善就是对上面框架的缝缝补补,有时候可能会修改框架,上面的框架是我推翻了一次原框架后的结果。不过上面的框架还是适用于 AM 调制,因为 AM 调制本质就是几个波的乘法运算,而 PM 和 FM 是修改了波的相位,于是我就加了一个 modu_wave
变量
class CosWave(Wave):def __init__(self, fre, Amp, Phi, modu_wave=None):# modu_wave 默认为 None ,如果 PM 和 FM 时需要传入super().__init__(fre, Amp, Phi, modu_wave, info='Cos')self.modu_wave = modu_waveclass SinWave(Wave):def __init__(self, fre, Amp, Phi, modu_wave=None):super().__init__(fre, Amp, Phi, modu_wave, info='Sin')self.modu_wave = modu_wave
代码的具体实现,点击获取原文可以查看。
关于代码中的一些函数的解释
我在代码中用了几个 __mul__
、__add__
等以__
开头结尾的函数,这是python的魔法函数,它是python的一种协议。比如如果实现了函数 __add__
,就可以使用 +
运算。
__add__
和__radd__
# 比如这里有两个波 test1_wave = CosWave(fre= 2, Amp=0.5, Phi=0) test2_wave = CosWave(fre= 3, Amp=0.5, Phi=0) # 实现了 __add__ 函数后 载波信号可以这么写 signal = Signal() information_signal = signal + test1_wave + test2_wave # 实现了 __radd__ 函数后,前后式子可以调换位置 information_signal = test1_wave + signal + test2_wave# tip: 我这里只在 Signal 中实现了 + 法运算,所以 下面的写法会报错 # test_wave = test1_wave + test2_wave # 报错 # 原因嘛,我觉得 Signal 实现 + 就够使用了
可以看看波的样子
__mul__
和__rmul__
# __mul__ 表示乘法运算 # 还是上面的两个波,我可以直接这么写 information_signal = signal + test1_wave * test2_wave # 同理 实现了 __rmul__ 后可以换位置 information_signal = signal + test2_wave * test1_wave
看看波的样子
__call__
# 实现 # call 函数后,类变量可以和函数一样调用 # 上面的波举例,我要是想知道 t=1 时函数的幅值我就可以这么写 A1 = test1_wave(1) # 0.5 A2 = test2_wave(1) # 0.5
__str__
# 实现函数后 可以使用 str(func) 打印函数 # 接着上面的例子, 程序结果放在 '#' 后面 print(test1_wave) # CosWave(Frequency is 2,Amplitude is 0.5,Initial phase is 0),modulate wave is None print(test2_wave) # CosWave(Frequency is 2,Amplitude is 0.5,Initial phase is 0),modulate wave is None
总结
以上就是我分享的这次代码的细节部分,点击阅读全文获取代码。最后放几个 PM 和 FM 调制的图,我曾经对着这个图呆了一早上。
代码地址
Python模拟调制相关推荐
- python模拟按键_python 模拟按键放在模拟器Python初学者的17个技巧
Python初学者的17个技巧,有需要的朋友可以参考下. W WW.002pc .COM认为此文章对<python 模拟按键放在模拟器Python初学者的17个技巧>说的很在理. 交换变量 ...
- Python模拟赌博实验,赌博为什么能赌到倾家荡产?
Python模拟赌博实验 作者:dalalaa http://www.jianshu.com/p/2d919a028600 概述 前言 实验思路 实验步骤 统计数据 结论 阿广说 福利一刻 推荐阅读 ...
- python 模拟键盘_Python 模拟键盘输入 | 学步园
Python 模拟键盘输入,留着备用. #coding=utf-8 import win32gui,win32api,win32con import time import threading def ...
- python 模拟HTTP服务端
使用python模拟http服务端,自定义返回信息头部:#!/usr/bin/python import os from BaseHTTPServer import BaseHTTPRequestHa ...
- python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...
Python模拟QQ批量登陆脚本,以下代码附带解释以便于理解思路. Python代码: #coding=utf-8 import os import time import win32gui impo ...
- 利用Python模拟鼠标自动完成MM32-LINK程序下载
简 介: 编写了利用Python控制MM32-LINK自动下载程序,这可以减少在开发过程中的操作. MM32-LINK在打开程序过程中,对话框的标题出现错误,"Load form file& ...
- python 通过title判断_利用Python模拟GitHub登录
点击关注,我们共同每天进步一点点! 最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fidd ...
- Python模拟弹道轨迹
http://www.itongji.cn/cms/article/articledetails?articleid=5029 最近美国把萨德系统部署到韩国,一时心血来潮就用python模拟最简单的弹 ...
- python post请求 上传图片_利用python模拟实现POST请求提交图片的方法
本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...
最新文章
- 机器学习知识点(九)BP神经网络Java实现
- SAP Spartacus Header区域的渲染逻辑
- Properties常用方法
- Oracle-数据实现竖排打印
- Centos中不从skel目录里向其中复制任何文件错误的解决方法
- IBM PHP教程链接
- python中常见函数总结
- pythondjango网页制作_python+django加载静态网页模板解析
- python小波去噪的方法_小波去噪基本概念
- 《期货大作手风云录》读书笔记
- error:failed to run html help compiler on index.hhp
- 数论day2——离散对数、元根
- python做淘宝客_python 做淘宝客程序(2)
- opencv(二)图像像素提取及操作
- win7连接sftp_Windows下用sftp巧妙打造安全传输
- 使用赫夫曼编码进行解码
- jMonkeyEngine译文 FlagRush5(2)——跟随的摄像机(ChaseCamera)
- Windows API程序设计入门(新手的第一个Windows程序)
- 超低延迟直播~毫秒级直播观看体验(实测效果)
- 进程间通信有哪几种方式?进程间通信的方法详解