Python笔记-16QAM的编程实现
文章目录
- 前言
- 一、介绍
- [1]. 平均功率
- [2]. I输入和Q输入
- [3]. 映射
- [4]. I和Q输出
- [5]. 进制转换
- 二、代码
前言
QAM
正交振幅调制是Quadrature Amplitude Modulation
的缩写,
QAM
星座图有好几种,4QAM(也称QPSK)、16QAM和64QAM
。
此篇文章主要是针对16QAM
进行编码实现,4QAM
和64QAM
的实现方法与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
相当于星座图的纵轴。
分组的组数不能随便分,简单来说对于
16QAM
中16 = 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的编程实现相关推荐
- 初学者python笔记(面向对象编程、类与对象)
文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...
- 【Python笔记】网络编程
Python 网络编程 网络基础 为什么要使用通信协议 TCP/IP 简介 IP 协议 TCP 协议 UDP 简介 TCP 协议和 UDP 协议的区别 Socket 简介 TCP 编程 创建 TCP ...
- python笔记02_面向对象编程和面向对象高级编程
面向对象编程 变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__.__score__这样 ...
- 初学者python笔记(静态属性、类方法、静态方法、类的组合)
文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...
- Python学习笔记三之编程练习:循环、迭代器与函数
Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...
- 熊猫的python小课_朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!...
Print( ) 详细请见公众号文章,里面有让人印象深刻,无法忘记的灵魂画手的图画解释.朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!mp.weixin.qq.com 人类有人类 ...
- Python学习笔记·交互式图形编程
Python学习笔记·交互式图形编程 注:在校计算机学生一名,菜鸟一枚,最近开始学习Python的基础知识希望有什么不对的地方各位大佬能够不令赐教! 课程是在中国大学MOOC上学的,有兴趣的同学可以自 ...
- python笔记之编程风格大比拼
python笔记之编程风格大比拼 虽然我的python age并不高,但我仍然愿意将我遇到的或者我写的有趣的python程序和大家一块分享,下面是我找到的一篇关于各类python程序员的编程风格的比较 ...
- 唤醒手腕Python全栈工程师学习笔记(并发编程篇)
01.Process进程基本介绍 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器. 什么是进程? 进程 ...
- Python笔记002-列表推导式
Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...
最新文章
- Web安全实践(9)攻击apache
- h3c 路由器 刷第三方固件_图文版*许迎果 第201期 双11路由器型号推荐之刷机路由篇...
- cgi python windows_python cgi windows怎么办
- 使用Arquillian和LocalStack脱机测试AWS云堆栈
- 数据结构基础学习(一)数组
- 【辨异】inverse, reverse, converse
- 前端改变div排序_前端面试经常问到的问题
- 代码编辑器sublime text 4130 for Mac
- 【车辆计数】基于matlab形态学停车场车辆计数【含Matlab源码 628期】
- PS 快捷键大全(psshortcut)
- 嵌入式软件开发工程师未来的薪资待遇是什么情况
- c语言csp字符串,骇人听闻的 CSP
- npm publish 报错 403
- 第十四周助教工作总结——NWNU李泓毅
- 惠普电脑打开BIOS的方法
- python甜橙歌曲音乐网站平台源码
- Day002--MySQL中的图形工具的使用并创建数据表及查看表
- 应用启动失败,因为没有QT平台可以初始化
- CSS排版练习小作业,文字围绕图片显示,基本的float浮动定位
- persevere的用法_persevere是什么意思_persevere的翻译_音标_读音_用法_例句_爱词霸在线词典...