文章目录

  • 前言
  • 一、介绍
    • [1]. 平均功率
    • [2]. I输入和Q输入
    • [3]. 映射
    • [4]. I和Q输出
    • [5]. 进制转换
  • 二、代码

前言

QAM正交振幅调制是Quadrature Amplitude Modulation的缩写,
QAM星座图有好几种,4QAM(也称QPSK)、16QAM和64QAM
此篇文章主要是针对16QAM进行编码实现,4QAM64QAM的实现方法与16QAM类似。
介绍中有些内容的原理不大记得了,如果有错误的话可评论指出。

一、介绍

[1]. 平均功率

由于博主在实现时没有使用的星座图来计算对应的QAM平均功率,所以需要在代码中设置一个平均功率进行计算的。
平均功率的求法如下:

  • 先在QAM中确定一个坐标系,默认两个黑点的间距为2
  • 计算原点到指定点的距离

确定一个QAM对应的平均功率只需要求下方几个例图的红线长度。
对于QPSK来说,黑点00的坐标为(1,1),所以由勾股定理可以得出红线的长度为根号2
QPSK的平均功率就是根号2

对于16QAM黑点0001的坐标为(1,3),所以线段长度为根号10

64QAM中,点坐标(1,7)到原点的距离为根号50

[2]. I输入和Q输入

下方是16QAM的一个例题,我们需要输入一个二进制串,
然后将这个二进制串分成8个分组,对于每个分组的前2位需要分配给I,后两位分配给Q
I相当于星座图的横轴,Q相当于星座图的纵轴。

分组的组数不能随便分,简单来说对于16QAM16 = 2 * 8,组数就是除以2后的数字8(如果没记错的话)

4QAM(QPSK)|16QAM|64QAM
–|–|–|–
2组|8组|32组

[3]. 映射

经过步骤二的分组后,二进制序列0000 1111 0101 1010 0000 1111 0101 1010
I输入为:00 11 01 10 00 11 01 10
Q输入为:00 11 01 10 00 11 01 10

将二进制数据提取出来后,不能直接传入I和Q进行计算
而是需要通过题目给出的映射关系表,将二进制转换为十进制数据。

原二进制 目标十进制
00 -3
01 -1
11 1
10 3

[4]. I和Q输出

经过步骤三的映射转换后,对应的数据如下
I输入为:-3 1 -1 3 -3 1 -1 3
Q输入为:-3 1 -1 3 -3 1 -1 3

获取了数据之后,就需要进行计算了
计算输出的规则为:输出的数据 = 原输入的十进制 / QAM的平均功率

[5]. 进制转换

经过步骤四的计算后,数据的类型为小数。
在数字通信中是以二进制的方式进行传输,所以计算后需要转换成对应的二进制输出。
小数在进行二进制转换的时候采用的是乘2取整的方式,
对于又是负数又是小数的情况,需要求解正数情况下的二进制数据,然后对结果中除了符号位外的二进制进行逐位取反操作。

二、代码

# coding=utf-8
# 作者:小狐狸
# 题目:模拟实现16QAM调制
def float_to_bin(number):'''转二进制串输出'''bin_number = ""#添加两个符号位if number<0:    bin_number += "11"else:bin_number += "00"num = abs(number)for i in range(6):
##        print(num,bin_number)num *= 2                    #乘2bin_number += str(int(num)) #取整num -= int(num)             #保留小数位num = round(num,4)          #保留4位小数,消除精度影响if bin_number[:2:]=="11":    #负数string = "11"           #临时字符串for i in range(2,len(bin_number)): #除符号位,逐位取反if bin_number[i]=='1':string += '0'else:string += '1'return stringelse:return bin_number
##print(float_to_bin(0.3162))avg = pow(10,0.5) #16QAM平均功率
data = list(input("请输入:").split())
input_i = []    #I输入
input_q = []    #Q输入
output_i = []   #I输出
output_q = []   #Q输出
for i in data:input_i.append(i[0:2:])     #前两个二进制数据input_q.append(i[-3:-1:])   #后两个二进制数据
#求解I输出
for i in input_i: if i=="00":     #00对应-3output_i.append(round(-3/avg,4))    #保留4位小数 elif i=="01":   #01对应-1output_i.append(round(-1/avg,4))    #保留4位小数elif i=="11":   #11对应1output_i.append(round(1/avg,4))     #保留4位小数  elif i=="10":   #10对应3output_i.append(round(3/avg,4))     #保留4位小数
#求解Q输出
for i in input_q: if i=="00":     #00对应-3output_q.append(round(-3/avg,4))    #保留4位小数 elif i=="01":   #01对应-1output_q.append(round(-1/avg,4))    #保留4位小数 elif i=="11":   #11对应1output_q.append(round(1/avg,4))     #保留4位小数  elif i=="10":   #10对应3output_q.append(round(3/avg,4))     #保留4位小数
#十进制转二进制
for i in range(len(output_i)):output_i[i] = float_to_bin(output_i[i]) #I输出output_q[i] = float_to_bin(output_q[i]) #Q输出
#输出
print("I输出:",' '.join(str(i) for i in output_i))
print("Q输出:",' '.join(str(i) for i in output_q))##测试数据
##0000 1111 0101 1010 0000 1111 0101 1010#0.3162小数转bin
##0.3162*2 = 0.6324
##0.6324*2 = 1.2648
##0.2648*2 = 0.5296
##0.5296*2 = 1.0592
##0.0592*2 = 0.1184
##0.1184*2 = 0.2368

Python笔记-16QAM的编程实现相关推荐

  1. 初学者python笔记(面向对象编程、类与对象)

    文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...

  2. 【Python笔记】网络编程

    Python 网络编程 网络基础 为什么要使用通信协议 TCP/IP 简介 IP 协议 TCP 协议 UDP 简介 TCP 协议和 UDP 协议的区别 Socket 简介 TCP 编程 创建 TCP ...

  3. python笔记02_面向对象编程和面向对象高级编程

    面向对象编程 变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__.__score__这样 ...

  4. 初学者python笔记(静态属性、类方法、静态方法、类的组合)

    文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...

  5. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  6. 熊猫的python小课_朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!...

    Print( ) 详细请见公众号文章,里面有让人印象深刻,无法忘记的灵魂画手的图画解释.朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!​mp.weixin.qq.com 人类有人类 ...

  7. Python学习笔记·交互式图形编程

    Python学习笔记·交互式图形编程 注:在校计算机学生一名,菜鸟一枚,最近开始学习Python的基础知识希望有什么不对的地方各位大佬能够不令赐教! 课程是在中国大学MOOC上学的,有兴趣的同学可以自 ...

  8. python笔记之编程风格大比拼

    python笔记之编程风格大比拼 虽然我的python age并不高,但我仍然愿意将我遇到的或者我写的有趣的python程序和大家一块分享,下面是我找到的一篇关于各类python程序员的编程风格的比较 ...

  9. 唤醒手腕Python全栈工程师学习笔记(并发编程篇)

    01.Process进程基本介绍 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器. 什么是进程? 进程 ...

  10. Python笔记002-列表推导式

    Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...

最新文章

  1. Web安全实践(9)攻击apache
  2. h3c 路由器 刷第三方固件_图文版*许迎果 第201期 双11路由器型号推荐之刷机路由篇...
  3. cgi python windows_python cgi windows怎么办
  4. 使用Arquillian和LocalStack脱机测试AWS云堆栈
  5. 数据结构基础学习(一)数组
  6. 【辨异】inverse, reverse, converse
  7. 前端改变div排序_前端面试经常问到的问题
  8. 代码编辑器sublime text 4130 for Mac
  9. 【车辆计数】基于matlab形态学停车场车辆计数【含Matlab源码 628期】
  10. PS 快捷键大全(psshortcut)
  11. 嵌入式软件开发工程师未来的薪资待遇是什么情况
  12. c语言csp字符串,骇人听闻的 CSP
  13. npm publish 报错 403
  14. 第十四周助教工作总结——NWNU李泓毅
  15. 惠普电脑打开BIOS的方法
  16. python甜橙歌曲音乐网站平台源码
  17. Day002--MySQL中的图形工具的使用并创建数据表及查看表
  18. 应用启动失败,因为没有QT平台可以初始化
  19. CSS排版练习小作业,文字围绕图片显示,基本的float浮动定位
  20. persevere的用法_persevere是什么意思_persevere的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. 遥感大辞典_学遥感必读的十本书
  2. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第七章 GitHub命令与控制(2)构建基于GitHub的特洛伊木马框架
  3. 国内知名的java商城系统排名
  4. java商城系统设计—竞拍
  5. 删除ubuntu后修复win7系统的引导
  6. java宠物店管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  7. 数字图像处理 冈萨雷斯(第四版)距离测度
  8. 数字图像处理 冈萨雷斯 (第四版) 比特平面分层,图像重建
  9. 基于IOS的仿微博系统
  10. 报表工具分析总结报告