我所调试的部分是一个D8PSK的收发系统。按理说,D8PSK在本科通信原理学习中也是一个可以说是最简单的系统了,可是实现起来并没有那么简单。当然当时学通信原理时就知道事情没有那么简单,但是却不知道怎样开始做一个系统,现在算是补足学习通信原理时的遗憾。
言归正传,D8PSK系统,就是将3个二进制数映射为一个符号,采用格雷码映射,相邻相位之间只有一个比特不同,好处是即使解调错误,很可能只会产生一比特的误判。然后就是D8PSK中的D,表示的是,发送信号代表的是原始信号的差分值(调制信号前后码元之间载波相对相位的变化来传递信息。)。首先拿简单的D2PSK来说,如果原始信号是01100101,那么发送信号的相位就是首先一个初相比如0,然后0,pi,0,0,0,pi,pi,0。
D8PSK的话,
switch b_123
case '000'
delta_phi(i)=0;
case '001'
delta_phi(i)=pi/4;
case '011'
delta_phi(i)=pi/2;
case '010'
delta_phi(i)=3*pi/4;
case '110'
delta_phi(i)=pi;
case '111'
delta_phi(i)=5*pi/4;
case '101'
delta_phi(i)=3*pi/2;
case '100'
delta_phi(i)=7*pi/4;
end
然后
for i=1:M
phi(i+1)=phi(i)+delta_phi(i);
end
phi=phi(2:end);
data_symbols=exp(1i*phi);
成型滤波
data_ups=upsample([data_symbols(end-20:end),zeros(1,13),data_symbols,zeros(1,13),data_symbols(1:20)],4);%后面加10个零是因为MATLAB上经过升余弦滤波器后报文末端数据会有部分丢失
% rcos_filter=rcosfir(0.6,3,4,1,'sqrt');
rcos_filter=rcosfir(0.6,3,4,1);
data_tx=filter(rcos_filter,1,data_ups);
再然后,梳状滤波,再然后上变频
begin
VDB_DUC_I<={VDB_tx_I_cos[23],VDB_tx_I_cos}+{VDB_tx_Q_sin[23],VDB_tx_Q_sin};
VDB_DUC_Q<={VDB_tx_Q_cos[23],VDB_tx_Q_cos}-{VDB_tx_I_sin[23],VDB_tx_I_sin};
end
再iq支路进入dac。dac里我猜i路信号(cospi/4)乘以coswt - q路信号(sinpi/4)乘以sinwt=>cos(wt+pi/4)发送出去。
ps:
如果不是再dac里做,而是只matlab仿真的话,就直接用复数就行
接收端:adc模块cos(wt+pi/4)。然后
。。。。。。
再然后
for i=2:L_effect
Ikk(i-1)=QQ(i)*QQ(i-1)+II(i)*II(i-1);
Qkk(i-1)=QQ(i)*II(i-1)-II(i)*QQ(i-1);
end
for i=1:L_effect-1
ag=atan2(Qkk(i),Ikk(i));
if (Ikk(i)>0&&Qkk(i)/Ikk(i)>-0.4142&&Qkk(i)/Ikk(i)<0.4142)
Output_123(i*3-2:i*3)=[0 0 0];
elseif (Ikk(i)>0&&Qkk(i)/Ikk(i)>0.4142&&Qkk(i)/Ikk(i)<2.4142)
Output_123(i*3-2:i*3)=[0 0 1];
elseif (Qkk(i)>0&&Ikk(i)/Qkk(i)>-0.4142&&Ikk(i)/Qkk(i)<0.4142)
Output_123(i*3-2:i*3)=[0 1 1];
elseif (Ikk(i)<0&&Qkk(i)/Ikk(i)>-2.4142&&Qkk(i)/Ikk(i)<-0.4142)
Output_123(i*3-2:i*3)=[0 1 0];
elseif (Ikk(i)<0&&Qkk(i)/Ikk(i)>-0.4142&&Qkk(i)/Ikk(i)<0.4142)
Output_123(i*3-2:i*3)=[1 1 0];
elseif (Ikk(i)<0&&Qkk(i)/Ikk(i)>0.4142&&Qkk(i)/Ikk(i)<2.4142)
Output_123(i*3-2:i*3)=[1 1 1];
elseif (Qkk(i)<0&&Ikk(i)/Qkk(i)>-0.4142&&Ikk(i)/Qkk(i)<0.4142)
Output_123(i*3-2:i*3)=[1 0 1];
elseif (Ikk(i)>0&&Qkk(i)/Ikk(i)>-2.4142&&Qkk(i)/Ikk(i)<-0.4142)
Output_123(i*3-2:i*3)=[1 0 0];
end
关于为什么用D,即相位模糊问题,首先如果是2PSK
发送0101,而接受可能译为1010。这就是倒pi现象。我在想为什么不直接和接收端商量好发送的前几个码字比如前几个码字就发送0101,接收端一看是1010就知道倒pi了。可是写到这接发现,首先发送了冗余信息,这个就没必要,然后如果在这规定的码字中出现了错误,可能导致整个数据全部译码错误,所以就用D了。
如果是D8PSK的话,
接收cos(wt+pi/4)时,i支路乘以coswt后低通后得cospi/4,q支路得到sinpi/4.
现在只看i支路,如果有相位模糊乘以了cos(wt+pi),得到了cos5pi/4;
同理q支路,得到sin5pi/4;
即发送pi/4译码得5pi/4;
发送0 pi/4 2pi/4 3pi/4 4pi/4 5pi/4 6pi/4 7pi/4
译码pi 5pi/4 6pi/4 7pi/4 0 pi/4 2pi/4 3pi/4
发送000 001 011 010 100 101 111 110
译码100 101 111 110 000 001 011 010
出现了倒pi现象
关于为什么会出现本地载波是cos(wt+pi)的情况
相偏估计对180°不敏感。
D:就是调制信号前后码元之间载波相对相位的变化来传递信息。