⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 post_test_pi4dqpsk.m

📁 一种用于GMSK非线性调制的自适应均衡算法 
💻 M
字号:
m=150;
pi=3.14159;
n=10;           
id=sqrt(-1);
numerr=0;                                                               %误码率
numerr1=0;
iteration_num=1;
for a=1:iteration_num
%-------------------------------------
%码元产生
ran=randn(1,m);                  %随机产生Bpsk的信号比特1或-1
data_sequence=zeros(1,m);
for i=1:m
  if ran(1,i)>0
      data_sequence(1,i)=1;
  else
      data_sequence(1,i)=0;
  end   
end;

%--------------------------------------------
%23训练序列+数据
sequence=[+1 +1 -1 +1 -1 +1 +1 +1 +1 -1 +1 +1 -1 -1 +1 +1 +1 -1 +1 -1 +1 +1 +1];
safeguard1=[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1];
safeguard2=[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1];

%差分编码
M=4;          
mapping=[-3 3 -1 1];
data_sequence_de=coding(data_sequence,M,mapping);
Ik=data_sequence_de(:,1)';
Qk=data_sequence_de(:,2)';
data=Ik+Qk*id;

%sequence=[safeguard1 sequence data safeguard2];
sequence=[sequence data];
%--------------------------------------------

%-------------------------------------------------------
%波形形成,内插和调制
[I_wave,Q_wave]=wavemod(sequence);
I_wave=interp(I_wave,4);
Q_wave=interp(Q_wave,4);
fs=5*128000*4;               
fc=455000;
t=0:1/fs:(length(I_wave)-1)*1/fs;
mod_train=I_wave.*cos(2*pi*fc*t)-Q_wave.*sin(2*pi*fc*t);
%-------------------------------------------------------


%------------------------------------------------------
%经信道加噪声和多径
snr=20;
channel=[1 0  0.5*(0.996+0.087*id)];
channel=[ 1+0j 0.3-0.06*id 0.2+0.1*id];
channel=[1 0.2+0.1*id];
channel=[0.1 1 0.2];
[channel_out,N0]=multi_channel(mod_train,channel,snr);
channel_out=channel_out(21:length(mod_train)+20);
%channel_out=channel_out(1:length(mod_train));
%------------------------------------------------------
%解调和抽取
demod_out=demod1(channel_out);

demod_out_extract=zeros(1,length(demod_out)/4);
for i=1:length(demod_out)/4
    demod_out_extract(i)=demod_out(4*(i-1)+1);
end;

%------------------------------------------------------
%信道估值
refe_sequence=[ -1 +1 +1 +1 +1 -1 +1 +1 -1 -1 +1 +1 +1 -1 +1];          %本地参考序列


corr=zeros(23,5);
test=0;
for k=1:23
  for i=1:5
    select=zeros(1,15);  
    for j=1:15
      select(j)=demod_out_extract(5*(j-1+k-1)+i);
    end;
     corr(k,i)=(sum(refe_sequence.*(select)));
     if abs(corr(k,i))>test                                            %记录最大的相关值(位同步点位置p,q )
       test=abs(corr(k,i));
       p=k;
       q=i;
     end;
     if k==5&i==3
         de=select;
     end;
  end;
end;
 
G=[15 -1 -1 -1 3
   -1 15 -1 -1 3
   -1 -1 15 -1 3
   -1 -1 -1 15 3
   -1 -1 -1 3 15];
A=[corr(p-2,q) corr(p-1,q) corr(p,q) corr(p+1,q) corr(p+2,q)].';
W=inv(G)*A;


Tw=0.1;                   %门限
for i=1:length(W)         %大于门限的信道参数保留,小于门限的信道参数置0
    if abs(W(i))<Tw
        W(i)=0;
    end;
end;
 

refe_sequence1=[1 refe_sequence(1:14)];
refe_sequence2=[-1 1 refe_sequence(1:13)];
refe_sequence3=[1 -1 1 refe_sequence(1:12)];
refe_sequence4=[+1 +1 -1 +1 refe_sequence(1:11)];
error=sum(abs(refe_sequence*W(1)+refe_sequence1*W(2)+refe_sequence2*W(3)+refe_sequence3*W(4)+refe_sequence4*W(5)-de))/15; %重构误差

%------------------------------------------------------


%------------------------------------------------------
%码元中点取样,中点在第q个样点                                                
y_in=zeros(1,length(demod_out_extract)/5);
for i=1:length(demod_out_extract)/5
    y_in(i)=demod_out_extract(5*(i-1)+q);
end;
%------------------------------------------------------


%------------------------------------------------------
%均衡


h_estimated=[W(1) W(2) W(3) W(4) W(5)];
%h_estimated=[W(3) W(4) W(5)];
        
L=5;
 %-------------------------------------------------
 % 由信道参数计算均衡器系数
    
    g=zeros(L,L);
    for i=1:L,
      for j=i:L,
        for n=1:L-(j-i), 
           g(i,j)=g(i,j)+h_estimated(n)*conj(h_estimated(n+j-i));           %g(i,j)=h(0)*conj(h(0+j-i))+h(1)*conj(h(1+j-i))+...+h(L)*conj(h(L+j-i))
        end;
        if i==j
          g(i,j)=g(i,j);%+N0;
        end;
      end;
    end;

    for i=1:L,
      for j=1:i,  
        g(i,j)=g(j,i);
      end;  
    end;
    
    f=zeros(1,L);
    for i=1:L,
       f(i)=conj(h_estimated(L+1-i));                                       % f=conj[h(K1),.....,h(1),h(0)]
    end;
    c_estimated1=inv(g)*f.';                                                %计算均衡器前馈级系数
    
    %-------------------------------------------------------------
    % Gauss-sidel迭代求前馈级系数(DSP实现时用此法代替矩阵求逆)
    c1=0;
    c2=0;
    c3=0;
    c4=0;
    c5=0;
    for i=2:5
        c1=c1+1/g(1,1)*(f(1)-g(1,1)*c1-g(1,2)*c2-g(1,3)*c3-g(1,4)*c4-g(1,5)*c5);
        c2=c2+1/g(2,2)*(f(2)-g(2,1)*c1-g(2,2)*c2-g(2,3)*c3-g(2,4)*c4-g(2,5)*c5);
        c3=c3+1/g(3,3)*(f(3)-g(3,1)*c1-g(3,2)*c2-g(3,3)*c3-g(3,4)*c4-g(3,5)*c5);   
        c4=c4+1/g(4,4)*(f(4)-g(4,1)*c1-g(4,2)*c2-g(4,3)*c3-g(4,4)*c4-g(4,5)*c5);
        c5=c5+1/g(5,5)*(f(5)-g(5,1)*c1-g(5,2)*c2-g(5,3)*c3-g(5,4)*c4-g(5,5)*c5);
    end;
    %-------------------------------------------------------------
    
    K2=L;                                                                  %计算均衡器反馈级系数    
    c_estimated2=zeros(1,K2);
    for i=1:K2
        for j=i:K2-1
          c_estimated2(i)=c_estimated2(i)-c_estimated1(j+1)*conj(f(j-i+1)); %c(k)=-(c(-K1)*f(k+K1)+c(-K1+1)*f(k+K1-1)+....+c(0)*f(k))
      end;
    end;    
    %---------------------------------------------------------------
    
    %---------------------------------------------------------------
    %均衡
   
   
   iout=zeros(1,length(y_in)-L);
   x_test=zeros(1,length(y_in)-L);
   y_test=zeros(1,length(y_in)-L);
   x_test1=zeros(1,length(y_in)-L);
   y_test1=zeros(1,length(y_in)-L);
   se_test=zeros(1,length(y_in)-L);
   eq_out=zeros(1,length(y_in)-L);
   uneq_out=zeros(1,length(y_in)-L);
   eq_out(21)=1;
   uneq_out(23)=1;
   y_in(22)=1;
   y_in(23)=1;
   for b=22:length(y_in)-L
    
    for j=1:L
           yy_k(j)=y_in(b+L-j);                                             %前馈级数据  [y(b+K1),y(b+K1-1),...,y(b)]       
    end;
    for j=1:K2                             
         y_k(j)=eq_out(b-j);                                                 %反馈级数据  [I~(b-1),I~(b-2),...,I~(b-K2)]
     end;
    yy1=yy_k(1:L).';
    yy2=y_k(1:K2).';
    iout1(1,b)=((c_estimated1).')*yy1; 
    iout2(1,b)=((c_estimated2))*yy2;
   
    iout(1,b)=iout1(1,b)+iout2(1,b);                                         % I^(b) 均衡器的输出
    if real(iout(1,b))>=0.8536
        eq_out(1,b)=1;
    elseif real(iout(1,b))>=0.3536
        eq_out(1,b)=0.7071;
    elseif real(iout(1,b))>=-0.3536
        eq_out(1,b)=0;
    elseif real(iout(1,b))>=-0.8536
        eq_out(1,b)=-0.7071;
    else
        eq_out(1,b)=-1;
    end;   
    if imag(iout(1,b))>=0.8536
        eq_out(1,b)=eq_out(1,b)+1*id;
    elseif imag(iout(1,b))>=0.3536
        eq_out(1,b)=eq_out(1,b)+0.7071*id;
    elseif imag(iout(1,b))>=-0.3536
        eq_out(1,b)=eq_out(1,b)+0*id;
    elseif imag(iout(1,b))>=-0.8536
        eq_out(1,b)=eq_out(1,b)+(-0.7071)*id;
    else
        eq_out(1,b)=eq_out(1,b)+(-1)*id;
    end;   
    
    e(b)=real(eq_out(1,b))*real(eq_out(1,b-1))+imag(eq_out(1,b))*imag(eq_out(1,b-1));
    f(b)=imag(eq_out(1,b))*real(eq_out(1,b-1))-real(eq_out(1,b))*imag(eq_out(1,b-1));
   
    if e(b)>0                                                        %字符检测  I~(b)
        x_test(b)=1;
    elseif e(b)<0
        x_test(b)=0;
    end;
    if f(b)>0                                                        %字符检测  I~(b)
        y_test(b)=1;
    elseif e(b)<0
        y_test(b)=0;
    end;
        

   if abs(data_sequence(2*(b-22)+1)-x_test(b))>0.1
       numerr=numerr+1;
   end;
   
   if abs(data_sequence(2*(b-22)+2)-y_test(b))>0.1
       numerr=numerr+1;
   end;
   end;
   
   
   for b=24:length(y_in)-L
   if real(y_in(1,b))>=0.8536
        uneq_out(1,b)=1;
    elseif real(y_in(1,b))>=0.3536
        uneq_out(1,b)=0.7071;
    elseif real(y_in(1,b))>=-0.3536
        uneq_out(1,b)=0;
    elseif real(y_in(1,b))>=-0.8536
        uneq_out(1,b)=-0.7071;
    else
        uneq_out(1,b)=-1;
    end;   
    if imag(y_in(1,b))>=0.8536
        uneq_out(1,b)=uneq_out(1,b)+1*id;
    elseif imag(y_in(1,b))>=0.3536
        uneq_out(1,b)=uneq_out(1,b)+0.7071*id;
    elseif imag(y_in(1,b))>=-0.3536
        uneq_out(1,b)=uneq_out(1,b)+0*id;
    elseif imag(y_in(1,b))>=-0.8536
        uneq_out(1,b)=uneq_out(1,b)+(-0.7071)*id;
    else
        uneq_out(1,b)=uneq_out(1,b)+(-1)*id;
    end;   
    
    
    e1(b)=real(uneq_out(1,b))*real(uneq_out(1,b-1))+imag(uneq_out(1,b))*imag(uneq_out(1,b-1));
    f1(b)=imag(uneq_out(1,b))*real(uneq_out(1,b-1))-real(uneq_out(1,b))*imag(uneq_out(1,b-1));
    if e1(b)>0                                                        %字符检测  I~(b)
        x_test1(b)=1;
    elseif e(b)<0
        x_test1(b)=0;
    end;
    if f1(b)>0                                                        %字符检测  I~(b)
        y_test1(b)=1;
    elseif e(b)<0
        y_test1(b)=0;
    end;
    
   if abs(data_sequence(2*(b-24)+1)-x_test1(b))>0.1
       numerr1=numerr1+1;
   end;
   
   if abs(data_sequence(2*(b-24)+2)-y_test1(b))>0.1
       numerr1=numerr1+1;
   end;
end
end

numerr=numerr/iteration_num;
numerr1=numerr1/iteration_num;
unequalized=y_in(24:73);
equalized=iout(24:70);
figure(1);
plot(real(unequalized),imag(unequalized),'o')
axis('square')
axis([-1.5 1.5 -1.5 1.5]);
figure(2);
plot(real(equalized),imag(equalized),'o')
axis('square')
axis([-1.5 1.5 -1.5 1.5]);
a=1;

w=0.995;
p2=eye(5)*0.004;
c2=[0 0 0 0 0];
e2=zeros(1,length(y_in)-L);
iout2=zeros(1,length(y_in)-L);
ks2=zeros(5,length(y_in)-L);
xx2=0;
yy2=zeros(5,1);
 for b=22:length(y_in)-L
    
    for j=1:L
           yy_k(j)=y_in(b+L-j);                                             %前馈级数据  [y(b+K1),y(b+K1-1),...,y(b)]       
    end;
   iout2(1,b)=conj(c2)*yy1; 
   e2(b)=data(b-21)-iout2(b);
   xx2=w+(conj(yy1).')*p2*yy1;
   yy2=p2*yy1;
   ks2(:,b)=yy2/xx2;
   p2=(p2-ks2(:,b)*(conj(yy1).')*p2)/w;
   c2=c2+ks2(:,b).'*conj(e2(b));
   mse2(i)=abs(e2(b))^2;
end
a=1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -