📄 conv_demo.m
字号:
%clear all;
%clc;
tic
%(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 ]
ConvCodeGenPoly = [1 0 1 1 0 1 1;1 1 1 1 0 0 1 ];
codeRate=1/2;
%初始化Viterbi译码
global prev_state;
global prev_state_outbits;
prev_state = zeros(64, 2);
prev_state_outbits = zeros(64, 2, 2);
for state = 0:63
state_bits = de2bi(state, 6);
input_bit = state_bits(1);
for transition = 0:1
prev_state_bits = [state_bits(2:6) transition];
prev_state(state+1, transition+1) = bi2de(prev_state_bits);
%对应映射为0->-1 1->+1的bpsk调制
prev_state_outbits(state+1, transition+1, 1) = 2*(rem(sum(ConvCodeGenPoly(1,:).* ...
[input_bit prev_state_bits]),2)) - 1;
prev_state_outbits(state+1, transition+1, 2) = 2*(rem(sum(ConvCodeGenPoly(2,:).* ...
[input_bit prev_state_bits]),2)) - 1;
end
end
%单次仿真的信息长度
slen=64;
number_rows = size(ConvCodeGenPoly,1);
number_bits = size(ConvCodeGenPoly,2)+slen-1;
uncoded_bits = zeros(number_rows, number_bits);
%每种信噪比仿真迭代次数
simNum=1000;
%bpsk调制,每符号用1比特表示
k=1;
%信噪比矩阵,单位为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));
%卷积编码
for row=1:number_rows
uncoded_bits(row,:)=rem(conv(s,ConvCodeGenPoly(row,:)),2);
end
coded_bits=uncoded_bits(:)';
%bpsk调制,映射为0->-1 1->+1
bpsk_mod=coded_bits*2-1;
%接收信号为bpsk调制信号加上噪声
rx_waveform=awgn(bpsk_mod,SNR(snrloop),'measured');
%Viterbi译码
vtb_dec_out=rx_viterbi_decode(rx_waveform);
uhat=vtb_dec_out(1:slen);
%误码统计
[errNum errRat]=biterr(s,uhat);
totErr=errNum+totErr;
end
BER(snrloop)=totErr/simNum/slen;
end
result=[EbNo; SNR; BER]
save noInterleave_simNum1000_result result;
%绘制误码率曲线
semilogy(EbNo,BER,'m-');
title('Convolution coded bpsk simulation');
xlabel('Eb/No (dB)');
ylabel('BER');
legend('noInterleave Convolution BER',0);
grid on;
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -