📄 main.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 + -