BPSK调制系统MATLAB仿真实现(1)

  • Post author:
  • Post category:其他






1. 写在前面

不加载波进行调制。



2. 数字基带传输系统框图

在这里插入图片描述



2.1 基带脉冲的产生

基带脉冲即二进制01随机序列,可用randn函数产生

%%基带信号产生
data_source = round(rand(1,data_len));  % 二进制随机序列

data_len是数据长度(详细代码见后文)

图形如下:

在这里插入图片描述



2.2 BPSK信号形成

BPSK是双极性信号,即“1”表示正电平“+1”,“0”表示负电平“-1”

%%BPSK基带调制
send_signal = (ham_code - 1/2) * 2;      % 双极性不归零序列

在这里插入图片描述



2.3 高斯白噪声

高斯白噪声的产生可用awgn()函数或wgn函数均可,具体参数可以在MATLAB中help查看

     noise2 = sqrt(N0(z)/2) * randn(1,data_len); %高斯白噪声

在这里插入图片描述



2.4 基带解调

解调规则:接收到的信号大于0则判为1,小于0则判为0

    %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 计算误码率

仿真误码率 = 错误码元个数 / 总码元个数;

理论仿真误码率 =
在这里插入图片描述

 %统计码元错误个数
    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 代码

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('解码信号星座图');


简化版

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理论误码率');





版权声明:本文为naturly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。