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

生成OFDM信号时,先得把数据映射到子载波上。128个子载波里实际用120个(掐头去尾防频谱泄露),用16QAM调制的话代码大概长这样

OFDM基于块状导频的信道估计算法仿真 本次仿真载频为2GHz,带宽1MHz,子载波数128个,cp为16 子载波间隔为7.8125kHz 一个ofdm符号长度为128us,cp长度为16us 采用16QAM调制方式 最大doppler频率为132Hz 多径信道为5径 导频符号间隔为10

import numpy as np bits = np.random.randint(0,2,120*4) # 每个符号4bit symbols = np.reshape(bits, (120,4)).dot([8,4,2,1]) # 转十进制 qam_table = np.array([-3-3j, -3-1j, -3+3j, -3+1j, -1-3j, -1-1j, -1+3j, -1+1j, 3-3j, 3-1j, 3+3j, 3+1j, 1-3j, 1-1j, 1+3j, 1+1j])/np.sqrt(10) tx_data = qam_table[symbols]

这里有个细节,16QAM的归一化系数1/√10是为了保证符号能量为1。不过实际仿真时有些人会偷懒不归一化,结果就是Eb/N0得重新换算。

导频插入采用块状结构,每隔10个子载波插一个。导频位置用PN序列更抗干扰,但这次直接用BPSK:

pilot_pos = np.arange(0, 128, 10) pilot_value = np.random.choice([1,-1], len(pilot_pos)) ofdm_symbol = np.zeros(128, dtype=complex) ofdm_symbol[pilot_pos] = pilot_value ofdm_symbol[1:-1] = tx_data # 避开直流和最高频

注意索引1到-2的位置用来放数据,避免直流分量和最高频子载波。这时候如果直接做IFFT会得到时域信号,但别忘加循环前缀:

time_signal = np.fft.ifft(ofdm_symbol) cp = time_signal[-16:] # 取最后16个样点作为CP tx_frame = np.concatenate([cp, time_signal])

CP长度16对应16us的保护间隔,对于最大时延扩展来说够不够?得看信道模型。这次用的是5径瑞利信道,最大时延设定在CP范围内就行。

重点来了,信道估计部分。接收端拿到信号后先去掉CP,做FFT:

rx_symbol = np.fft.fft(rx_time_signal)

接着在导频位置做LS估计:

H_pilot = rx_symbol[pilot_pos] / pilot_value

这时候得到的是离散点上的信道响应,需要插值出所有子载波的信道。线性插值虽然糙但速度快:

H_est = np.interp(np.arange(128), pilot_pos, H_pilot)

不过当多普勒频移达到132Hz时(相当于时速142km/h的移动速度),信道在时域上变化剧烈,可能需要更复杂的二维插值。但这次仿真假设信道在一个OFDM符号内基本不变。

OFDM基于块状导频的信道估计算法仿真 本次仿真载频为2GHz,带宽1MHz,子载波数128个,cp为16 子载波间隔为7.8125kHz 一个ofdm符号长度为128us,cp长度为16us 采用16QAM调制方式 最大doppler频率为132Hz 多径信道为5径 导频符号间隔为10

为了验证效果,拿估计出的信道做均衡:

eq_data = rx_symbol[1:-1] / H_est[1:-1]

这时候看星座图可能会发现相位旋转,因为多普勒还带来了载波频偏。不过仿真里没加频偏估计模块,所以得另外处理。

整个流程跑下来,误码率曲线在SNR=20dB时大概能到1e-3量级。但实际中要考虑导频开销——这次每10个子载波插一个导频,相当于12.8%的开销,属于典型值。如果想提升性能,可以加密导频间隔,但代价是有效数据速率下降。

有个坑要注意:多径信道的时延抽头必须对齐采样间隔。比如采样率1MHz对应1us的采样间隔,假设多径时延是[0, 2, 4, 7, 11]us,那么信道建模应该是:

channel_taps = np.random.randn(5) + 1j*np.random.randn(5) channel_taps /= np.linalg.norm(channel_taps) # 归一化功率 delay_samples = [0, 2, 4, 7, 11] # 对应时延

这样才能正确模拟时域卷积。不过实际仿真时为了省事,可能直接用现成的rayleighchan函数生成。

http://www.jsqmd.com/news/518792/

相关文章:

  • 论文炼狱通关秘籍:百考通AI如何用“人机协同”破局毕业季核心痛点
  • “Comsol中变压器绝缘油流注放电仿真及MIT飘逸扩散模型建立”的详细资料及学习笔记
  • 116基于Springcloud的智能社区服务系统-springboot+vue
  • 用Arduino串口绘图仪观察三角函数:手把手教你实现动态波形显示
  • Matlab遗传优化算法求解生鲜配送问题的路径优化与时间窗管理:考虑新鲜度与货损成本的解决方案...
  • 毕业季论文求生指南:如何用百考通AI一站式高效通关?
  • 基本matlab的最小二乘估计递推算法,生成M 序列,对参数估计值进行辨识,输出估计误差结果...
  • 百考通:积累可落地的项目经验,为求职与职业发展打下坚实基础
  • 光伏锂电池储能功率协调控制系统仿真探索
  • 基于华为eNSP的园区网防火墙高可靠与安全策略实战
  • LLC谐振变换器变频与移相混合控制 仿真模型采用混合控制,控制策略为:当输入电压较低时,采用变频控制
  • 手把手教你用CS5523替代IT6151:MIPI转EDP信号转换芯片的完整配置指南
  • 嵌入式开发避坑指南:如何快速定位Hard_Fault_Handler错误(附内存越界排查技巧)
  • Java笔记 —— 泛型
  • ABAQUS纤维复合材料热固化仿真:子粘弹性模型与内附CAE文件
  • 三电平逆变器实战:从SVPWM调制到中点平衡的硬核玩法
  • 从‘靶场‘到‘实战‘:把Pikachu漏洞环境搬上云服务器(阿里云/腾讯云实操)
  • 基于A*算法的往返式全覆盖路径规划的改进算法及MATLAB实现代码
  • 这个十行代码的观测器 凭什么让电机控制工程师直呼真香
  • Gemini 3 Pro技术深度拆解:原生多模态与MoE架构解析
  • 深入PX4 DataValidator:看懂传感器‘信任度’confidence是如何算出来的
  • 西门子828D数控系统及PLC全功能调试流程包:涵盖车床、加工中心、攻钻机、铣床设备
  • 【第三周】论文精读:Scaling Knowledge Graph Construction through Synthetic Data Generation and Distillation
  • 服务器带外管理实战:手把手教你用IPMI远程控制Dell iDRAC(附常见问题排查)
  • 2026年Gemini 3.1 Pro技术深度拆解:推理能力翻倍与国内直访方案
  • 多模态数据标注实战指南:5大高效工具与避坑策略(附Label Studio模板)
  • 半主动悬架搞起来比想象中有意思。最近在玩天棚阻尼控制的1/4车模型,这玩意儿对车身垂向加速度的控制效果确实有点东西。咱们直接上干货,先说说模型怎么搭的
  • 免费馅饼(dp模版1的变体
  • 基于CODESYS的ModbusTCP通信实战:从配置到FPGA集成
  • Java笔记 —— 值传递与“引用传递”