当前位置: 首页 > news >正文

python qam

import matplotlib.font_manager
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 方式1:全局指定(推荐)
plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']  # 与字体真实名称一致
plt.rcParams['axes.unicode_minus'] = False              # 让负号正常显示#sudo apt install fonts-wqy-zenhei
#rm -rf ~/.cache/matplotlib/def plot_subplot(ax, x, y, title, ylabel, color=None, xticks=None, xticklabels=None, drawstyle=None, grid=True, xlabel=None):ax.plot(x, y, color=color, drawstyle=drawstyle)ax.set_title(title)ax.set_ylabel(ylabel)if xticks is not None and xticklabels is not None:ax.set_xticks(xticks)ax.set_xticklabels(xticklabels)if grid:ax.grid(True)if xlabel is not None:ax.set_xlabel(xlabel)class QAMModulator:"""QAM调制器类,封装常用的QAM调制功能"""def __init__(self, M=4, samples_per_symbol=40, fs=1000, fc=50):"""初始化QAM调制器M: QAM阶数(如4、16)samples_per_symbol: 每个符号的采样点数fs: 采样率fc: 载波频率"""self.M = Mself.k = int(np.log2(M))self.samples_per_symbol = samples_per_symbolself.fs = fsself.fc = fcself._init_mapping_table()def _init_mapping_table(self):if self.M == 4:self.mapping_table = {(0,0): (-1, -1),(0,1): (-1,  1),(1,1): ( 1,  1),(1,0): ( 1, -1),}elif self.M == 16:self.mapping_table = {(0,0,0,0): (-3, -3), (0,0,0,1): (-3, -1), (0,0,1,1): (-3, 1), (0,0,1,0): (-3, 3),(0,1,0,0): (-1, -3), (0,1,0,1): (-1, -1), (0,1,1,1): (-1, 1), (0,1,1,0): (-1, 3),(1,1,0,0): ( 1, -3), (1,1,0,1): ( 1, -1), (1,1,1,1): ( 1, 1), (1,1,1,0): ( 1, 3),(1,0,0,0): ( 3, -3), (1,0,0,1): ( 3, -1), (1,0,1,1): ( 3, 1), (1,0,1,0): ( 3, 3),}else:raise ValueError(f"不支持的QAM阶数: {self.M}")def generate_random_bits(self, num_bits, seed=None):if seed is not None:np.random.seed(seed)return np.random.randint(0, 2, num_bits)def pad_bits(self, bits):remainder = len(bits) % self.kif remainder != 0:padding = np.zeros(self.k - remainder, dtype=int)return np.concatenate([bits, padding])return bitsdef bits_to_symbols(self, bits):bits = self.pad_bits(bits)bits = bits.reshape((-1, self.k))symbols = np.array([self.mapping_table[tuple(b)] for b in bits])return symbols[:, 0], symbols[:, 1]def generate_baseband_signals(self, bits, I_symbols, Q_symbols):b_baseband = np.repeat(bits, self.samples_per_symbol // self.k)I_baseband = np.repeat(I_symbols, self.samples_per_symbol)Q_baseband = np.repeat(Q_symbols, self.samples_per_symbol)t = np.arange(len(I_baseband))return b_baseband, I_baseband, Q_baseband, tdef generate_modulated_signals(self, I_baseband, Q_baseband, t):tt = t / self.fsI_wave = I_baseband * np.cos(2 * np.pi * self.fc * tt)Q_wave = Q_baseband * np.sin(2 * np.pi * self.fc * tt)qam_wave = I_wave + Q_wavereturn I_wave, Q_wave, qam_wavedef plot_waveforms(self, b_baseband, I_baseband, Q_baseband, I_wave, Q_wave, qam_wave, t, save_path=None, t_unit='index'):if t_unit == 'time':xlabel = "时间 (s)"bit_ticks = np.arange(0, len(b_baseband) + 1, self.samples_per_symbol // self.k) / self.fsbit_labels = [f"{tick:.2f}" for tick in bit_ticks]else:xlabel = "采样点编号"bit_ticks = np.arange(0, len(b_baseband) + 1, self.samples_per_symbol // self.k)bit_labels = [str(i) for i in range(len(bit_ticks))]fig, axs = plt.subplots(6, 1, figsize=(14, 12))plot_subplot(axs[0], t[:len(b_baseband)], b_baseband, f"{self.M}QAM - 原始比特流 b(t)", "b(t)", None, bit_ticks, bit_labels, 'steps-post')plot_subplot(axs[1], t, I_baseband, "I(t) 同相分量", "I(t)", 'orange', bit_ticks, bit_labels)plot_subplot(axs[2], t, Q_baseband, "Q(t) 正交分量", "Q(t)", 'green', bit_ticks, bit_labels)plot_subplot(axs[3], t, I_wave, r"I(t) $\cos(2\pi f_c t)$", "I(t)cos", 'red', bit_ticks, bit_labels)plot_subplot(axs[4], t, Q_wave, r"Q(t) $\sin(2\pi f_c t)$", "Q(t)sin", 'purple', bit_ticks, bit_labels)plot_subplot(axs[5], t, qam_wave, r"I(t)\cos(2\pi f_c t) + Q(t)\sin(2\pi f_c t)$ 合成波形", "QAM信号", 'blue', bit_ticks, bit_labels, xlabel=xlabel)plt.tight_layout()if save_path:plt.savefig(save_path, dpi=300, bbox_inches='tight')plt.show()def modulate_and_plot(self, num_bits=40, seed=0, save_path=None, t_unit='index'):bits = self.generate_random_bits(num_bits, seed)I_symbols, Q_symbols = self.bits_to_symbols(bits)b_baseband, I_baseband, Q_baseband, t = self.generate_baseband_signals(bits, I_symbols, Q_symbols)I_wave, Q_wave, qam_wave = self.generate_modulated_signals(I_baseband, Q_baseband, t)if t_unit == 'time':t_plot = t / self.fselse:t_plot = tself.plot_waveforms(b_baseband, I_baseband, Q_baseband, I_wave, Q_wave, qam_wave, t_plot, save_path, t_unit)return {'bits': bits,'I_symbols': I_symbols,'Q_symbols': Q_symbols,'b_baseband': b_baseband,'I_baseband': I_baseband,'Q_baseband': Q_baseband,'I_wave': I_wave,'Q_wave': Q_wave,'qam_wave': qam_wave,'t': t_plot}def quick_qam_demo(M=4, num_bits=40, seed=0, t_unit='time', fc=50, fs=1000, samples_per_symbol=40):modulator = QAMModulator(M=M, fc=fc, fs=fs, samples_per_symbol=samples_per_symbol)return modulator.modulate_and_plot(num_bits, seed, t_unit=t_unit)if __name__ == "__main__":# 示例:4QAM,40比特,随机种子0,采样率1000Hz,载波频率50Hz,时间轴为采样点编号,每个符号会被表示为 40 个采样点quick_qam_demo(M=4, num_bits=40, seed=0, t_unit='index', fc=50, fs=1000, samples_per_symbol=40) 

http://www.dtcms.com/a/284835.html

相关文章:

  • Jmeter 性能测试响应时间过长怎么办?
  • 使用 NVIDIA Triton推理服务器的好处
  • 嵌入式学习-PyTorch(6)-day23
  • CCLink IE转ModbusTCP网关配置无纸记录器(上篇)
  • 小程序按住说话
  • zlmediakit接入Onvif设备方案
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(二)
  • 嵌入式基础 -- ADC(模数转换器,Analog to Digital Converter)
  • 疯狂星期四文案网第10天运营日报
  • Kotlin自定义排序
  • AUTOSAR进阶图解==>AUTOSAR_SWS_EFXLibrary
  • Lotus-基于大模型的查询引擎 -开源学习整理
  • 打印文件/打印机队列 - 华为OD机试真题(Java 题解)
  • QT 交叉编译环境下,嵌入式设备显示字体大小和QT Creator 桌面显示不一致问题解决
  • 中国力学大会倒计时2天●千眼狼科学仪器在实验力学研究中应用
  • 状态机(State Machine)是什么?
  • 【秋招ready】
  • 网络初级安全第二次作业
  • css样式中的选择器和盒子模型
  • JoditEditor编辑与预览模式
  • 电碳表:精准计量每一度电的碳排放
  • Python--plist文件的读取
  • 使用CosyVoice-300M实现零样本语音克隆:Xinference部署与实战
  • nginx代理websocket请求
  • Android设备标识符详解:IMEI、ANDROID_ID与OAID
  • 产品经理如何绘制服务蓝图(Service Blueprint)
  • 企业级AI智能体架构落地:工程化能力设计的全景指南
  • docker重新搭建redis集群
  • ubuntu系统+N卡 | docker compose+ollama+dify
  • ACOUSLIC-AI挑战报告:基于低收入国家盲扫超声数据的胎儿腹围测量|文献速递-医学影像算法文献分享