Bootstrap

BPSK调制与解调仿真

下面是有关BPSK调制与解调仿真的相关代码部分。

BPSK调制代码:BPSK.m

function [tranMessage] = BPSK(DigitialMessage,f,B)
%这是有关BPSK的调制函数,其中输入参数“DigitialMessage”为扩频序列,
%“f”为载波调制频率,“B”为符号波特率,输出"tranMessage"为已调制信号。


    ts = 0.000001;       %抽样时间间隔;
    T = 1/B;            %符号周期;
    t = ts:ts:1;         %生成时间向量;
    fc = f;             %载波频率;
    tranMessage = [];                            %创建调制信号向量;
    N = round(T/ts);                             %一个码元符号对应的载波抽样点数;

    for n = 1:length(DigitialMessage)            %创建计数变量n并进行BPSK调制;
        if DigitialMessage(n) == 0
            carrier = cos(2*pi*fc*t(((n-1)*(N) + 1):n * (N))+ pi);       %创建载波,码元“0”对应相位“Π”;
        else
            carrier = cos(2*pi*fc*t(((n-1)*(N) + 1):n * (N)));            %创建载波,码元“1”对应相位“0”;
        end
        tranMessage = [tranMessage carrier];     %输出已调信号;
    end
end

BPSK 解调代码    deBPSK.m

function [Message] = deBPSK(tranMessage, B, f)
%本函数是BPSK的解调函数,其中“tranMessage”为未解调信号,“B”是码元波特率;“f”是载波频率;
%输出是解调后的信号“Message”;


    ts = 0.000001;       %抽样时间间隔;
    T = 1/B;            %符号周期;
    t = ts:ts:1;         %生成时间向量;
    fc = f;             %载波频率;
    carrier = cos(2*pi*fc*t);  %生成解调载波;
    Message = [];              %生成输出信号向量;

    N = round(T/ts);           %一个码元符号对应的载波抽样点数;
    


    tranMessage = tranMessage .* carrier;      %进行解调;


    for i = 1:N:length(tranMessage)     %抽样判决,信号大于0量化为1,小于0量化为0;
        if(tranMessage(i) > 0)
            c = 1;
        else
            c = 0;
        end
        Message = [Message, c];                %输出信号;
    end

end

BPSK 通信系统仿真代码   Communication_BPSK.m

function [SER, outmessage] = Communication_BPSK(message, SNR, T, fc)
%本函数为BPSK不扩频的函数,其中输入“message”为信号码元,“SNR”为信噪比;
%“T”为码元周期,“fc”为载波频率, ;

    P_Noise = 10^((-1)*SNR/10);     %噪声功率;
    

    tranmessage = BPSK(message, fc, 1/T);
    
    
    Noise = sqrt(P_Noise) * randn(1, length(tranmessage));  %添加噪声;
    
    
    tranmessage_f = fft(tranmessage);
    
    figure(10);
    plot(abs(tranmessage_f));
    title("未加干扰信号后BPSK的不扩频信号频谱图");
    xlabel("频率/Hz");
    ylabel("频谱幅度");
    
    
    tranmessage = tranmessage + Noise;
    
    
    tranmessage_f = fft(tranmessage);
    figure(11);
    plot(abs(tranmessage_f));
    title("加干扰信号后BPSK的不扩频信号频谱图");
    xlabel("频率/Hz");
    ylabel("频谱幅度");
    
    
    outmessage = deBPSK(tranmessage, 1/T, fc);
    tranmessage_f = fft(outmessage);
   
    
    figure(12);
    plot(abs(tranmessage_f));
    title("加干扰信号解调后BPSK的不扩频信号频谱图");
    xlabel("频率/Hz");
    ylabel("频谱幅度");
    
    
    

count = 0;
for i = 1:length(message)             %计算误码率;
        if message(i) == outmessage(i)
            count = count + 1;
        end
    end
    str = "%";
    SER = 100 - count/length(message) * 100;
    fprintf("误码率等于 %f",SER);
    fprintf("%s\n", str);
end

主函数代码

message = randi([0 1],1,2000);   %随机生成信息码元;
SNR = 15;                         %信噪比;
T = 1/length(message);           %波特率;
fc = 200000;                     %载波频率;
temp = Communication_BPSK(message, SNR, T, fc); %模拟BPSK通信系统;

最后仿真信号频谱结果图如下(载波频率为200000Hz):

 

 

 误码率结果(用2000个码元实验)

;