📄 vithard.m
字号:
%clear all;
%clc;
tic
%单次仿真的信息长度
slen=64;
%每种信噪比仿真迭代次数
simNum=1000;
%(2, 1, 7)卷积码生成多项式O(133, 171)
%(n, k, N)即1个信息比特生成2个编码比特,约束长度N为7比特
%O(133, 171)为用八进制表示的生成多项式,即[1 0 1 1 0 1 1;1 1 1 1 0 0 1 ]
constlen=[7];
codegen=[133 171];
tblen=64
t=poly2trellis(constlen,codegen);
%tnumInputSymbols=t.numInputSymbols
%tnumOutputSymbols=t.numOutputSymbols
%tnumStates=t.numStates
%tnextStates=t.nextStates
%toutputs=t.outputs
%bpsk调制,每符号用1比特表示
k=1;
%编码码率
codeRate=1/2;
%信噪比矩阵,单位为dB
EbNo=2:0.5:5;
SNR=EbNo-10*log10(1/codeRate)+10*log10(k);
%初始化BER矩阵
BER=zeros(1, length(SNR));
for snrloop=1:length(SNR)
disp(['EbNo(' num2str(snrloop) ')=' num2str(EbNo(snrloop))]);
%计算噪声方差σ^2(bpsk调制后信号均值为0,平均功率为1)
noise_var=1/(10^(SNR(snrloop)/10));
totErr=0;
for simcnt=1:simNum
% Set Random number generators initial state
% reset random number generators based on current clock value
rand('state',sum(100*clock));
randn('state',sum(100*clock));
%产生取值为0或1的均匀分布的随机序列作为信息序列
s=round(rand(1,slen));
%卷积编码
coded_bits=convenc(s,t);
%bpsk调制,映射为0->-1 1->+1
bpsk_mod=coded_bits*2-1;
%接收信号为bpsk调制信号加上噪声
rx_waveform=awgn(bpsk_mod,SNR(snrloop),'measured');
%硬判决
decided=double(rx_waveform>0);
%Viterbi译码
uhat=vitdec(decided,t,tblen,'trunc','hard');
%误码统计
[errNum errRat]=biterr(s,uhat);
totErr=errNum+totErr;
end
BER(snrloop)=totErr/simNum/slen;
end
result=[EbNo; SNR; BER]
save vithard_simNum1000_result result;
%绘制误码率曲线
semilogy(EbNo,BER,'m-');
title('Convolution coded bpsk simulation');
xlabel('Eb/No (dB)');
ylabel('BER');
legend('Viterbi hard decision',0);
grid on;
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -