调制,就是将原始信号转换为适合在信道中传输的形式的一种过程,在无线通信中,调制一般均指载波调制,而解调则是调制的逆过程,即将原始信号从已调信号中恢复出来。

  进行载波调制,主要为实现以下目标:

  1)在无线传输中,信号是以电磁波的形式通过天线辐射到空间的。为了获得较高的辐射效率,天线的尺寸必须与发射信号波长相匹配。因此,需要通过调制将基带信号的频谱搬迁至较高的频带,使得已调信号的频域与信道的带通特性相匹配,这样就可以以较小的发送功率和较短的天线来辐射电磁波。
  2)将多个基带信号的频谱搬移至不同的频点,从而实现频分复用,提高频谱利用效率。
  3)扩展信号带宽,提高系统抗干扰、抗衰落能力

  在5G NR中,主要使用正交振幅调制(Quadrature Amplitude Modulation, QAM),包括BSPK,QPSK,16QAM, 64QAM, 256QAM等;它是一种振幅和相位联合键控的调制方式,由于其矢量图看似星座,故又称为星座(Constellation)调制。在3GPP 38.211协议中,对物理层各信道的调制以及解调方式进行说明。

  在π/2-BPSK中,二进制比特b(i)映射至复值调制符号d(i)

  在BPSK中,二进制比特b(i)映射至复值调制符号d(i)

  在QPSK中,二进制比特b(2i)和b(2i+1)映射至复值调制符号d(i)

  在16QAM中,二进制比特b(4i), b(4i+1), b(4i+2), b(4i+3)映射至复值调制符号d(i)

  在64QAM中,二进制比特b(6i), b(6i+1),b(6i+2),b(6i+3),b(6i+4),b(6i+5)映射至复值调制符号d(i)

  在256QAM中,二进制比特b(8i), b(8i+1),b(8i+2),b(8i+3),b(8i+4),b(8i+5),b(8i+6),b(8i+7)映射至复值调制符号d(i)

  下面是通过python实现的调制和硬解调的代码:

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2019/11/24 10:24
  3. # @Author : Administrator
  4. # @File : modulator.py
  5. # @Software : PyCharm
  6.  
  7. import numpy as np
  8.  
  9. class ModulateTable():
  10.  
  11. def __init__(self, **kwargs):
  12. self._bpsk_cor = np.sqrt(1/2)
  13. self._qpsk_cor = np.sqrt(1/2)
  14. self._16qam_cor = np.sqrt(1/10)
  15. self._64qam_cor = np.sqrt(1/42)
  16. self._256qam_cor = np.sqrt(1/170)
  17.  
  18. self.const_bit = {'BPSK': 1, 'QPSK': 2, '16QAM': 4}
  19. self.bit_table = {'BPSK': np.array( [0, 1] ),
  20. 'QPSK': np.array([[0, 0], [0, 1], [1, 0], [1, 1]]),
  21. '16QAM': np.array([[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1],
  22. [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1],
  23. [1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0], [1, 0, 1, 1],
  24. [1, 1, 0, 0], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]])}
  25.  
  26. def _bpsk_table(self):
  27. return np.array([1+1j, 1-1j])
  28.  
  29. def _qpsk_table(self):
  30. return np.array([1+1j, 1-1j, -1+1j, -1-1j])
  31.  
  32. def _16qam_table(self):
  33. return np.array([ 3+3j, 1+3j, -1+3j, -3+3j,
  34. -3+1j, -1+1j, 1+1j, 3+1j,
  35. 3-1j, 1-1j, -1-1j, -3-1j,
  36. -3-3j, -1-3j, 1-3j, 3-3j])
  37.  
  38. class Modulator(ModulateTable):
  39.  
  40. def __init__(self, **kwargs):
  41. super().__init__(**kwargs)
  42. self.mod_type = kwargs.get('mod_type', '')
  43.  
  44. def modulate(self, input):
  45.  
  46. self._get_symbol_table()
  47. const_bit_num = self.const_bit[self.mod_type]
  48. bit_table = self._get_bit_table(const_bit_num)
  49.  
  50. input = input.reshape((-1, const_bit_num))
  51. order = np.dot(input, bit_table)
  52. ouput = self.symbol_table[order]
  53.  
  54. return ouput
  55.  
  56. def demodu_hard(self, input):
  57.  
  58. self._get_symbol_table()
  59. bit_table = self.bit_table[self.mod_type]
  60. min_loc = list(map(self.cal_distance, input))
  61. output = bit_table[min_loc].flatten()
  62.  
  63. return output
  64.  
  65. def demodu_soft(self, input):
  66. pass
  67.  
  68. def cal_distance(self, rec_symbol):
  69. return np.argmin(abs(rec_symbol - self.symbol_table))
  70.  
  71. def _get_symbol_table(self):
  72.  
  73. if self.mod_type == 'BPSK':
  74. self.symbol_table = self._bpsk_table() * self._bpsk_cor
  75. elif self.mod_type == 'QPSK':
  76. self.symbol_table = self._qpsk_table() * self._qpsk_cor
  77. elif self.mod_type == '16QAM':
  78. self.symbol_table = self._16qam_table() * self._16qam_cor
  79. else:
  80. raise ValueError("Only support BPSK, QPSK, 16QAM in modulate!")
  81.  
  82. def _get_bit_table(self, bit_num):
  83. return np.logspace((bit_num - 1), 0, bit_num, endpoint=True, base=2).astype(np.int)
  84.  
  85. if __name__ == '__main__':
  86.  
  87. input = np.random.randint(0, 2, 1024)
  88.  
  89. modu = Modulator(mod_type='16QAM')
  90. demodu_in = modu.modulate(input)
  91. demodu_ou = modu.demodu_hard(demodu_in)
  92. print(demodu_in)
  93. print(demodu_ou)
  94.  
  95. if (input == demodu_ou).all():
  96. print("right")
  97. else:
  98. print("error")

5G 调制与解调的更多相关文章

  1. DVB-C系统中QAM调制与解调仿真

    本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对&q ...

  2. 【Matlab】BFSK的调制与解调仿真

    写在前面 本篇是[Matlab]BASK的调制与解调仿真的下篇,考虑到阅读体验,故另开一篇分享将BFSK的调制与解调仿真. 索引 写在前面 一.BFSK的调制 1.1 异频载波生成 1.2 信号合并 ...

  3. <转载>调制与解调电路详解

    原文链接:http://www.elecfans.com/analog/20120509270848_4.html 调幅和检波电路 广播和无线电通信是利用调制技术把低频声音信号加到高频信号上发射出去的 ...

  4. matalb 产生信号源 AM调制解调 FM调制解调

    %%%%%%%%%%%%%%%%%%%%%%%%%%% %AM调制解调系统 %%%%%%%%%%%%%%%%%%%%%%%%%%% clear; clf; close all Fs=800000;%采 ...

  5. 解读:20大5G关键技术

    解读:20大5G关键技术 5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(M ...

  6. 小小知识点(二十七)20大5G关键技术

    5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(MEC). 1 网络功能虚拟 ...

  7. 计算机网络模型与5G协议

    计算机网络模型与5G协议 目录 计算机网络模型与5G协议 一.分层思想 1.什么是分层思想 2.分层思想的优势 二.osi七层参考模型 1.国际标准化组织(ios) 2.七层模型及对应功能和硬件 3. ...

  8. 通信原理实践(二)——幅度调制

    一.幅度调制,并画出时域和频域波形 1.代码如下: function [ p_n ] = AM_func( N,fs,fm,Am,fc,Ac,Ma ) %UNTITLED 此处显示有关此函数的摘要 % ...

  9. GaN助力运营商和基站OEM实现5G sub-6GHz和mmWave大规模MIMO

    到2021年,估计全球会有更多的人拥有移动电话(55亿),将超过用上自来水的人数(53亿).与此同时,带宽紧张的视频应用将进一步增加对移动网络的需求,其会占移动流量的78%.使用大规模多输入多输出(M ...

随机推荐

  1. PhpStudy BackDoor2019 深度分析

    笔者<Qftm>原文发布<合天>:https://mp.weixin.qq.com/s?__biz=MjM5MTYxNjQxOA==&mid=2652852661&am ...

  2. 在input输入值改变reducer里的值

    输入值改变reducer里的值 通过store.dispatch传入reducer中,函数的第二个参数可以接收到 在reducer中 在todolist文件中 然后在把this.state中的值改变

  3. ubuntu 16.04源码编译和配置caffe详细教程 | Install and Configure Caffe on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/b90033a9/,欢迎阅读! Install and Configure Caffe on ubuntu 16.04 Series ...

  4. selenium针对浏览器滚动条的操作

    我们在实际自动化测试过程中,肯定会遇到当前页面显示不到我们定位的元素.这就需要下拉滚动条才能显示出我们的元素: 而滚动条的按钮又是我们定位不到的,所以需要使用js脚本来完成: 1.先来说我们的下拉滚动 ...

  5. 手把手带你一键部署 Kubernetes + KubeSphere 至 Linux

    本文介绍一个最快安装 Kubernetes 和体验 KubeSphere 核心功能的方式,all-in-one 模式可一键安装 Kubernetes v1.15.5 和 KubeSphere 至一台 ...

  6. Java thinking,What is the result?

    interface O { public Integer oc(Integer i); } abstract class A { Integer i; public A(){ this.i = 0; ...

  7. mac 安装zmap

    mac安装zmap有两种方式 1.命令行安装 brew install zmap export PATH=$PATH:/usr/local/sbin 很多人安装的时候只有第一步,然后直接bash:zm ...

  8. Web渗透测试流程

    什么是渗透测试? 渗透测试 (penetration test)并没有一个标准的定义,国外一些安全组织达成共识的通用说法是:渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法 ...

  9. 【Android - 自定义View】之自定义可滚动的流式布局

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 FlowLayout ,继承自ViewGroup类: (2)在这个自定义View中,用户可以放入所有继承自View类的视图,这个 ...

  10. nginx重启后,反向代理失败之问题排查记录

    问题与排查过程 本地开发环境的服务器,部署了nginx,nginx上对静态的web前端页面进行了http 80端口代理:然后呢,因为一些原因,服务器重启了,重启服务器后,我去把nginx启动起来,但是 ...