分享一下我用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__,就可以使用 + 运算。

  1. __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 实现 + 就够使用了
    

    可以看看波的样子

  2. __mul____rmul__

    # __mul__ 表示乘法运算
    # 还是上面的两个波,我可以直接这么写
    information_signal = signal  + test1_wave * test2_wave
    # 同理 实现了 __rmul__ 后可以换位置
    information_signal = signal  + test2_wave * test1_wave
    

    看看波的样子

  3. __call__

    # 实现 # call 函数后,类变量可以和函数一样调用
    # 上面的波举例,我要是想知道 t=1 时函数的幅值我就可以这么写
    A1 = test1_wave(1) # 0.5
    A2 = test2_wave(1) # 0.5
    
  4. __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模拟调制相关推荐

  1. python模拟按键_python 模拟按键放在模拟器Python初学者的17个技巧

    Python初学者的17个技巧,有需要的朋友可以参考下. W WW.002pc .COM认为此文章对<python 模拟按键放在模拟器Python初学者的17个技巧>说的很在理. 交换变量 ...

  2. Python模拟赌博实验,赌博为什么能赌到倾家荡产?

    Python模拟赌博实验 作者:dalalaa http://www.jianshu.com/p/2d919a028600 概述 前言 实验思路 实验步骤 统计数据 结论 阿广说 福利一刻 推荐阅读 ...

  3. python 模拟键盘_Python 模拟键盘输入 | 学步园

    Python 模拟键盘输入,留着备用. #coding=utf-8 import win32gui,win32api,win32con import time import threading def ...

  4. python 模拟HTTP服务端

    使用python模拟http服务端,自定义返回信息头部:#!/usr/bin/python import os from BaseHTTPServer import BaseHTTPRequestHa ...

  5. python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...

    Python模拟QQ批量登陆脚本,以下代码附带解释以便于理解思路. Python代码: #coding=utf-8 import os import time import win32gui impo ...

  6. 利用Python模拟鼠标自动完成MM32-LINK程序下载

    简 介: 编写了利用Python控制MM32-LINK自动下载程序,这可以减少在开发过程中的操作. MM32-LINK在打开程序过程中,对话框的标题出现错误,"Load form file& ...

  7. python 通过title判断_利用Python模拟GitHub登录

    点击关注,我们共同每天进步一点点! 最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fidd ...

  8. Python模拟弹道轨迹

    http://www.itongji.cn/cms/article/articledetails?articleid=5029 最近美国把萨德系统部署到韩国,一时心血来潮就用python模拟最简单的弹 ...

  9. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

最新文章

  1. 机器学习知识点(九)BP神经网络Java实现
  2. SAP Spartacus Header区域的渲染逻辑
  3. Properties常用方法
  4. Oracle-数据实现竖排打印
  5. Centos中不从skel目录里向其中复制任何文件错误的解决方法
  6. IBM PHP教程链接
  7. python中常见函数总结
  8. pythondjango网页制作_python+django加载静态网页模板解析
  9. python小波去噪的方法_小波去噪基本概念
  10. 《期货大作手风云录》读书笔记
  11. error:failed to run html help compiler on index.hhp
  12. 数论day2——离散对数、元根
  13. python做淘宝客_python 做淘宝客程序(2)
  14. opencv(二)图像像素提取及操作
  15. win7连接sftp_Windows下用sftp巧妙打造安全传输
  16. 使用赫夫曼编码进行解码
  17. jMonkeyEngine译文 FlagRush5(2)——跟随的摄像机(ChaseCamera)
  18. Windows API程序设计入门(新手的第一个Windows程序)
  19. 超低延迟直播~毫秒级直播观看体验(实测效果)
  20. 进程间通信有哪几种方式?进程间通信的方法详解

热门文章

  1. mysql url 长度_http中url的长度限制
  2. 计算机4级考试信息整理
  3. SQL内连接,左连接,右连接区别及联系
  4. 系统镜像以及微PE工具箱
  5. 苹果Mac电脑使用的集成显卡GPU所有型号汇总
  6. WORD 模板相关问题
  7. Web-Day8笔记
  8. java正则提取文本手机号
  9. html资源加载前触发事件,jquery页面加载时触发ready()事件
  10. 七宝老街 都市的热闹庙会