📄 alamouti_bpsk.m
字号:
function BER = Alamouti_BPSK( num_trans, num_rx, SNR)
%计算BPSK调制方式下Alamouti编码的误比特率
%BER:误比特率;num_trans:发送的比特组数;
%num_rx:接收天线的个数;SNR:给定的信噪比
%
if (num_trans < 1) || (num_rx < 1) || (SNR < 0)
disp('参数错误');
return;
end;
num_biterr_total = 0; %总的误比特个数
for loop = 1 : num_trans
%产生信源
%S:2×2,sij:第i根发射天线在第j个slot发送的信号
S = zeros(2, 2);
seed = sign(randn(1, 2));
S(1, 1) = seed(1);
S(2, 1) = seed(2);
S(1, 2) = -conj(seed(2));
S(2, 2) = conj(seed(1));
%产生信道衰落系数
%H:2×num_rx,hij:第i根发射天线和第j根接收天线之间的衰落系数
H = zeros(2, num_rx);
A = randn(2, num_rx);
B = randn(2, num_rx);
H = complex(A, B);
H = H / sqrt(2); %信道矩阵归一化
%产生接收端AWGN
%N:2×num_rx,nij:第i个slot内第j根接收天线处的噪声
sigma = 2 * 10 ^ (-SNR / 10); %噪声的功率;因为有两根发射天线,每根发射天线的发射功率均为1,所以要乘以2
N = zeros(2, num_rx);
C = randn(2, num_rx);
D = randn(2, num_rx);
N = complex(C, D);
N = N / sqrt(2);
N = sqrt(sigma) * N; %噪声矩阵归一化,使其中每一个元素的功率=sigma
%接收信号
%产生接收矩阵:R:2×num_rx,rij:第i个slot内第j根接收天线接收到的信号
R = zeros(2, num_rx);
R = S' * H + N; %生成接收信号
%构造判决统计
X_kepa = zeros(2, 1); %最终判决统计结果
temp1 = zeros(1, num_rx);
temp2 = zeros(1, num_rx);
temp3 = zeros(1, num_rx);
temp4 = zeros(1, num_rx);
temp1 = R(1, :) .* conj(H(1, :));
temp2 = conj(R(2, :)) .* H(2, :);
temp3 = R(1, :) .* conj(H(2, :));
temp4 = conj(R(2, :)) .* H(1, :);
deposit1 = 0;
deposit2 = 0;
deposit3 = 0;
deposit4 = 0;
for subloop = 1 : num_rx
deposit1 = deposit1 + temp1(subloop);
deposit2 = deposit2 + temp2(subloop);
deposit3 = deposit3 + temp3(subloop);
deposit4 = deposit4 + temp4(subloop);
end
X_kepa(1, 1) = deposit1 + deposit2;
X_kepa(2, 1) = deposit3 - deposit4;
%进行最大似然译码
dist = zeros(2, 2); %距离矩阵
result = zeros(1, 2); %译码结果
dist(1, 1) = Eucl_Dist(X_kepa(1, 1), -1);
dist(1, 2) = Eucl_Dist(X_kepa(1, 1), 1);
dist(2, 1) = Eucl_Dist(X_kepa(2, 1), -1);
dist(2, 2) = Eucl_Dist(X_kepa(2, 1), 1);
if dist(1, 1) < dist(1, 2)
result(1) = -1;
else
result(1) = 1;
end;
if dist(2, 1) < dist(2, 2)
result(2) = -1;
else
result(2) = 1;
end;
%统计误比特个数
num_biterr_temp = 0;
if result(1) ~= S(1, 1)
num_biterr_temp = num_biterr_temp + 1;
end;
if result(2) ~= S(2, 1)
num_biterr_temp = num_biterr_temp + 1;
end;
num_biterr_total = num_biterr_total + num_biterr_temp;
end
%计算误比特率
BER = num_biterr_total / (num_trans * 2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -