5G和Wi-Fi 6里都在用的16QAM,我用NumPy+Matplotlib复现了它的调制波形

通信原理学习指南:从MATLAB仿真到工程实践的全套资料解析 通信原理是理解现代通信系统(如4G/5G、Wi-Fi、卫星通信)的理论基石,其核心在于将抽象的数学公式转化为可分析、可设计的系统模型。该学科通过研究信号调制、编码、传输与接收等基本原理,揭示了信息在噪声信道中可靠传输的科学规律。其技术价值在于为各类通信系统的设计、性能评估与优化提供了理论框架和量化工具,广泛应用于无线通信、光纤传输、雷达与导航等领域。本文以一套源自高校电信专业的完整课程资料为切入点,深入解析如何通过MATLAB/Python仿真,将信道编码、误码率分析等核心理论进行工程化实践。资料包涵盖了从 阅读详情

用Python再现16QAM调制:从理论到5G/Wi-Fi 6实战解析

在咖啡馆打开手机测速时,你可能注意过状态栏显示的"5G"或"Wi-Fi 6"标志。这些现代通信标准背后,藏着一种被称为16QAM的数字调制技术。作为通信工程师工具箱里的"瑞士军刀",QAM调制通过同时操控载波的幅度和相位,让每个信号符号能携带更多信息。本文将带你用NumPy和Matplotlib,亲手复现这项支撑现代通信的关键技术。

1. 为什么现代通信选择16QAM?

当5G基站需要为体育场数万观众同时传输4K视频时,当Wi-Fi 6路由器要保证全屋8个设备稳定联网时,频谱效率成为关键指标。16QAM(16进制正交幅度调制)能在相同频带宽度下,相比传统QPSK传输两倍多的数据量——这正是它被5G和Wi-Fi 6标准采纳的核心原因。

三种典型调制方式对比 :

调制类型 符号数 每符号比特数 抗噪能力 典型应用场景
BPSK 2 1 ★★★★★ 深空通信
QPSK 4 2 ★★★★ 4G LTE
16QAM 16 4 ★★★ 5G/Wi-Fi 6

提示:高阶调制像在暴雨中同时抛接更多球——需要更好的信道条件才能稳定接住

实际通信系统会根据信道质量动态调整调制方式。在信号较强的室内场景,你的手机可能使用64QAM甚至256QAM;而当移动到电梯等信号较弱区域时,系统会自动降级到QPSK保证连接稳定。这种自适应机制正是现代通信智能化的体现。

2. 16QAM的数学本质与星座图

理解16QAM需要掌握其核心数学表示。每个符号可以表示为:

s(t) = I·cos(2πf₀t) - Q·sin(2πf₀t)

其中I和Q分别代表同相(In-phase)和正交(Quadrature)分量的幅度。对于16QAM,I和Q各取4个离散值(如±1, ±3),组合出16种可能的符号状态。

用Python绘制星座图的实操代码:

import numpy as np
import matplotlib.pyplot as plt

# 定义比特到幅度的映射(格雷编码)
bit_to_amp = {
    '00': -3, '01': -1, 
    '11': +1, '10': +3
}

plt.figure(figsize=(8,8))
for b3b2 in bit_to_amp:  # I路比特
    for b1b0 in bit_to_amp:  # Q路比特
        I = bit_to_amp[b3b2]
        Q = bit_to_amp[b1b0]
        plt.scatter(I, Q, c='b')
        plt.text(I, Q+0.3, f"{b3b2}{b1b0}", 
                ha='center', fontsize=10)
        
plt.axhline(0, color='k', linestyle='--', alpha=0.3)
plt.axvline(0, color='k', linestyle='--', alpha=0.3)
plt.xlabel('I分量'); plt.ylabel('Q分量')
plt.title('16QAM星座图(格雷编码)')
plt.grid(True); plt.show()

这段代码揭示了三个关键设计原则:

  1. 格雷编码 :相邻符号仅1比特差异,降低误码率
  2. 幅度分级 :采用±1, ±3而非均匀分布,提高抗噪能力
  3. 正交分离 :I/Q两路完全独立,实现频谱效率翻倍

3. 完整调制流程的Python实现

现在我们将实现从比特流到调制波形的完整过程。假设要传输的二进制数据是 [1,0,1,1, 0,0,1,1, 1,1,0,1] (每4比特为一组):

def generate_16qam_waveform(bit_sequence, samples_per_symbol=100):
    # 参数初始化
    carrier_freq = 2  # 载波频率(Hz)
    symbol_duration = 1  # 符号持续时间(s)
    t = np.linspace(0, symbol_duration, samples_per_symbol, endpoint=False)
    
    # 分割比特流为4比特组
    symbols = np.reshape(bit_sequence, (-1, 4))
    
    # 生成调制波形
    modulated_wave = []
    for symbol in symbols:
        # 将4比特分为I路和Q路各2比特
        I_bits = ''.join(map(str, symbol[:2]))
        Q_bits = ''.join(map(str, symbol[2:]))
        
        # 查询幅度值
        I_amp = bit_to_amp[I_bits]
        Q_amp = bit_to_amp[Q_bits]
        
        # 生成载波
        I_carrier = I_amp * np.cos(2*np.pi*carrier_freq*t)
        Q_carrier = Q_amp * np.sin(2*np.pi*carrier_freq*t)
        
        # 合并两路信号
        modulated_wave.extend(I_carrier - Q_carrier)
    
    return modulated_wave

# 示例比特流
bits = np.array([1,0,1,1, 0,0,1,1, 1,1,0,1])
waveform = generate_16qam_waveform(bits)

# 绘制时域波形
plt.figure(figsize=(10,4))
plt.plot(np.linspace(0, len(bits)/4, len(waveform)), waveform)
plt.title('16QAM时域波形示例')
plt.xlabel('时间(symbol duration)'); plt.ylabel('幅度')
plt.grid(True); plt.show()

关键步骤说明:

  1. 串并转换 :将串行比特流分解为I/Q两路
  2. 符号映射 :每2比特映射为特定幅度值(±1或±3)
  3. 载波调制 :用正交载波分别调制I/Q信号
  4. 信号合成 :合并两路信号形成最终波形

4. 从仿真到现实的工程考量

虽然我们的仿真能展现16QAM基本原理,但实际通信系统还需考虑以下增强措施:

现实系统必备组件 :

  • 信道编码 :添加冗余比特纠错(如LDPC码)
  • 脉冲整形 :使用升余弦滤波器控制带宽
  • 同步机制 :载波同步和符号定时恢复
  • 自适应均衡 :补偿多径效应引起的失真

以脉冲整形为例,实际系统会这样改进我们的代码:

from scipy.signal import firwin

# 设计升余弦滤波器
sps = 10  # 每符号采样数
beta = 0.35  # 滚降系数
taps = firwin(101, 1/sps, window=('kaiser', beta))

# 应用滤波器
filtered_wave = np.convolve(waveform, taps, mode='same')

在Wi-Fi 6的实际测试中,采用16QAM配合OFDM技术,可以在80MHz信道带宽下实现约600Mbps的单流速率。而当升级到256QAM时,速率可提升至800Mbps——这也解释了为什么高端路由器会强调对高阶QAM的支持。

5. 调制技术演进与未来展望

从2G时代的GMSK到5G的1024QAM,调制技术持续突破香农极限。值得关注的几个发展方向:

  • 非正交多址接入 :通过叠加编码进一步提升频谱效率
  • 人工智能辅助调制 :用神经网络优化星座图设计
  • 太赫兹通信 :在更高频段探索超高速率可能性

最近在毫米波频段的一项实验显示,结合智能反射面的256QAM系统,在移动场景下仍能保持10^-3以下的误码率。这意味着未来地铁隧道等传统信号死角也有望实现超高速连接。

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios) 公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。 阅读详情

相关推荐

Mac Studio M5 Ultra本地部署大模型实战:从内存原理到Ollama开发工作流

大模型推理的性能瓶颈往往不在算力,而在于内存能否装下整个模型、带宽能否持续供得上。Transformer架构每生成一个token都需要把权重完整扫一遍,决定了这本质上是内存密集型任务——统一内存架构因此成为本地部署的关键通路,超大容量与高带宽并行,让“装得下”和“跑得快”同时成立。模型量化技术(如Q4_K_M)则是另一项决定性软件策略,用轻微精度损失换取更低的硬件门槛,也是Ollama本地部署从7B到70B各类模型必做的前置功课。当本地推理服务跑起来后,借助VS Code等开发工具的OpenAI兼容API接

weixin_29043895的博客 423

java entity tostring_EntityUtils.toString(entity)处理字符集问题解决

爬取51job和猎聘网的信息,想处理字符集问题(51job为gbk,猎聘为utf-8),找到两个网站字符集信息都在同一标签下就想先把网页保存成string,解析一遍获取字符集,然后将网页转换成对应的正确的字符集,最后再转换成统一的字符集utf-81.0实现,2次调用entity.utils.tostring方法closeablehttpresponse httpresponse = httpcli...

weixin_29568097的博客 4175

【R语言-生存分析之观察生存率计算】

全人群肿瘤登记资料常用的统计分析指标包括发病率、死亡率、现患率以及生存率等,其中肿瘤生存率是评估肿瘤治疗效果和肿瘤负担的必要指标,其计算涉及肿瘤患者的发病、 死亡和随访三个方面的资料, 数据整理和计算过程均较为复杂, 如何及时、 准确地计算肿瘤生存率, 并使其可以在不同地区、 不同人群、不同时期间被客观公正地比较和评价,仍然是统计学家们一直在研究的主题。

weixin_46579654的博客 5432

EntityUtils.toString(entity)

原来是html = EntityUtils.toString(entity);这句导致了后面的写入文件错误.entity所得到的流是不可重复读取的也就是说所得的到实体只能一次消耗完,不能多次读取,所以在执行html = EntityUtils.toString(entity)后,流就关闭了,就导致后面的读和写显示错误.

飞火龙在天的博客 3万+

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7388

华为Ascend C算子开发能力认证(中级)(个人记录,有完整代码,已通过认证,仅供参考)

本文介绍了在昇腾NPU环境下实现Sigmoid算子的完整流程。首先需要在华为云ModelArts-Notebook或开发者套件上搭建环境,要求CANN版本为8.0.0.beta1。主要内容包括:1)实现SigmoidCustom算子的kernel侧核函数代码;2)完成host侧Tiling结构体实现;3)支持Float16数据类型。代码实现部分详细展示了核函数计算流程、数据拷贝和牛顿迭代优化方法。最后介绍了编译部署流程,包括环境配置、代码上传、编译执行等步骤,并提供了提交规范说明。该实现通过调用Ascend

qq_73044452的博客 1103

解决EntityUtils.toString()只能使用一次的情况

EntityUtils

qq_42195589的博客 982

3大绝招!MySQL如何轻松搞定文本、图像和视频的多模态数据分析?

首先,让我们来了解一下“多模态”到底是什么意思。简单来说,多模态指的是能够同时处理不同类型数据(如文本、图像、音频等)的能力。传统的数据库往往只能专注于一种或几种特定类型的数据,比如关系型数据库主要处理结构化数据,而文档型数据库则更适合非结构化数据。但是现在,随着技术的进步,像MySQL这样的数据库也开始支持更加复杂的数据模型,允许我们在同一个系统内处理多种格式的数据。通过上述五个部分的详细介绍,相信你现在应该对如何利用MySQL进行多模态数据分析有了更清晰的认识。

java专栏 2110

Java工具类技巧

1.JAVA字符串格式化-String.format()的使用 String str=String.format("Hi,%s:%s.%s", "王南","王力","王张"); // Hi,王南:王力.王张 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。详细用法参考JAVA字符串格式化。 2.HttpEntity静态帮助类-Enti...

Java技术博客分享 691

基于STM32设计的个人健康检测仪(华为云IOT)(191)

本系统采用华为云物联网平台实现数据云端存储与分析,并通过自研手机APP提供远程监控界面,让用户无论身处何地都能及时掌握自身的健康数据,为用户提供个性化的健康管理方案,同时也为医疗机构提供了便捷的数据获取途径,助力实现智能化、精细化的医疗服务。

1670

23种设计模式-代理(Proxy)设计模式

软考中级-软件设计师 代理设计模式

片言可决讼,半纸能缚龙 1770

EntityUtils.toString(entity)处理中文乱码问题解决

一、正常情况下问题 二、解决 1.首先F12查看你访问的网站编码格式,例如我这边查看的是王者荣耀官网 2.修改编码格式“gbk” content = EntityUtils.toString(entity,"gbk"); 3.再次测试打印 4.注意: 很多人(包括我自己)第一时间都赶紧设置了UTF-8,但是这太武断了,还是要根据网站自身的编码格式来设置。 ...

Joe14103的博客 1万+

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

饮食在人们的日常生活、营养与医疗建议以及运动员等专业人士的训练上起着越来越重要的作用。随着互联网的发展和医学的进步,人们普遍上传分享和记录的食物图像形成了非常多的数据库,为了改善饮食结构,塑造更健康的生活方式,分析食物的种类、热量和进食时间成为了营养学上非常重要的研究方法,本文的使用深度学习算法可以根据用户上传的食物图像自动分析食物种类。深度学习是机器学习领域的一个研究方向。深度学习通过对数据特征的学习将原始数据转化为计算机可以理解的抽象数据,根据学习到的特征,可以对原始数据进行检测或分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4702

toString转化成json

toString转化成json

weixin_43447266的博客 3219

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【线上】EntityUtils.toString(resEntity,“UTF-8“) 处理时间很长问题

httpClient http 耗时久,排查是非流式处理返回数据的EntityUtils.toString(resEntity,"UTF-8")这句耗时很久,返回数据量太大了 相关文档与讨论 https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/util/EntityUtils.html#toSt...

master-dragon的专栏 5232

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

调用阿里云接口返回数据的处理方式----EntityUtils.toString(response.getEntity());

https://market.aliyun.com/products/57000002/cmapi010841.html?spm=5176.2020520132.101.2.59967218YOmGjp#sku=yuncode484100003 String json= EntityUtils.toString(response.getEntity()); ObjectMapper mapper = new ObjectMapper();

一切都会好起来的,即使不在今天 3267

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

将实体类 转换为Json 输出 重写 toString

一、导入jar包 <!-- https://mvnrepository.com/artifact/net.sf.ezmorph/ezmorph --> <dependency> <groupId>net.sf.ezmorph</groupId> <artifactId>...

Joe_elena的博客 3963

toString如何转json

戳蓝字「TopCoder」关注我们哦!试想一个问题:如果我们已知Java对象的toString格式,想要获取其json格式或者其Java对象,该如何做呢?注意:Java对象的toStr...

luoxn28的专栏 7446

java爬虫

爬虫的三大模块 1.获取数据 2.解析数据 3.保存数据 爬虫说白了就是一个程序,用来获取网络上的数据 爬虫的价值在于数据的价值 爬虫分类: 通用型爬虫:用来获取互联网上所有的数据,代表就是百度,谷歌 垂直型爬虫:爬取特定的行业或网站的特定信息的爬虫程序 爬虫的爬取过程 1.指定爬取的url 2.获取数据 3.解析数据(解析url) 4.保存数据 爬虫程序在爬取数据的时候要把自己伪装成一个浏览器,...

wwzzh1989的博客 419

【JAVA】常用方法

文章目录产生随机数获取当前时间、日期,上一周、下一周等基本数据类型如何比较是否相等、引用类型如何比较是否相等重定向输出流实现程序日志从控制台接受输入字符 产生随机数 1.Random()构造一个新的随机数生成器 2.Int nextInt(int n) 返回一个0~n-1之间的随机数 获取当前时间、日期,上一周、下一周等 LocalDate newYearsEve=LocalDate.of(199...

bug制造者 341

异常 - HttpGet、EntityUtils.toString时输出网页中文乱码

 toString时加上编码: EntityUtils.toString(entity, "utf-8"); @Test public void testHttpClient() { try { HttpGet httpGet = new HttpGet("http://www.baidu.com"); // httpGet.setHeader(new BasicHe...

阿泷的学习日志 6603

FastJson-从httpEntity到Json

在对接第三方接口时返还的数据是HttpResponse,如何从response中取到相应的code值呢?特作出一个总结: 1.从response中可以得到httpEntity实体 HttpEntity entity = response.getEntity(); EntityUtils.toString(response.getEntity()) 输出的结果为: 2.String转换为JsonObject格式 JSONObject jsonObject = JSON.pars

曰业而安的博客 2620

java中List的toString与JSON工具包转string

小计 java中List使用toString转字符串和第三方JSON工具包(如fastjson)转成字符串可能会不一样,如下: public static void main(String[] args) { List<Long> list = new ArrayList<>(); list.add(12312433545L); list.add(34562342443L); System.out.println(list.toString());

ibigboy 1408
上一篇: 别再只用Matplotlib画二维图了!手把手教你用plot_surface和plot_wireframe玩转三维曲面(附极坐标案例)
下一篇: 别再死磕ATS了!当PCIe设备遇到内存缺页,PRS(页请求服务)如何优雅救场?
weixin_30791095
博客等级 码龄11年 123粉丝 1382原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值