打开MATLAB的脚本编辑器,咱们直接撸代码搞个2PSK仿真。先别急着调参数,从生成二进制基带信号开始
基于matlab的2PSK调制与解调系统仿真说明文档and仿真源文件% 生成随机二进制序列 bitLength 1000; % 别太小否则误码率统计不准 bitStream randi([0 1], 1, bitLength); Ts 1e-6; % 符号周期比载波周期大才有区分度 fs 20e6; % 采样率得是载波频率5倍以上 t 0:1/fs:Ts-1/fs;这里有个坑采样率不够会导致波形畸变。比如载波频率要是2MHz采样率至少得10MHz。接下来调制部分% 2PSK调制 fc 2e6; % 载波频率 carrier cos(2*pi*fc*t); modulated []; % 预分配内存能加速 for k 1:bitLength phase pi*(bitStream(k)-0.5)*2; % 0对应0相位1对应π相位 modulated [modulated cos(2*pi*fc*t phase)]; end注意相位映射这里用了(bit-0.5)2π的骚操作比if-else判断更简洁。不过实际调试时发现直接用bitStreampi会导致0相位和π相位交替效果一样但代码更短。加噪声是必须的用awgn函数最方便% 添加高斯白噪声 SNR_dB 10; % 试试调这个值看误码率变化 rxSignal awgn(modulated, SNR_dB, measured);解调部分的关键是相干解调本地载波必须同频同相% 相干解调 demodSignal rxSignal .* repmat(carrier, 1, bitLength); % 低通滤波 [b,a] butter(6, 0.1); % 6阶巴特沃斯滤波器 filtered filtfilt(b, a, demodSignal);这里有个魔鬼细节filtfilt函数实现零相位滤波避免信号时移。但滤波器截止频率得根据符号速率调整0.1对应归一化频率实际是fs*0.1/21MHz。基于matlab的2PSK调制与解调系统仿真说明文档and仿真源文件抽样判决用积分清除法更准% 抽样判决 samples filtered(length(t)/2:length(t):end); % 每个符号中间点采样 decodedBits (samples 0); % 正电压判为1最后算误码率别用循环直接矩阵运算% 计算误码率 errorRate sum(bitStream ~ decodedBits) / bitLength; disp([误码率: , num2str(errorRate)]);跑起来发现当SNR10dB时误码率约0.8%和理论值基本吻合。但如果把载波频偏调大1kHz误码率直接飙到40%——说明载波同步有多重要。完整仿真文件里还藏着几个彩蛋用comm.PSKModulator对象实现更专业的调制眼图生成模块eyediagram函数滑动相关器实现载波同步实际工程中还得考虑定时同步、匹配滤波但课程实验级别的仿真这些已经够用。代码打包时记得把滤波器系数保存成.mat文件不然换电脑运行时可能报错。