1. 写在前面
首先题目强调的是“基带”,不是“频带”,即不需要加载波进行调制。(导师给我第一个实验就是实现BPSK的基带调制系统的抗噪声性能分析。我开始就是打开通信原理,根据本科所学进行加载波调制解调,当我完成时发现不对劲,是基带,基带,不是频带。于是又重新改code(思维固化很严重))
2. 数字基带传输系统框图
2.1 基带脉冲的产生
基带脉冲即二进制01随机序列,可用randn函数产生
1 2 | %%基带信号产生 data_source = round(rand(1,data_len)); % 二进制随机序列 |
data_len是数据长度(详细代码见后文)
图形如下:
2.2 BPSK信号形成
BPSK是双极性信号,即“1”表示正电平“+1”,“0”表示负电平“-1”
1 2 | %%BPSK基带调制 send_signal = (ham_code - 1/2) * 2; % 双极性不归零序列 |
2.3 高斯白噪声
高斯白噪声的产生可用awgn()函数或wgn函数均可,具体参数可以在MATLAB中help查看
1 | noise2 = sqrt(N0(z)/2) * randn(1,data_len); %高斯白噪声 |
2.4 基带解调
解调规则:接收到的信号大于0则判为1,小于0则判为0
1 2 3 4 5 6 7 8 | %BPSK基带解调 for w = 1:code_len if (receive_signal(w) >= 0) demod_signal(w) = 1; % 接收信号大于0 则判1 else demod_signal(w) = 0; % 接收信号小于0 则判0 end end |
2.5 计算误码率
仿真误码率 = 错误码元个数 / 总码元个数;
理论仿真误码率 =
;
1 2 3 4 5 6 7 8 9 | %统计码元错误个数 for w = 1:data_len if (decode_signal(w) ~= data_source(w)) error(q) = error(q) + 1; % 错误比特个数 end end %计算误码率 simu_ber_ham(q) = error(q)/data_len; theory_ber_BPSK(q) = qfunc(sqrt(2*SNR(q))); % 理论误比特率 |
3 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | clc clear close all; %%初始化参数设置 data_len = 100000; % 原始数据长度 SNR_dB = 0:10; % 信噪比 dB形式 SNR = 10.^(SNR_dB/10); % Eb/N0 Eb = 1; % 每比特能量 N0 = Eb./SNR ; %噪声功率 error2 = zeros(1,length(SNR_dB)); % 码元错误个数 simu_ber_BPSK = zeros(1,length(SNR_dB)); % 仿真误误码率 theory_ber_BPSK = zeros(1,length(SNR_dB)); % BPSK理论误码率 demod2_signal= zeros(1,data_len); % 解调信号 %%基带信号产生 data_source = round(rand(1,data_len)); % 二进制随机序列 %%BPSK基带调制 send_signal2 = (data_source - 1/2)*2; % 双极性不归零序列 %%高斯信道无编码 for z = 1:length(SNR_dB) noise2 = sqrt(N0(z)/2) * randn(1,data_len); %高斯白噪声 receive_signal2 = send_signal2 + noise2; demod_signal2 = zeros(1,data_len); for w = 1:data_len if (receive_signal2(w) > 0) demod_signal2(w) = 1; % 接收信号大于0 则判1 else demod_signal2(w) = 0; % 接收信号小于0 则判0 end end %统计错误码元个数 for w = 1:data_len if(demod_signal2(w) ~=data_source(w) ) error2(z) = error2(z) + 1; % 错误比特个数 end end %计算误码率 simu_ber_BPSK(z) = error2(z) / data_len; % 仿真误比特率 theory_ber_BPSK(z) = qfunc(sqrt(2*SNR(z))); % 理论误比特率 end %%二进制序列、基带信号图像 figure(1); stem(data_source); title("二进制随机序列"); axis([0,50,0,1]); figure(2); stem(send_signal2); title("BPSK基带调制--发送信号"); axis([0,50,-1.5,1.5]); figure(4); stem(noise2); title("高斯白噪声"); axis([0,50,-0.5,0.5]); figure(5) stem(receive_signal2); title("接收信号"); axis([0,50,-1.5,1.5]); figure(7) stem(demod_signal2); title("解调信号"); axis([0,50,0,1]); figure(8); semilogy(SNR_dB,simu_ber_BPSK,'M-X',SNR_dB,theory_ber_BPSK,'k-s'); grid on; axis([0 10 10^-5 10^-1]) xlabel('Eb/N0 (dB)'); ylabel('BER'); legend('BPSK仿真误码率','BPSK理论误码率'); %%画星座图 scatterplot(send_signal2); title('发送信号星座图'); scatterplot(receive_signal2); title('接收信号星座图'); scatterplot(demod_signal2); title('解码信号星座图'); |
简化版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | clc close all clear all snr_dB=1:10; %信噪比范围 snr = 10.^(snr_dB/10); %单位换算 delt_fa = 10.^(-snr_dB/10); %白噪声的方差 即噪声功率 delt = sqrt(delt_fa); %噪声幅值(强度) Pe = zeros(1,length(snr_dB)); %定义存放误码率的矩阵 for iter = 1:length(snr_dB) N = 100000; %二进制序列长度 fa_bit = randi([0 1],[1 N]); %bit stream 产生二进制随机序列,长度为N fa_key = randi([0 1],[1 N]); %密钥序列 fa_enc = bitxor(fa_bit,fa_key); %已加密钥序列 % m_s =2*fa_bit-1; %double polar m_s =2*fa_enc-1; %double polar 加密钥后的双极性序列(BPSK信号) me = mean(fa_key); %求均值 av = var(fa_key); %求方差 n =delt(iter)*(randn(1,N) + sqrt(-1)*randn(1,N))/sqrt(2); %复噪声 r = m_s + n; % BPSK信号加信道噪声 es_fa = sign(real(r)); %抽样判决 es_bit = (1+es_fa)/2; %二进制序列(解调) de_enc = bitxor(es_bit,fa_key); %解密 % Pb(iter) = sum(fa_bit~=es_bit)/N; Pe(iter) = sum(fa_bit~=de_enc)/N; %计算误码率 theory_Pe = erfc(sqrt(snr))/2; %计算理论误码率 end figure semilogy(snr_dB,Pe,'r-o',snr_dB,theory_Pe,'*-b');%画曲线 xlabel('信噪比SNR (dB) '); ylabel('误码率BER'); title('误码率曲线 SNR/10dB') legend('BPSK仿真误码率','BPSK理论误码率'); |