⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conv_demo.m

📁 关于
💻 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);

%交织样式
intlvr_patt=randperm(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(:)';

        %交织
        intlved_bits(intlvr_patt)=coded_bits;

        %bpsk调制,映射为0->-1 1->+1
        bpsk_mod=intlved_bits*2-1;

        %接收信号为bpsk调制信号加上噪声
        rx_waveform=awgn(bpsk_mod,SNR(snrloop),'measured');

        %解交织
        deintlved_bits=rx_waveform(intlvr_patt);

        %Viterbi译码
        vtb_dec_out=rx_viterbi_decode(deintlved_bits);
        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 Interleave_simNum1000_result result;

%绘制误码率曲线
semilogy(EbNo,BER,'m-');
title('Convolution coded bpsk simulation');
xlabel('Eb/No (dB)');
ylabel('BER');
legend('Interleaved Convolution BER',0);
grid on;

toc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -