实现QPSK调制,通过瑞利信道和高斯信道,计算其误码率,并进行比较。 星座图,误比率对比,或者对ASK,FSK,DPSK等各种误码率对比计算。
import numpy as np import matplotlib.pyplot as plt symbols = np.array([1+1j, -1+1j, -1-1j, 1-1j])/np.sqrt(2) # 归一化能量 plt.scatter(np.real(symbols), np.imag(symbols), marker='x') plt.title('QPSK Constellation') plt.grid(True) plt.axhline(0, color='black'); plt.axvline(0, color='black') plt.show()这个星座图像极了四个角上的忍者镖,每个点对应两个比特。比如(1,1)对应00,(-1,1)对应01...注意这里用了能量归一化,防止发射功率超标。
接下来造个简易版QPSK发射机:
def qpsk_mod(bit_stream): # 比特配对 paired_bits = bit_stream.reshape(-1, 2) # 映射星座点 symbol_indices = np.packbits(paired_bits, axis=1).flatten() return symbols[symbol_indices]这里有个骚操作:用np.packbits把两两比特转换成0-3的整数索引。比如[0,1]组合转换成十进制的1,对应symbols数组的第二个元素。
重点来了——信道模拟。先看高斯白噪声信道(AWGN),简单粗暴加噪声:
def awgn_channel(signal, snr_db): snr = 10 ** (snr_db / 10) noise_power = 1 / snr # 符号能量归一化为1 noise = np.sqrt(noise_power/2) * (np.random.randn(*signal.shape) + 1j*np.random.randn(*signal.shape)) return signal + noise这里噪声方差计算容易踩坑,复数噪声要拆分成实虚部独立的高斯分布,且总功率要除以2。比如当SNR=10dB时,噪声方差应该是0.1/2=0.05。
瑞利信道更刺激,相当于信号被随机镜子反射:
def rayleigh_channel(signal, snr_db): h = (np.random.randn() + 1j*np.random.randn())/np.sqrt(2) # 复高斯衰减 noisy_signal = awgn_channel(signal * h, snr_db) return noisy_signal, h注意信道系数h的方差要归一化,否则平均功率会爆炸。接收端需要信道估计,这里假设理想信道信息已知。
误码率测试脚本走起:
num_bits = 10**6 snr_range = np.arange(0, 15) ber_awgn = [] ber_rayleigh = [] for snr in snr_range: bits = np.random.randint(0, 2, num_bits) tx_signal = qpsk_mod(bits) # AWGN信道 rx_awgn = awgn_channel(tx_signal, snr) # 瑞利信道 rx_rayleigh, h = rayleigh_channel(tx_signal, snr) # 解调过程省略... # 这里假设完美解调后得到的ber_awgn_val和ber_rayleigh_val ber_awgn.append(ber_awgn_val) ber_rayleigh.append(ber_rayleigh_val) plt.semilogy(snr_range, ber_awgn, 'o-', label='AWGN') plt.semilogy(snr_range, ber_rayleigh, 's-', label='Rayleigh') plt.xlabel('SNR(dB)'); plt.ylabel('BER') plt.legend(); plt.grid()实测发现瑞利信道下误码率曲线像滑梯,比AWGN差个十几dB。原因很简单——深衰落发生时,信号直接掉进噪声坑里爬不出来。
顺手对比其他调制方式,用理论公式更省事:
- BPSK: \(0.5 \text{erfc}(\sqrt{\text{SNR}})\)
- QPSK: \(0.5 \text{erfc}(\sqrt{\text{SNR}/2})\)
- 16QAM: \(0.75 \text{erfc}(\sqrt{\text{SNR}/10})\)
画在同一坐标系里会发现,QPSK比BPSK频谱效率翻倍,但代价是多花3dB功率。16QAM更吃信号质量,适合土豪频段。
最后留个思考题:为什么实际系统中QPSK用得比BPSK多?答案藏在那句"频谱效率翻倍"里——在带宽紧缺的通信世界,省带宽可比省功率划算多了。