文章目录

  • 前言
  • 一、介绍
    • [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. 【重读iOS】网络请求2:应用
  2. USTC English Club Note20171020(3)
  3. SAP UI5 jQuery.sap.formatMessage
  4. ueditor如何设置上传图片的高度宽度_怎么设置天猫主图
  5. react中使用构建缓存_使用React和Netlify从头开始构建电子商务网站
  6. 更换Qt QtEmbedded库的版本出现问题及解决(交叉编译OpenSSL)
  7. Android 初级探讨 OOM问题 以及解决优化之道
  8. 游戏设计亦或课件设计
  9. 使用vs2005经验与教训(关于masterpage,menu,gridview及对exce的l操作)
  10. myeclipse导入项目
  11. C++中的namespace(using namespace)的理解
  12. 计算机坐标公式,经纬度换算坐标公式(经纬度转大地坐标公式)
  13. 用计算机找到自己的另一半,如何找到自己的另一半
  14. java epoch_获取Java中的Epoch的天数,周数和月份
  15. 植物大战僵尸修改存档总结
  16. 如何用C语言画立体几何图形,立体几何图形公式大全
  17. 数据结构与算法【Java】05---排序算法总结
  18. 华为AC+AP设备上线思路
  19. javax.servlet.ServletException: Could not resolve view with name 'destination/isOtherExist' in servl
  20. android 监测属性值变化,Android 的系统属性(SystemProperties)分析 | Bob's Blo...

热门文章

  1. 二、 jQuery带本地时间的日历代码
  2. JDY-24M 超级 BLE 蓝牙模块——理解与实践
  3. Python安装pandas模块
  4. VB6.0《第二行代码》4-游戏安全,逆向工程-用CE找多级指针HP的基址和偏移量并且用VB超级模块读取
  5. BOOST升压电路PCB布局布线
  6. Johnson算法PlantSimulation解决两机器多作业排版问题
  7. caj阅读器Mac版下载
  8. ajax java servlet_$.ajax(); 对应后台java servlet?
  9. 泰牛php第10期百度云,泰牛程序员 韩顺平 2017年 MyBatis
  10. 招标采购专业实务课程大纲--刘小明老师