无线通信信道编码matlab仿真.docx
《无线通信信道编码matlab仿真.docx》由会员分享,可在线阅读,更多相关《无线通信信道编码matlab仿真.docx(16页珍藏版)》请在冰豆网上搜索。
无线通信信道编码matlab仿真
现给出循环码及卷积码的编解码程序,理解各程序,完成以下习题。
将程序运行结果及各题目的解答写入word中:
1.用matlab运行书上习题中的“clockcode.m”
(a)说明(7,4)码的纠错检错方法
(b)在程序中标注“注释”处加上注释(英文或中文)
(c)对于编码和未编码的情况,误比特率为1e-2、1e-3及1e-4时的Eb/N0分别是多少?
(d)从物理意义上说明编码增益问题
(e)当采用(15,11)码时,观察与(7,4)码相比编码增益的变化。
解:
clockcode.m程序运行结果如下:
(a)纠错方法:
首先将接收且进行判决过后的值进行分组,每7个二进制码为一组,视为一个向量。
用这一向量乘以一致校验矩阵H,得到生成伴随式矢量s。
若s=0,则认认为没有错,直接输出。
若s与HT的某一列相同,即有着相同的错误图样,则将收到的该位取反(即进行模二加),进行纠错,将纠错后的结果输出。
(b)clockcode.m程序:
data1=rand(1,nd)>0.5;%注释:
产生信源数据
x=encode(data1);%%注释:
对信源数据进行信道编码
sigma=E/sqrt(2*SNR);%注释:
能量归一化
sigma1=E/sqrt(2*SNR*code_rate);%注释:
能量归一化
data2(i)=-E+Gngauss(sigma);%注释:
对未编码的信号进行BPSK调制,同时加入加性高斯白噪声
data2(i)=E+Gngauss(sigma);%注释:
对未编码的信号进行BPSK调制,同时加入加性高斯白噪声
data3(i)=-E+Gngauss(sigma1);%注释:
对编码后的信号进行BPSK调制,同时加入加性高斯白噪声
data3(i)=E+Gngauss(sigma1);%注释:
对编码后的信号进行BPSK调制,同时加入加性高斯白噪声
demodata1=data2>0;%注释:
过零比较判决,大于零判为1码,反之判为0码
noe2=sum(abs(data1-demodata1));%注释:
统计误码个数
nod2=length(data1);%注释:
统计发送的码的个数
ber(snr_num)=noe/nod;%注释:
误码率=误码个数/发送个数
encode.m程序:
temp=data1(4*i-3:
4*i);%注释:
从data1(信源)中取数,每次取4个
cyctemp=temp*G;%注释:
结合下一条语句完成对4位二进制数的编码
cyctemp=mod(cyctemp,2);%注释:
结合上一条语句完成对4位二进制数的编码;前一条完成了x=uG,本条将生成的x变成二进制的结果
encode(7*i-6:
7*i)=cyctemp;%注释:
将编出的7位码存放到输出数组中
decode.m程序:
temp=x(7*j-6:
7*j);%注释:
从待译码的序列中取出7个数
s=temp*Ht;%注释:
利用一致校验矩阵生成生成伴随式矢量
if(s==Ht(k,:
))%注释:
若S和Ht中的某一行相同,即有着相同的“错误图样”
temp(k)=mod(temp(k)+1,2);%注释:
就将收到的某一位进行模2加,进行纠错。
decode(1,4*i-3:
4*i)=decode1(1,7*i-6:
7*i-3);%注释:
将完成译码的值输出
(c)将Eb/N0总结如下表
Eb/N0(dB)
未编码
经过编码
1e-2
4.3
4.5
1e-3
6.5
6.8
1e-4
8.3
8.2
(d)
如下图:
图中的Gcode即为编码增益,它表示了在相同的误码率下,经过编码的信息需要更低的信噪比就可以被正确的接收。
相比于没有编码的情况,接收端相当于获得了Gcode这样一个数量的增益。
(e)
2.针对题目1中的clockcode.m,
(a)若信道使信号幅度呈瑞利衰落,画出编码与未编码的Eb/N0---误比特率曲线,说明与题目1观察结果的异同,并说明原因。
(b)若信道使信号幅度呈莱斯衰落,画出编码与未编码的Eb/N0---误比特率曲线,更改K值的大小,观察曲线的现象,能得出什么结论。
解:
(a)改写clockcode.m程序,另存为clockcode_reyleigh.m。
主程序中将高斯信道的部分改为如下的瑞利信道:
fori=1:
nd
n=1/sqrt
(2)*[randn(1,nd)+1j*randn(1,nd)];
h=1/sqrt
(2)*[randn(1,nd)+1j*randn(1,nd)];%Rayleighchannel
if(data1(i)==0),
data2(i)=-E.*h(i)+sigma.*n(i);%注释:
对未编码的信号进行BPSK调制,同时通过瑞利信道
data2(i)=data2(i)./h(i);
else
data2(i)=E.*h(i)+sigma.*n(i);%注释:
对未编码的信号进行BPSK调制,同时通过瑞利信道
data2(i)=data2(i)./h(i);
end;
end;
n=zeros(1,nd);
h=n;%清空h与n
fori=1:
length(x)
n=1/sqrt
(2)*[randn(1,i)+1j*randn(1,i)];
h=1/sqrt
(2)*[randn(1,i)+1j*randn(1,i)];%Rayleighchannel
if(x(i)==0),
data3(i)=-E.*h(i)+sigma.*n(i);%注释:
对编码后的信号进行BPSK调制,同时通过瑞利信道
data3(i)=data3(i)./h(i);
else
data3(i)=E.*h(i)+sigma.*n(i);%注释:
对编码后的信号进行BPSK调制,同时通过瑞利信道
data3(i)=data3(i)./h(i);
end;
end;
仿真结果如下(k=10)
K=5时:
K=20时:
可以得到两点结论:
(1)和高斯信道相比,经历瑞利衰落的信道在相同的信噪比下误码率会高很多。
(2)和高斯信道相比,经历瑞利衰落的信道经过编码会获得更高的编码增益。
(b)改写clockcode.m程序,另存为clockcode_rician.m。
主程序中将高斯信道的部分改为如下的瑞利信道:
n=1/sqrt
(2)*[randn(1,nd)+1j*randn(1,nd)];
h=1/sqrt
(2)*[randn(1,nd)+1j*randn(1,nd)];%Rayleighchannel
h1=sqrt(K/(K+1))+sqrt(1/(K+1)).*h;
fori=1:
nd
if(data1(i)==0),
data2(i)=-E.*h1(i)+sigma.*n(i);%注释:
对未编码的信号进行BPSK调制,同时经历赖斯信道
data2
(1)=data2
(1)./h1(i);
else
data2(i)=E.*h1(i)+sigma.*n(i);%注释:
对未编码的信号进行BPSK调制,同时经历赖斯信道
data2
(1)=data2
(1)./h1(i);
end;
end;
n=1/sqrt
(2)*[randn(1,length(x))+1j*randn(1,length(x))];
h=1/sqrt
(2)*[randn(1,length(x))+1j*randn(1,length(x))];%Rayleighchannel
h1=sqrt(K/(K+1))+sqrt(1/(K+1)).*h;
fori=1:
length(x)
if(x(i)==0),
data3(i)=-E.*h1(i)+sigma.*n(i);%注释:
对编码后的信号进行BPSK调制,同时经历赖斯信道
data3(i)=data3(i)./h1(i);
else
data3(i)=E.*h1(i)+sigma.*n(i);%注释:
对编码后的信号进行BPSK调制,同时经历赖斯信道
data3(i)=data3(i)./h1(i);
end;
end;
仿真结果如下:
可以发现,与瑞利信道相比,在信噪比下,赖斯信道中的误码率更低,这是因为在赖斯信道中存在一个直射分量(本例中,K=10)。
同时,与瑞利信道类似的,经历赖斯信道的通信经过编码后也会获得更高的编码增益。
3.bpskh.m为(2,1,7)卷积码采用硬判决译码时在AWGN中的误比特性能的仿真主程序,用matlab运行主程序bpskh.m,将运行结果写入word文档中,并回答以下问题(tblen为回溯长度):
(a)在标识注释处注释(中文或英文)
(b)在误比特率Pb=10-5处,硬判决的编码增益(与未编码比较)
(c)详细的解释以下函数(包括函数用法,意义,参数设置等方面)
◆trellis=poly2trellis(constlen,codegen)
◆expVitBER=bercoding(EbNo,'conv','hard',codeRate,dspec)、msg_rx=awgn(msg_tx,EsN0-10*log10(1/codeRate))
◆hMod=modem.pskmod('M',M,'PhaseOffset',pi/4,'SymbolOrder','Gray','InputType','Bit')
◆msg_tx=modulate(hMod,msg_enc)
◆hDemod=modem.pskdemod('M',M,'PhaseOffset',pi/4,'SymbolOrder','Gray','OutputType','Bit')
◆msg_demod=demodulate(hDemod,msg_rx);
(d)要保证性能没有显著下降,tblen至少应为多少;
解:
程序运行结果如下图:
(a)
trellis=poly2trellis(constlen,codegen);%注释:
生成一个包含有编码器信息结构体
dspec=distspec(trellis,7);%注释:
由上一语句的结果计算编码器的最小距离等信息,同样也会生成一个结构体depec
expVitBER=bercoding(EbNo,'conv','hard',codeRate,dspec);%注释:
得到在Eb/No的信噪比下,采用卷积码编码,硬判决,在加性高斯白噪声信道中
%的误码率的上界或者是估计值。
rand('state',seed
(1));randn('state',seed
(2));%注释:
使用种子数生成一个均匀分布的随机数,一个正态分布的随机数
msg_enc=convenc(msg_orig,trellis);%注释:
将信源序列进行卷积码的编码,编码器的参数由第二个函数参数trellis决定。
hMod=modem.pskmod('M',M,'PhaseOffset',0,...
'SymbolOrder','Gray','InputType','Bit');%注释:
生成一个调制的“模型”hMod,该模型可供后面的modulate函数调用。
%具体的,生成模型为二进制的,不带相位偏
%移,符号顺序采用格雷码,输入按照比特来
%处理的PSK调制器
msg_tx=modulate(hMod,msg_enc);%注释:
对卷积码编码后的序列进行PSK调制。
msg_rx=awgn(msg_tx,EsN0-10*log10(1/codeRate));%注释:
对调制后的信号加入高斯白噪声。
hDemod=modem.pskdemod('M',M,'PhaseOffset',0,...
'SymbolOrder','Gray','OutputType','Bit');%注释:
:
生成一个解调的“模型”hDemod,该模型可供后面的modulate函数调用。
%具体的,生成一个二进制的,不带相位偏移
%,符号顺序采用格雷码,输入按照比特来处
%理的PSK解调器。
msg_demod=demodulate(hDemod,msg_rx);%注释:
用hDemod对收到的信号msg_rx解调。
msg_dec=vitdec(msg_demod,trellis,tblen,'cont','hard');%注释:
对解调的信号进行维特比硬译码
BE_count(i)=length(find(msg_orig(1:
end-tblen)~=msg_dec(1+tblen:
end)));%注释:
统计误码
BE_rate_count(i)=BE_count(i)/numSymb;%注释:
计算误码率
(b)由于程序中未编码的情况下无法达到10-5的误码率,故仅能观察到在10-4情况下的编码增益,在10-4情况下,可以获得大约2.5dB的编码增益。
(c)函数解释:
◆trellis=poly2trellis(constlen,codegen)函数将用于描述卷积码的多项式转化成为。
●输入参数:
constlen:
约束长度,说明了编码器内存储的信息的长度,这个长度包含了当前的输入比特
codegen:
成为卷积码的生成多项式,描述了卷积码编码器的输入输出关系,该参数为八进制。
●输出参数:
该函数返回一个结构体(该例中结构体名称为trellis),结构体中描述了编码器的输入参数的个数,输出参数的个数,可能有的状态数,当前状态-下一个状态的组合,当前状态-当前输入的组合。
●本例中,通过实际编码器的参数我们可以得知该编码器的结构为:
◆expVitBER=bercoding(EbNo,'conv','hard',codeRate,dspec)、msg_rx=awgn(msg_tx,EsN0-10*log10(1/codeRate))函数返回了在使用PSK调制的二进制卷积码在加性高斯白噪声信道中指定的信噪比下传输的误码率的上限或者是估计值。
●输入参数:
EbNo以dB形式表示的信噪比
‘conv’表明使用的是卷积码
‘hard’表示使用硬判决
codeRate为卷积码的码率
dspec是一个结构体,其中包含了码的距离等信息
◆hMod=modem.pskmod('M',M,'PhaseOffset',pi/4,'SymbolOrder','Gray','InputType','Bit')此函数生成一个调制器的模型,该模型可以被modulate函数调用。
●输入参数:
'M',M,设定了调制的进制,M值在程序中设定为2,设定的调制器为二进制调制
'PhaseOffset',pi/4:
调制器的星座图有Pi/4的相位偏移。
'SymbolOrder','Gray':
符号顺序采用格雷码
'InputType','Bit':
调制器的输入是按照比特来处理的。
◆msg_tx=modulate(hMod,msg_enc)将msg_enc按照hMod模型的参数进行调制。
●输入参数hMod:
为一个调制器的模型,由上一条语句“uhMod=modem.pskmod……”生成
msg_enc:
待调制的基带信号,对于一路信号,需要的是一个列向量。
◆hDemod=modem.pskdemod('M',M,'PhaseOffset',pi/4,'SymbolOrder','Gray','OutputType','Bit')此函数生成一个PSK解调器的模型,该模型可以被modulate函数调用。
●输入参数:
'M',M,设定了解调的进制,M值在程序中设定为2,设定的调制器为二进制调制
'PhaseOffset',pi/4:
解调器的星座图有Pi/4的相位偏移。
'SymbolOrder','Gray':
符号顺序采用格雷码
'InputType','Bit':
解调器的输入是按照比特来处理的。
◆msg_demod=demodulate(hDemod,msg_rx);将msg_rx按照hDemod模型中给出的参数进行解调。
●输入参数msg_rx:
待解调的列向量。
hDemod:
解调器模型。
(d)tblen=16的情况:
可以看到仿真结果与理论值有着较大偏移。
tblen=24时:
tblen=20:
故需要回溯长度tblen至少为24。
4.bpsks.m为(2,1,7)卷积码采用软判决译码时在AWGN中的误比特性能的仿真主程序,用matlab运行主程序bpsks.m,将运行结果写入word文档中,并回答以下问题(tblen为回溯长度):
(a)在标识注释处注释(中文或英文)
(b)在SNR=4dB时,要保证仿真精度,大概需要至少仿真多少个码字?
(c)在误比特率Pb=10-5处,2比特软判决的编码增益(与未编码比较)?
(d)在误比特率Pb=10-5处,3比特软判决的编码增益(与未编码比较)?
解:
程序运行结果:
(a)程序注释如下:
trellis=poly2trellis(constlen,codegen);%注释:
生成一个包含有编码器信息结构体
dspec=distspec(trellis,7);%注释:
由上一语句的结果计算编码器的最小距离等信息,同样也会生成一个结构体depec
expVitBER=bercoding(EbNo,'conv','soft',codeRate,dspec);%注释:
%注释:
得到在Eb/No的信噪比下,采用卷积码编码,软判决,在加性高斯白噪声信道中的误码率的上界或者是估计值。
rand('state',seed
(1));randn('state',seed
(2));%注释:
使用种子数生成一个均匀分布的随机数,一个正态分布的随机数
msg_orig=randi([01],numSymb,1);%注释:
生成信源,一个列向量。
msg_enc=convenc(msg_orig,trellis);%注释:
使用trellis对信源进行卷积码的编码。
hMod=modem.pskmod('M',M,'PhaseOffset',0,...
'SymbolOrder','Gray','InputType','Bit');%注释:
生成一个调制的“模型”hMod,该模型可供后面的modulate函数调用。
具体的,生成模型为二进制的,不带相位偏,符号顺序采用格雷码,输入按照比特来处理的PSK调制器
msg_tx=modulate(hMod,msg_enc);%注释:
进行调制
msg_rx=-awgn(msg_tx,EsN0-10*log10(1/codeRate));%注释:
加入噪声
hDemod=modem.pskdemod('M',M,'PhaseOffset',0,...
'SymbolOrder','Gray','OutputType','Bit');%注释:
生成解调模型
msg_demod=real(msg_rx);%注释:
取出接收数据的实部用于下一步量化
msg_dec=vitdec(qcode,trellis,tblen,'cont','soft',3);%注释:
用解调器模型对接收数据进行软译码,3bit软判决。
BE_count(i)=length(find(msg_orig(1:
end-tblen)~=msg_dec(1+tblen:
end)));%注释:
统计误码
(b)仿真码字长度设置为1e5的时候,仿真结果如下
可见需1e5个码字的仿真就可以较为准确的仿真出SNR=4dB的时候的情形
(c)由于在所设定的信噪比中未经编码的情况下无法达到10-5的误码率,故在此处分析误码率为10-4的情况。
将原来的程序做如下修改:
[qcode]=quantiz(msg_demod,[-.50.5],3:
-1:
0);
msg_dec=vitdec(qcode,trellis,tblen,'cont','soft',2);
运行结果:
可见。
与未经编码的情况相比,2比特软判决可以带来4dB的编码增益。
(d)同样分析误码率为10-4的情况:
与未经编码的情况相比,3比特软判决可以带来4.4dB的编码增益。