系统仿真(四)


PNC系统仿真

一、前言

上学期选修了一门系统仿真的课程,在上了几次物理层网络编码的课程后,感觉这两门的契合度很高,于是想到了用系统仿真来完成这次报告,本次实验通过对信号生成、信道编码、qam调制解调、ofdm调制解调、信道噪声等的仿真,模拟PNC传输过程,研究信道SNR对信道误码率的影响。

二、PNC原理

image-20210708093726764

三、系统模型:

image-20210702080052317

image-20210702080110931

四、子模块代码

1、初始化

%% init
M = 16; % Modulation order for 16QAM
nfft  = 64;
cplen = 16; 
nSym  = 1;
nullIdx  = [1:6 33 64-4:64]';
numDataCarrs = nfft-length(nullIdx);
L=7;                %卷积码约束长度
tblen=6*L;          %Viterbi译码器回溯深度
SNR = 1:30;

2、生成随机序列

%% creat msg X and Y
msgX = randi([0 1],numDataCarrs*4,nSym);
msgY = randi([0 1],numDataCarrs*4,nSym);

image-20210708094941581

3、信道编码

%% 卷积码
trellis = poly2trellis(7,[171,133]);
codeX  = convenc(msgX,trellis);
codeY  = convenc(msgY,trellis);

4、M-QAM

%% QAM
data_temp1= reshape(codeX,log2(M),[])';             %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1);                             %二进制转化为十进制
qamX=qammod(data_temp2,M);  

data_temp1= reshape(codeY,log2(M),[])';             %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1);                             %二进制转化为十进制
qamY=qammod(data_temp2,M);  

qamX:

image-20210708094959995

qamY:

image-20210708095023146

5、OFDM

%% OFDM
ofdmX = ofdmmod(qamX,nfft,cplen,nullIdx);
ofdmY = ofdmmod(qamY,nfft,cplen,nullIdx);

ofdmX:

image-20210708095033626

ofdmY:

image-20210708095047473

6、发送信道噪声

outSigX=awgn(ofdmX,SNR(jj),'measured');%添加高斯白噪声
outSigY=awgn(ofdmY,SNR(jj),'measured');%添加高斯白噪声

outSigX:

image-20210708095109506

outSigY:

image-20210708095128849

7、中继端物理层网络编码

先解码信道中X和Y传输的信息,然后通过XOR生成Z,再此经过qam和ofdm调制广播。

%% 中继端物理层网络编码
% 解码X
relayX = ofdmdemod(outSigX,nfft,cplen,nSym,nullIdx); 
relayX = qamdemod(relayX, M);
xx=de2bi(relayX);
xxx= reshape(xx',[],1);
% 解码Y
relayY = ofdmdemod(outSigY,nfft,cplen,nSym,nullIdx); 
relayY = qamdemod(relayY, M);
yy=de2bi(relayY);
yyy= reshape(yy',[],1);
% 编码Z
relayZ = xor(xxx,yyy);
data_temp1= reshape(relayZ,log2(M),[])';             %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1);
qamZ = qammod(data_temp2,M);
ofdmZ = ofdmmod(qamZ,nfft,cplen,nullIdx);

8、中继广播信道

outSigZ = awgn(ofdmZ,SNR(jj),'measured');%添加高斯白噪声

image-20210708095150802

9、接收端解码Z

qamZ = ofdmdemod(outSigZ,nfft,cplen,nSym,nullIdx); 
codeZ = qamdemod(qamZ, M);
zz=de2bi(codeZ);
zzz= reshape(zz',[],1);

10、nodeY端解码msgX

%% nodeY端解码codeX
trellis = poly2trellis(7,[133 171]);
% nodeYZ = vitdec(zzz,trellis,tblen,'trunc','hard');   %硬判决
nodeYZ = zzz;
x = xor(nodeYZ,msgY);
% err = xor(msgX,x);
% sum = sum(err)

11、计算误码率

[err, Ber(jj)] = biterr(x(1:length(msgX)),msgX);%译码后的误码率

image-20210708095212616

五、总结

相对于上次课堂展示,这次完善了ofdm调制解调部分,并仿真了在不同信噪比的信道中该系统的误码率。在信噪比大于15的信道中,该系统可以稳定工作。在中继部分,仿真里采用解码再编码的方式进行编码。本人尝试对中继端接收的两个模拟信号直接进行操作,但依旧没有实现想要的效果。一是因为qam信号叠加后的映射关系没有搞清楚,二是可能在整个系统层面上存在不足。在这期间曾想过查阅资料,无奈网上关于物理层网络编码的资料太少,论文也无从下手,遂再次失败。后面要准备雷达成像方面的研究了,有时间会继续把这坑填上。

对于这门课程来说,物理层网络编码给我最大的启示就是利用干扰,相信这点在后面的科研生活中会给我带来一定的灵感。

附录

clear all
close all

%% init
M = 16; % Modulation order for 16QAM
nfft  = 64;
cplen = 16; 
nSym  = 1;
nullIdx  = [1:6 33 64-4:64]';
numDataCarrs = nfft-length(nullIdx);
L=7;                %卷积码约束长度
tblen=6*L;          %Viterbi译码器回溯深度
SNR = 1:30;
%% creat msg X and Y
msgX = randi([0 1],numDataCarrs*4,nSym);
msgY = randi([0 1],numDataCarrs*4,nSym);

%% 卷积码
trellis = poly2trellis(7,[171,133]);
% codeX  = convenc(msgX,trellis);
% codeY  = convenc(msgY,trellis);
codeX  = msgX;
codeY = msgY;
%% QAM
data_temp1= reshape(codeX,log2(M),[])';             %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1);                             %二进制转化为十进制
qamX=qammod(data_temp2,M);  

data_temp1= reshape(codeY,log2(M),[])';             %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1);                             %二进制转化为十进制
qamY=qammod(data_temp2,M);  

%% OFDM
ofdmX = ofdmmod(qamX,nfft,cplen,nullIdx);
ofdmY = ofdmmod(qamY,nfft,cplen,nullIdx);

%% 
Ber=zeros(1,length(SNR));
Ber2=zeros(1,length(SNR));
for jj=1:length(SNR)
    
%% X、Y发送信道
outSigX=awgn(ofdmX,SNR(jj),'measured');%添加高斯白噪声
outSigY=awgn(ofdmY,SNR(jj),'measured');%添加高斯白噪声

%% 中继端物理层网络编码
% 解码X
relayX = ofdmdemod(outSigX,nfft,cplen,nSym,nullIdx); 
relayX = qamdemod(relayX, M);
xx=de2bi(relayX);
xxx= reshape(xx',[],1);
% 解码Y
relayY = ofdmdemod(outSigY,nfft,cplen,nSym,nullIdx); 
relayY = qamdemod(relayY, M);
yy=de2bi(relayY);
yyy= reshape(yy',[],1);
% 编码Z
relayZ = xor(xxx,yyy);
data_temp1= reshape(relayZ,log2(M),[])';             %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1);
qamZ = qammod(data_temp2,M);
ofdmZ = ofdmmod(qamZ,nfft,cplen,nullIdx);

%% 中继广播信道
outSigZ = awgn(ofdmZ,SNR(jj),'measured');%添加高斯白噪声

%% 接收端解码Z
qamZ = ofdmdemod(outSigZ,nfft,cplen,nSym,nullIdx); 
codeZ = qamdemod(qamZ, M);
zz=de2bi(codeZ);
zzz= reshape(zz',[],1);

%% nodeY端解码codeX
trellis = poly2trellis(7,[133 171]);
% nodeYZ = vitdec(zzz,trellis,tblen,'trunc','hard');   %硬判决
nodeYZ = zzz;
x = xor(nodeYZ,msgY);
% err = xor(msgX,x);
% sum = sum(err)
%% 计算误码率
% [err,Ber2(jj)] = biterr(De_Bit(1:length(code_data)),code_data);%译码前的误码率
[err, Ber(jj)] = biterr(x(1:length(msgX)),msgX);%译码后的误码率
end

figure(1);
pX = msgX(1:30);
plot(pX,'o');
hold on;
pY= msgY(1:30);
plot(pY,'*');
legend('msgX','msgY');
hold on;
title('原始数据');


figure(9);
 semilogy(SNR,Ber,'b-o');
 hold on;
 xlabel('SNR');
 ylabel('BER');
 title('AWGN信道下误比特率曲线');

 
for fn=2:8
    switch fn
    case 2
        p = qamX;
    case 3
        p = qamY;
    case 4
        p = ofdmX;
    case 5
        p = ofdmY;
    case 6
         p = outSigX;
    case 7
        p = outSigY;
    case 8
        p = outSigZ;
    end
   
    bp=.000001; 
    RR=real(p);
    II=imag(p);
    sp=bp*2;                                     %symbol period for M-array QAM
    sr=1/sp;                                                      % symbol rate
    f=sr*2;
    t=sp/100:sp/100:sp;
    ss=length(t);
    m=[];
    for k=1:1:length(RR)
        yr=RR(k)*cos(2*pi*f*t);                     % inphase or real component
        yim=II(k)*sin(2*pi*f*t);            % Quadrature or imagenary component 
        y=yr+yim;
        m=[m y];
    end
    tt=sp/100:sp/100:sp*length(RR);
    figure(fn);
    plot(tt,m);
    xlabel('time(sec)');
    ylabel('amplitude(volt)');
end

文章作者: Liuss
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Liuss !
评论
  目录