📄 mequal_estimation_bit_improve.m
字号:
buf_len = zeros(K,buflength);
a_buf(1:K,1:buflength/2+1,1:nstates)=aa(1:K,(PN-buflength)/2+1:PN/2+1,1:nstates);
%errord = zeros(1,M+PN);
%u = zeros(M,fix(bit_extension/fs));
% i_end=(length(encoderout)-PN)/2+1;%解码次数,前buflength/2次是训练比特,不计。
out_up=zeros(K,block+buflength/2);
out_down=zeros(K,block+buflength/2);
out=zeros(K,block+buflength/2);
buf_len(1:K,1:buflength) =soft_PNandData(1:K,2*(nn-1)*(PN/2+block)+PN-buflength+3:2*(nn-1)*(PN/2+block)+PN+2);% 偏移2比特
beg1 = (nn-1)*(PN/2+block)+PN/2+2;
beg2 = (nn-1)*(PN/2+block)+PN/2+block+buflength/2+1;
%template_signal1(1:K,:)=template_signal(1:K,:);
for i = beg1:beg2 %(length(encoderout)-PN)/2+1-3 % 信息比特数,每次读2比特。
u1 = zeros(1,fix(bit_extension/fs));
u2 = zeros(1,fix(bit_extension/fs));
%假设i时,信道发生改变
%-----------------信道的时变特性--------------------------
%此处根据信道时变特性对生成的信道进行的修改
%假设信道仅有10%发生变化并且最强的脉冲没有变化,取消该假设
%
for jj = 1:K %根据信道1的改变,改变v(:,,:)的值
if i == variance_position(1,jj)
NumOfTimevariance(jj)=ceil( NumOfMultipath(jj)*variance_rate ); %信道1冲击的改变
for channel_loop= 1 : NumOfTimevariance(jj)
while 1 %选择那条脉冲变化
X=floor(rand(1)*1000);
if X < tailend && X ~= 0
break;
end
end
while 1 %脉冲的新位置
New_P=floor(rand(1)*1000);
if New_P < tailend && New_P ~= 0
break;
end
end
XX=mod(X,2);
path_sign=sign(random('norm',0,1)); %冲击响应改变时,多径增益变化的符号
path_gain=(0.5+XX); %冲击响应改变时,多径幅度变化
% Channel_Out_Data(1,New_P)=Channel_Out_Data(1,X); %多径位置的变化
Channel_Out_Data(jj,X)=Channel_Out_Data(jj,X)*path_gain*path_sign; %多径增益的变化
end
for ii = 1:(fix(tailend/fs)) %根据信道1的改变,改变zkj(1,:)的值
zkj(jj,ii) = Channel_Out_Data(jj,fs*ii);
end
%------------------------------------------------------------------
% Parse the signal zkj into overlapping segments v
for ii = 1:fix(tailend/90)-(across-1)
for kk = 1:fix(bit_extension/fs)
v(ii,kk,jj) = zkj(jj,kk+(ii-1)*fix(90/fs)); % V就是窗口长度截取的数据V(1~20,180,USER),(1 2) (2 3) (3 4)......
end
end
%
% else
% break;
% end
end %结束信道的时变特性 %假设在(beg1+beg2)/2时,信道发生改变
%结束信道的时变特性 对应 if i == variance_position(1,jj)
end %jj
for j = 1:K % 叠加各个用户的有用信号,这时最大能量区间可能已经改变,但因为不重新同步,所以仍采用原来的区间datav。
t = min(2*i-1,datav(j,3)-datav(j,2)+1);
for kk = (datav(j,1)-datav(j,2)+1):1:t
u1 = u1 + encoder_positive_nagetive(j,2*i-1-kk+1)*v((kk+datav(j,2)-1),:,j);
end
t = min(2*i,datav(j,3)-datav(j,2)+1);
for kk = (datav(j,1)-datav(j,2)+1):1:t
u2 = u2 + encoder_positive_nagetive(j,2*i-kk+1)*v((kk+datav(j,2)-1),:,j);
end
end %j
%plot(u)
if(open==1) % 考虑高斯噪声
u1 = u1 + noise;
tempnoise1 = noise(fix(90/fs)+1:fix(bit_extension/fs));
tempnoise2 = normrnd(MU,SIGMA);
noise = tempnoise2;
noise(1:round((across-1)*90/fs)) = tempnoise1;
u2 = u2 + noise;
tempnoise1 = noise(fix(90/fs)+1:fix(bit_extension/fs));
tempnoise2 = normrnd(MU,SIGMA);
noise = tempnoise2;
noise(1:round((across-1)*90/fs)) = tempnoise1;
end
% plot(u)
%移位寄存u1,u2的值,用于后面信道估计
for mm= 1 : buflength/2
temp_variant( 2*mm-1,:) = temp_variant( 2*(mm+1)-1,:);
temp_variant( 2*mm,:) = temp_variant( 2*(mm+1),:);
end
temp_variant( buflength+1,:) = u1;
temp_variant( buflength+2,:) = u2;
%相关处理,去除多用户及噪声干扰,接收信号数据用模版相关
% if i>beg1+buflength+150
for j=1:K
template_signal1(j,:)=v( datav(j,2) , 1:180 , j );%加入理想模板,平时不用,注释掉!!!!!========================================
template_u1(j,:) = template_signal1(j,:).*u1;
template_u2(j,:) = template_signal1(j,:).*u2;
end
% else
% for j=1:K
% template_u1(j,:) = u1;
% template_u2(j,:) = u2;
% end
%
% end
%adjust u1,u2 end
if algorithp==1 % input('输入采用何种算法更新判决权系数[0-LMS,1-RLS,2-LMS_modify] algorithd =‘ ');
for jj = 1:K
pai(jj,:) = template_u1(jj,:) * P(:,:,jj); % for all users u1
k(:,jj) = pai(jj,:)'/( nmda+pai(jj,:) * template_u1(jj,:)' ); % for all users
soft_PNandData(jj,2*i-1) = template_u1(jj,:) * w(:,jj);
w(:,jj) = w(:,jj) + (sign(soft_PNandData(jj,2*i-1)) - soft_PNandData(jj,2*i-1))*k(:,jj); % for different users ,RLS,change
P(:,:,jj) = (P(:,:,jj)-k(:,jj)*pai(jj,:))/nmda; % for all users u2
end
for jj = 1:K
pai(jj,:) = template_u2(jj,:) * P(:,:,jj);% for all users
k(:,jj) = pai(jj,:)'/( nmda+pai(jj,:) * template_u2(jj,:)' ); % for all users
soft_PNandData(jj,2*i)=template_u2(jj,:)*w(:,jj);
w(:,jj) = w(:,jj) + (sign(soft_PNandData(jj,2*i)) - soft_PNandData(jj,2*i))*k(:,jj); % for different users ,RLS,change
P(:,:,jj) = (P(:,:,jj)-k(:,jj)*pai(jj,:))/nmda; % for all users u2
end
%---------------译码-------------------------------
%此部分内容和前面相似
%在此之后的内容已看懂
for ii=1:nstates
bb(1:K,ii)=1.0/(2*block);
end
for jj =1:K
x(jj,i-1)=soft_PNandData(jj,2*i-1);
y(jj,i-1)=soft_PNandData(jj,2*i);
var1=computevariance(x);
if (var1<= 0.01)
var1=0.01;
end
var2=computevariance(y);
if (var2<= 0.01)
var2=0.01;
end
Lc1(jj)=2/var1;
Lc2(jj)=2/var2;
%compute the value of b
for kk=buflength/2:-1:2
factor=0;
for fm=1:8 %前一个状态
temp(fm)=0;
for m=1:8 %后一个状态
if (judge(fm,m)==0)
gama_with_info=0;
else
x_up=(2*d(fm,m,1)-1); %*(0.1746);
x_down=(2*d(fm,m,2)-1);%*(0.1746);
gama_with_info=exp(0.5*(x_up*Lc1(jj)*buf_len(jj,2*kk-1)+Lc2(jj)*buf_len(jj,2*kk)*x_down));
if (gama_with_info==inf)
gama_with_info=300;
elseif(gama_with_info>300)
gama_with_info=300;
end
end
%factor=factor+gama_with_info*a(k,fm);
temp(fm)=temp(fm)+gama_with_info*bb(jj,m);
if (temp(fm)==inf)
temp(fm)=300;
end
end%m
factor=factor+temp(fm);
end%fm
for ii=1:8
bb(jj,ii)=temp(ii)/factor;
end
end %求bb值结束
%---compute decode (第i bit)---
%compute the output y_up and y_down
%for k=2:len+1
tempu0=0; %out(k-1)=log(temp1/temp0);
tempu1=0;
tempd0=0;
tempd1=0;
temp0=0; %out(k-1)=log(temp1/temp0);
temp1=0;
for m=1:8
for fm=1:8
if (judge(fm,m)==0)
gama_yu0=0;
gama_yu1=0;
gama_yd0=0;
gama_yd1=0;
gama_yk0=0;
gama_yk1=0;
else
x_up=(2*d(fm,m,1)-1);%*(0.1746);
x_down=(2*d(fm,m,2)-1);
gama_up=exp(0.5*Lc1(jj)*buf_len(jj,1)*x_up);
if (gama_up==inf)
gama_up=300;
elseif(gama_up>300)
gama_up=300;
end
gama_down=exp(0.5*Lc2(jj)* buf_len(jj,2)*x_down);
if (gama_down==inf)
gama_down=300;
elseif(gama_down>300)
gama_down=300;
end
if (d(fm,m,1)==1) %Only change here
gama_yu0=0;
gama_yu1=gama_up;
else
gama_yu0=gama_up;
gama_yu1=0;
end
if (d(fm,m,2)==1) %Only change here
gama_yd0=0;
gama_yd1=gama_down;
else
gama_yd0=gama_down;
gama_yd1=0;
end
if (c(fm,m)==1)
gama_yk0=0;
gama_yk1=exp(0.5*(Lc1(jj)*buf_len(jj,1)*x_up+Lc2(jj)*buf_len(jj,2)*x_down));%y(x)=0,表示删余。gama_yk=1,对求a(k-1,fm),b(k,m)无影响。
else
gama_yk0=exp(0.5*(Lc1(jj)*buf_len(jj,1)*x_up+Lc2(jj)*buf_len(jj,2)*x_down));
gama_yk1=0;
end
if (gama_yk0==inf)
gama_yk0=300;
elseif(gama_yk0>300)
gama_yk0=300;
end
if (gama_yk1==inf)
gama_yk1=300;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -