PNC系统仿真
一、前言
上学期选修了一门系统仿真的课程,在上了几次物理层网络编码的课程后,感觉这两门的契合度很高,于是想到了用系统仿真来完成这次报告,本次实验通过对信号生成、信道编码、qam调制解调、ofdm调制解调、信道噪声等的仿真,模拟PNC传输过程,研究信道SNR对信道误码率的影响。
二、PNC原理
三、系统模型:
四、子模块代码
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);
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:
qamY:
5、OFDM
%% OFDM
ofdmX = ofdmmod(qamX,nfft,cplen,nullIdx);
ofdmY = ofdmmod(qamY,nfft,cplen,nullIdx);
ofdmX:
ofdmY:
6、发送信道噪声
outSigX=awgn(ofdmX,SNR(jj),'measured');%添加高斯白噪声
outSigY=awgn(ofdmY,SNR(jj),'measured');%添加高斯白噪声
outSigX:
outSigY:
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');%添加高斯白噪声
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);%译码后的误码率
五、总结
相对于上次课堂展示,这次完善了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