📄 muduwb_synchronization_fs.m
字号:
%-------------------------------------------------------------------------
%synchronization: all search method 定了
%-----------------------------------------------------------------------
clear all;close all;
datanum=1024;%512
M=datanum*2;
repeatnum=1;%==============OUT circulation, different data
iterate=1;%======Inner circulation, same data
% SIGMA =0.506;%=ADD NOISE:.402 .4256 . .451 .4775 .506 .5358 .5675 .6012 .6369 .6747 .7146 .7569 .8018 .8493 .8996(0dB) .9216 1.0093 1.0692 1.1325
%K = input('输入用户数目[1,15] K = ');
K=15;%max=15
Tmin=0.1;
algorithp =1;% input('输入采用何种算法更新训练权系数[0-LMS,1-RLS] algorithp = ');
%--------------------------------------------------------------------------
%Multiple=2;
SY = 400;%data for synchronization
PN=400;%data for trainning after synchronization
TH=0.9;% no use
%M = input('输入帧长度 M = '); % 20000
%M=256*Multiple;
L=15;%一个比特的脉冲个数。
% fs =1;
across=2;
bit_extension=across*90;
total_all_rate=zeros(14,6);
last_shift=zeros(6,14,K);
% encoder_BER=zeros(3,21);
% decoder_BER=zeros(3,21);
for fs=1:1
zz=0;
% for across=8:8 for db=1.0:-0.5:1.0
SIGMA=sqrt(0.80925/10^(0.1*db));
zz=zz+1
%===============================================================================================================
Channel_Out_Data=load('d:\Channel2_Out_Data');%from impulse_response_DS.m
%ploting=Channel_Out_Data';
tailend=length(Channel_Out_Data(1,:));
%Fix_Train=fixsequence(K,PN);%产生fixed训练比特
Fix_Train=signalxy(K,SY);%产生random训练比特,并不固定
Channel_across=zeros(K,tailend+90*SY);
for jj=1:K%K selected
for i=1:SY
Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))=Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))+Fix_Train(jj,i)*Channel_Out_Data(jj,:);
end
end
aa=Channel_across(1,15*fix(90/fs)+1:16*fix(90/fs));%取一个符号看看
Channel_sum=sum(Channel_across);%When K>1
%Channel_sum=Channel_across;%When K=1
% plot(Channel_sum(1,1000:2200));
% figure
% plot(Channel_across(1,1000:2200));
%-------------------对Channel_sum进行采样---------------------
% %fs = input('输入采样速率 fs = ');
% Channel_sum_ts = zeros(1,fix(length(Channel_sum)/fs));
%
% for i=1:fix(length(Channel_sum)/fs)
% Channel_sum_ts(i) = Channel_sum(fs*i);
% end
%-------------------叠加高斯白噪声-------------------
%
% %open = input('是否加入高斯噪声(0-no;1-yes) open = ');
open =1;
%length(Channel_sum_ts);
noise = zeros(1,length(Channel_sum));
%
% tempnoise1 = zeros(1,fix(90/fs));
%
% tempnoise2 = zeros(1,fix(bit_extension/fs));
%
if(open==1) % 考虑高斯噪声
MU = zeros(1,length(Channel_sum));
noise = normrnd(MU,SIGMA);
Channel_sum = Channel_sum+noise;
end
%
%==============================MMSE==============================
%--------------------Training Stage-----------------------
% %algorithp = 1;
% %PN = input('输入训练比特数目 PN = ');
% Sign_Train=signalxy(K,SY);% A function to add random data to all users.
error = zeros(1,SY);
%error_maxi = zeros(1,2*90/fs);
% Sign_Train_add_B=zeros(K,SY+M+10);
% for jj=1:K
% Sign_Train_add_B(jj,1:SY)=Sign_Train(jj,:);
% end
u = zeros(1,fix(bit_extension));
uu = zeros(1,fix(bit_extension/fs));
%last_shift=zeros(1,K);
for jj = 13:K%K每个用户分别同步
nn=0;
shift=0;
stepsize=fix(90);
count=0;
error_maxi=zeros(1,3);
error_shift = zeros(1,3);
syn=zeros(1,8);
shift_syn=zeros(1,8);
NUM = fix(tailend/90)/2;%除2表示NUM取一个脉冲多径长度的一半
for nn=1:NUM-1%同步偏移,以字符长度为单位,最多一个脉冲的多径长度
% 采用RLS算法的参数
diat = 1;
nmda = 0.999;
I = eye(fix(bit_extension/fs));
w = zeros(fix(bit_extension/fs),1); % 初使化用户的权值
P = diat*I;
for i = 1:SY % 训练比特数,每偏移一次,训练SY 个。
u(1,1:fix(bit_extension)) = Channel_sum(1,((i-1)+(nn-1))*90+1:(across+(i-1)+(nn-1))*90);
for l=1:fix(length(u)/fs)
uu(l) = u(fs*l);
end
% %-----------------画误差曲线图----------------
temp = 0;
temp = abs(Fix_Train(jj,i) - w(:,1)'*uu');
%temp = temp + abs(b(jj,i) - w(:,jj)'*u');
error(1,i) = temp;% 各用户第i个比特训练误差
if(algorithp==1)
pai = uu*P;% for all users
k = pai'/(nmda+pai*uu'); % for all users
w(:,1) = w(:,1) + (Fix_Train(jj,i) - w(:,1)'*uu')*k; % for different users ,RLS
P = (P-k*pai)/nmda; % for all users
elseif(algorithp==0)
if(i<SY/2)
mlms = 0.0032;
else
mlms = 0.0005;
end
w(:,1) = w(:,1) + mlms*(Fix_Train(jj,i) - w(:,1)'*uu')*uu'; % for different users ,LMS
end
end%i
%----------------------------------------------
%--------------判断是否同步--------------
% MSE = std(error(jj,SY-100:SY));
% if (MEAN<0.5)&(MSE<0.5)
%ee=error';
MAX(1,nn)=max(error(1,SY-300:SY));
MEAN(1,nn)=mean(error(1,SY-300:SY));
STD(1,nn)=std(error(1,SY-300:SY));
end%nn
[C1,index1] = min(MAX);
[C2,index2] = min(MEAN);
[C3,index3] = min(STD);
%[C,index] = [C2,index2];%Try every algorithm
C = C2;
index = index2;
shift = (index-1)*fix(90)+1;
syn(1,1)=C;
error_maxi(1,1)=C;
shift_syn(1,1)=shift;
error_shift(1,1) = shift;
stepsize = fix((90)/2);
for n=2:8
for ii=1:2
diat = 1;
nmda = 0.999;
I = eye(fix(bit_extension/fs));
w = zeros(fix(bit_extension/fs),1); % 初使化用户的权值
P = diat*I;
if (ii==1)
shift = shift+stepsize;
else
shift = shift-2*stepsize;
if (shift <=0)
shift = stepsize;%shift=fix(stepsize/2)+1;
end
end
for i = 1:SY % 训练比特数,每偏移一次,训练SY 个。
u(1,1:fix(bit_extension)) = Channel_sum(1,(i-1)*90+shift:(across+(i-1))*90+shift-1);
for l=1:fix(length(u)/fs)
uu(l) = u(fs*l);
end
% %-----------------画误差曲线图----------------
temp = 0;
temp = abs(Fix_Train(jj,i) - w(:,1)'*uu');
%temp = temp + abs(b(jj,i) - w(:,jj)'*u');
error(1,i) = temp;% 各用户第i个比特训练误差
if(algorithp==1)
pai = uu*P;% for all users
k = pai'/(nmda+pai*uu'); % for all users
w(:,1) = w(:,1) + (Fix_Train(jj,i) - w(:,1)'*uu')*k; % for different users ,RLS
P = (P-k*pai)/nmda; % for all users
elseif(algorithp==0)
if(i<SY/2)
mlms = 0.0032;
else
mlms = 0.0005;
end
w(:,1) = w(:,1) + mlms*(Fix_Train(jj,i) - w(:,1)'*uu')*uu'; % for different users ,LMS
end
end%i
%-------------------change shift------------
error_maxi(1,ii+1)=mean(error(1,SY-300:SY));
error_shift(1,ii+1) = shift;
end%ii
[syn(1,n),temp] = min(error_maxi);
shift_syn(1,n) = error_shift(1,temp);
shift = error_shift(1,temp);
error_maxi(1,1)=syn(1,n);
error_shift(1,1) = shift_syn(1,n);
if abs(stepsize)==1
break;
end
stepsize=fix(abs(stepsize/2));
end%n
syn(1,n)
last_shift(fs,zz,jj) =shift_syn(1,n)
jj
% figure
% hold on;
%
% title('每个用户达到同步时的最大判决误差曲线(Eb/No=dB)');
%
% xlabel('比特数');
%
% ylabel('误差值');
% %for jj=1:K
% plot(error_count(index,:),'r--');
%
% % hold on;
% % plot(error(2,:),'g--');
% %end
% %plot(errord,'g--');
%
% line = ones(1,SY);
%
% plot(line);
end%jj
%========synchronous end ==================================================
Sign_Train_add_B=zeros(K,PN+M+10);
Sign_Train=signalxy(K,PN);
for jj=1:K%K
Sign_Train_add_B(jj,1:PN)=Sign_Train(jj,:);
end
sumsnr=zeros(K,1);
sumerror=0;
errord = zeros(1,repeatnum*M+PN);
data=signalxy10(K,M);%Why?
b = zeros(K,M);
for jj = 1:K
for i = 1:M
% 用户 jj 的第 i 个比特
temp = data(jj,i);%改encoderout!
if temp ==0
b(jj,i) = -1;
else
b(jj,i) = +1;
end
end
Sign_Train_add_B(jj,PN+1:PN+M)=b(jj,:);
end%jj
Channel_across=zeros(K,tailend+90*(PN+M+10));%change length
for jj=1:K%K
for i=1:PN+M
Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))=Channel_across(jj,(i-1)*90+1:(i-1)*90+fix(tailend))+Sign_Train_add_B(jj,i)*Channel_Out_Data(jj,:);
end
end
Channel_sum=sum(Channel_across);%When K>1
%Channel_sum=Channel_across;%When K=1
%-------------------对Channel_sum进行采样---------------------
%fs = input('输入采样速率 fs = ');
% Channel_sum_ts = zeros(1,fix(length(Channel_sum)/fs));
%
% for i=1:fix(length(Channel_sum)/fs)
% Channel_sum_ts(i) = Channel_sum(fs*i);
% end
%-------------------叠加高斯白噪声-------------------
%
% %open = input('是否加入高斯噪声(0-no;1-yes) open = ');
open =1;
%length(Channel_sum_ts);
noise = zeros(1,length(Channel_sum));
%
% tempnoise1 = zeros(1,fix(90/fs));
%
% tempnoise2 = zeros(1,fix(bit_extension/fs));
%
if(open==1) % 考虑高斯噪声
MU = zeros(1,length(Channel_sum));
noise = normrnd(MU,SIGMA);
Channel_sum = Channel_sum+noise;
end
%
u = zeros(1,fix(bit_extension));
uu = zeros(1,fix(bit_extension/fs));
errorT=zeros(K,PN+M);
ben = zeros(1,K); % 每个用户判决错误比特个数
soft_out = zeros(K,M);
total_all = 0; % 所有用户判决错误的总比特数
w = zeros(fix(bit_extension/fs),K); % 重新初使化用户的权值
for jj=13:K%K selected
for i = 1:PN % 训练比特数
u(1,1:fix(bit_extension)) = Channel_sum(1,(i-1)*90+last_shift(fs,zz,jj):(across+(i-1))*90+last_shift(fs,zz,jj)-1);
for l=1:fix(length(u)/fs)
uu(l) = u(fs*l);
end
% %-----------------画误差曲线图----------------
temp = 0;
temp = abs(Sign_Train(jj,i) - w(:,jj)'*uu');
%temp = temp + abs(b(jj,i) - w(:,jj)'*u');
errorT(jj,i) = temp;% 各用户第i个比特训练误差
if(algorithp==1)
pai = uu*P;% for all users
k = pai'/(nmda+pai*uu'); % for all users
w(:,jj) = w(:,jj) + (Sign_Train(jj,i) - w(:,jj)'*uu')*k; % for different users ,RLS
P = (P-k*pai)/nmda; % for all users
elseif(algorithp==0)
if(i<PN/2)
mlms = 0.0032;
else
mlms = 0.0005;
end
w(:,jj) = w(:,jj) + mlms*(Sign_Train(jj,i) - w(:,jj)'*uu')*uu'; % for different users ,LMS
end
end %i
for i = PN+1:PN+M % 训练比特数
u(1,1:fix(bit_extension)) = Channel_sum(1,(i-1)*90+last_shift(fs,zz,jj):(across+(i-1))*90+last_shift(fs,zz,jj)-1);
for l=1:fix(length(u)/fs) %sample
uu(l) = u(fs*l);
end
% %-----------------画误差曲线图----------------
temp = 0;
temp = abs(Sign_Train_add_B(jj,i) - w(:,jj)'*uu');
%temp = temp + abs(b(jj,i) - w(:,jj)'*u');
errorT(jj,i) = temp;% 各用户第i个比特误差
if(Sign_Train_add_B(jj,i)~=sign(uu*w(:,jj)))
ben(jj) = ben(jj) + 1;
total_all = total_all + 1;
end
if(algorithp==1)
pai = uu*P;% for all users
k = pai'/(nmda+pai*uu'); % for all users
w(:,jj) = w(:,jj) + (Sign_Train_add_B(jj,i) - w(:,jj)'*uu')*k; % for different users ,RLS
P = (P-k*pai)/nmda; % for all users
elseif(algorithp==0)
if(i<PN/2)
mlms = 0.0032;
else
mlms = 0.0005;
end
w(:,jj) = w(:,jj) + mlms*(Sign_Train_add_B(jj,i) - w(:,jj)'*uu')*uu'; % for different users ,LMS
end
end %i
end%jj
%errord = zeros(1,repeatnum*M+PN);
ben_rate=ben./(M);
total_all_rate(zz,fs)=total_all/((M)*K);
end%db:zz
end%fs
%
%
%
%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -