📄 speredecoder.m
字号:
function [u]=speredecoder(r_in,M_in,SS,C_inital)
%sperdecoder---在复数范围内的解码程序
% u---解码输出,按列复数输出
% r_in---符号输入
% SS---MQAM的点集
% C_inital---球的初始半径
r=[real(r_in);imag(r_in)];
M1=real(M_in);
M2=imag(M_in);
M3=[M1,-M2;M2,M1];
G=M3'*M3;
R=chol(G);
for ii=1:size(R,1)
for jj=1:size(R,2)
if ii==jj
q(ii,jj)=R(ii,jj)^2;
elseif ii<jj
q(ii,jj)=R(ii,jj)/R(ii,ii);
else
q(ii,jj)=0;
end;
end;
end;
p=pinv(M3)*r;
% Original Radius Decision
C=C_inital;
n=size(p,1);
S(n)=p(n);
d2=C;
T(n)=C;
S(n)=p(n);
maxlen=length(SS);
flag1=1;
while(1>0)
if(flag1==1)
ii=n;
else
flag1=1;
end;
UU(ii)=QAM_Q_latter(sqrt(T(ii)/q(ii,ii))+S(ii),SS);
L(ii)=QAM_Q_former(-sqrt(T(ii)/q(ii,ii))+S(ii),SS);
N(ii)=QAM_Length_Enum(L(ii),UU(ii),SS);%%
z(ii,:)=sortx(L(ii),UU(ii),SS,S(ii));%%
%maxlen=length(SS);
%N(ii)=length(Enum(L(ii),UU(ii),SS));
%nn=maxlen-N(ii);
%extra=linspace(inf,inf,nn+1);
%z(ii,:)=[Enum(L(ii),UU(ii),SS) extra];%y(ii,:) 所有可能的取值, N(ii) 取值个数
x(ii)=0;
while(1>0)
while(1>0)
x(ii)=x(ii)+1;
if(x(ii)>N(ii))
if ii==n
lyh1=(size(u,2))/2;
u1=reshape(u,lyh1,2);
u=u1(:,1)+i*u1(:,2);
return;
else
ii=ii+1;
end;
else
break;
end;
end;
if (ii>1)
flag1=2;
break;
else
d2_new=T(n)-T(1)+q(1,1)*(S(1)-z(1,x(1)))^2;%%
end;
if d2_new<d2
break;
else
continue;
end;
end;
if(flag1==2)
E(ii)=p(ii)-z(ii,x(ii));%%
T(ii-1)=T(ii)-q(ii,ii)*(S(ii)-z(ii,x(ii)))^2;%%
sum=0.0;
for jj=ii:n
sum=sum+q(ii-1,jj)*E(jj);
end;
S(ii-1)=p(ii-1)+sum;
ii=ii-1;
else
d2=d2_new;
T(n)=d2_new;
for kk=1:n
u(kk)=z(kk,x(kk));%%
end;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -