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

📄 main.m

📁 卷积码译码算法改进 实现Conv.(2,1,9)的编码、软判决滑动窗维特比译码
💻 M
字号:
SNR=0:0.5:5;     %信噪比SNR从0dB-5dB进行测试
for i=1:11       %设置循环使i从1到11,对应信噪比的11个值
    for j=1:10   %设置循环对每一个信噪比的值计算10次,然后作平均
        DATALENGTH=10^6;   %数据长度为10^6
        trel=poly2trellis(9,[561 753]);      %此函数的作用为建立卷积码(2,1,9)的网格图
        msg=randint(DATALENGTH,1);           %随机生成10^6个0,1(用10^6*1矩阵表示
        tblen=80;                            %译码深度为80
        encode=convenc(msg,trel,0);          %此函数的作用为进行卷积编码,括号里的0表示编码器从零状态开始
        I=randsrc(DATALENGTH*2,1,[0.5,0.5]); %从此行开始往后3行目的是为了进行bpsk调制(0变成-1,1变成+1)
        y=encode-I;
        bpsk=sign(y);
        out=awgn(bpsk,SNR(i));               %此函数的作用是对进行bpsk调制后的数据加上高斯白噪声(模拟加性高斯白噪声信道)
        debpsk=out*0.5+0.5;                  %对经过信道的数据进行解调
        [x,qcode]=quantiz(debpsk,[0 0.15 0.30 0.45 0.60 0.75 0.90],[0 1 2 3 4 5 6 7]);   %对解调后的数据进行量化(这是软判决维特比所要求的,也是与硬判决维特比不同之处) 
        decode= vitdec(qcode',trel,tblen,'cont','soft',3);                               %对量化后的数据进行维特比译码(括号中的3表示2^3=8,与量化级数相对应
        [errorbit,errorrate(j)] = biterr(decode(tblen+1:end),msg(1:end-tblen));          %计算一次循环的BER(存入相应的errorrate(j)中)
    end
    pingjunerrorrate(i)=sum(errorrate)/10;     %把每一个信噪比值进行10次循环后得到的BER进行平均,相应的得到11个平均BER
end
semilogy(SNR,pingjunerrorrate);                %对得到的11个值画图
xlabel('SNR=Eb/no');
ylabel('BER');
xlabel('SNR=Eb/no(dB)');
ylabel('BER');
grid on;
hold on;
%以下是对上述程序的重复,只不过译码深度有所改变,从而可以在一张图上对比不同译码深度维特比译码性能
%以下是译码深度为50的情况
SNR=0:0.5:5;
for i=1:11
    for j=1:10
        DATALENGTH=10^6;
        trel=poly2trellis(9,[561 753]); 
        msg=randint(DATALENGTH,1); 
        tblen=50; 
        encode=convenc(msg,trel,0);
        I=randsrc(DATALENGTH*2,1,[0.5,0.5]);
        y=encode-I;
        bpsk=sign(y);
        out=awgn(bpsk,SNR(i));
        debpsk=out*0.5+0.5;
        [x,qcode]=quantiz(debpsk,[0 0.15 0.30 0.45 0.60 0.75 0.90],[0 1 2 3 4 5 6 7]); 
        decode= vitdec(qcode',trel,tblen,'cont','soft',3);
        [errorbit,errorrate(j)] = biterr(decode(tblen+1:end),msg(1:end-tblen));
    end
    pingjunerrorrate(i)=sum(errorrate)/10;
end
semilogy(SNR,pingjunerrorrate,'r');
xlabel('SNR=Eb/no(dB)');
ylabel('BER');
grid on;
%以下是译码深度为20的情况
SNR=0:0.5:5;
for i=1:11
    for j=1:10
        DATALENGTH=10^6;
        trel=poly2trellis(9,[561 753]); 
        msg=randint(DATALENGTH,1); 
        tblen=20; 
        encode=convenc(msg,trel,0);
        I=randsrc(DATALENGTH*2,1,[0.5,0.5]);
        y=encode-I;
        bpsk=sign(y);
        out=awgn(bpsk,SNR(i));
        debpsk=out*0.5+0.5;
        [x,qcode]=quantiz(debpsk,[0 0.15 0.30 0.45 0.60 0.75 0.90],[0 1 2 3 4 5 6 7]); 
        decode= vitdec(qcode',trel,tblen,'cont','soft',3);
        [errorbit,errorrate(j)] = biterr(decode(tblen+1:end),msg(1:end-tblen));
    end
    pingjunerrorrate(i)=sum(errorrate)/10;
end
semilogy(SNR,pingjunerrorrate,'y');
xlabel('SNR=Eb/no(dB)');
ylabel('BER');
grid on;

⌨️ 快捷键说明

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