下面是有关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个码元实验)