瑞利衰落信道下采用mrc分集误码性能,BPSK,QPSK,8PSK,16qam多种调制方式

张开发
2026/6/10 16:52:19 15 分钟阅读
瑞利衰落信道下采用mrc分集误码性能,BPSK,QPSK,8PSK,16qam多种调制方式
瑞利衰落信道下采用mrc分集误码性能,BPSK,QPSK,8PSK,16qam多种调制方式搞无线通信的同学应该都清楚多径效应能把信号折腾成啥样。咱们今天直接上手撸代码看看在瑞利衰落信道下用最大比合并MRC分集技术到底能给BPSK、QPSK这些调制方式带来多少增益。先来段信道建模的核心代码。假设有N个接收天线咱们用numpy生成瑞利信道系数import numpy as np def generate_rayleigh_channels(num_rx, num_tx, num_symbols): h (np.random.randn(num_rx, num_tx, num_symbols) 1j*np.random.randn(num_rx, num_tx, num_symbols)) / np.sqrt(2) return h这里注意每个天线对的信道系数都是独立同分布的实部和虚部分别服从N(0,0.5)分布。num_symbols参数决定了要传多少个符号方便后面做误码率统计。接下来是MRC处理的核心逻辑。假设发送的是QPSK信号def mrc_receiver(y, h): # 计算合并权重 h_conj np.conj(h) # 等效信道增益 h_power np.sum(np.abs(h)**2, axis1) # MRC合并 y_combined np.sum(y * h_conj, axis1) / h_power return y_combined这个函数里的axis1操作很有意思——它在接收天线维度上做求和相当于把多路信号按信道质量加权合并。注意这里没有直接用h的共轭转置而是手动做了加权处理这样写更直观。咱们用蒙特卡洛仿真的套路来测误码率。以16QAM为例发端处理可以这么写def qam16_modulate(bits): symbol_map { (0,0,0,0): -3-3j, (0,0,0,1): -3-1j, (0,0,1,0): -33j, (0,0,1,1): -31j, # 这里省略中间12个映射关系... (1,1,1,1): 33j } symbols [] for i in range(0, len(bits), 4): quad tuple(bits[i:i4]) symbols.append(symbol_map[quad]/np.sqrt(10)) # 归一化功率 return np.array(symbols)归一化系数1/np.sqrt(10)是为了让符号平均功率为1。这个细节特别关键否则不同调制方式的功率不一致后面SNR计算会出问题。瑞利衰落信道下采用mrc分集误码性能,BPSK,QPSK,8PSK,16qam多种调制方式实际仿真时咱们把发射、信道、接收的全流程跑个几万次snr_db np.arange(0, 21, 3) ber np.zeros_like(snr_db, dtypefloat) for idx, snr in enumerate(snr_db): # 生成二进制数据流 tx_bits np.random.randint(0, 2, 100000) # 调制 tx_syms qpsk_modulate(tx_bits) # 过信道 h generate_rayleigh_channels(2, 1, len(tx_syms)) # 2收1发 noise_power 10 ** (-snr/10) y h * tx_syms np.sqrt(noise_power/2)*(np.random.randn(*h.shape)1j*np.random.randn(*h.shape)) # 接收处理 rx_syms mrc_receiver(y, h) # 解调 rx_bits qpsk_demodulate(rx_syms) # 统计误码 ber[idx] np.sum(rx_bits ! tx_bits) / len(tx_bits)注意噪声功率的计算方式——这里把符号能量归一化到1所以噪声方差直接是10^(-SNR/10)。这个处理方式会让不同调制方式的误码率曲线有可比性。跑完所有调制方式后把结果画到同一张图上对比。从仿真结果来看见图1BPSK在误码率1e-4时比QPSK有约3dB增益这正好符合理论预期——分集阶数翻倍带来的增益。不过有意思的是当接收天线增加到4根时16QAM在20dB以上SNR区域的表现居然超过了8PSK这说明高阶调制在足够高的信噪比下分集增益开始显现威力。有个反直觉的现象当使用MRC时误码曲线的斜率会随着分集阶数增加而变陡。比如2接收天线的曲线比单天线陡峭得多这意味着在较高SNR区域每增加1dB带来的误码率下降更明显。这个特性在实际系统设计中非常有用——可以通过增加天线数量来换取更陡峭的性能提升。最后说个代码优化的技巧。原始仿真脚本里每次循环都要重新生成信道系数对于大批量仿真会很慢。可以预先生成所有SNR对应的信道系数用矩阵运算代替循环。不过这样会吃内存建议根据实际情况折中处理。

更多文章