📄 mequal_estimation_bit_improve.m
字号:
%-------------------------------------------------------------------------
%Convolution_decoder_bit_by_bit for DS-UWB is revising 060210,已基本完成,没有交织。
% 最近更新时间: 2006/5/19
% 新加入的内容: 信号模板的估计, 信道的变化, 加入自适应均衡,译码反馈用于信号模板估计,消除信道变化的影响,应该是三种方法中收敛最好的。
%-----------------------------------------------------------------------
%以下为定义常量
clear all;close all;
BB=4;%缓存器长度可以修改
tailzerolen=5*BB;
buflength=tailzerolen*3;%取buflength=12 OR 120
nstates=8;
block=1024*1; %change
PN = tailzerolen*20;
num = 1;
datanum=num*(block+PN/2);%num=2
recover_length=0;%以信息长度计,不用了
% M=datanum*2;
repeatnum=8;%==============OUT circulation, different data
iterate=1;%======Inner circulation, same data
% SIGMA =1.7949;%===============================ADD NOISE
%K = input('输入用户数目[1,15] K = ');
K=8;%max=15
Tmin=0.1;
L=15;%一个比特的脉冲个数。
variance_position=zeros(1,K); %信道开始变化时,在整个数据中的位置,可以任意改变
for jj=1:K
variance_position(1,jj)=250+(jj-1)*50;%也可以不变,或随机或有规律变化
end
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
encoder_BER=zeros(6,23);
decoder_BER=zeros(6,23);
% MSE_average=zeros(6,23);
across = 2;
% variance_position = 300;
for var=4:4 %1:6 采样率
zz=0; %for across=2:2
variance_rate=0.1*(var-1); %变化的百分比
fs=1;
for db= -3:0.5:3 %信噪比的变化
SIGMA=sqrt(0.80925/10^(0.1*db));
zz=zz+1;
SUM_decode = 0;
SUM_encode = 0;
for rep =1:repeatnum
%===============================================================================================================
%-------------------对Channel_Out_Data进行采样---------------------
Channel_Out_Data=load('F:\MultiDetection\MultiDetection\Channel3_Out_Data'); %impulse_response_DS.m
tailend=length(Channel_Out_Data(1,:));
%fs = input('输入采样速率 fs = ');
% fs = 1;
%统计信道路径数量
NumOfMultipath=zeros(1,K);
NumOfTimevariance=zeros(1,K);
for ii = 1 : K
for i =1 :tailend
if Channel_Out_Data(ii,i)~=0
NumOfMultipath(ii) = NumOfMultipath(ii)+1;
end
end
end
bit_extension=across*90;
zkj = zeros(K,fix(tailend/fs)); %就是信道加一个单个比特(1)的信号
% for j = 1:K
for i = 1:(fix(tailend/fs))
zkj(1:K,i) = Channel_Out_Data(1:K,fs*i);
end
% end
%plot(zkj(1,:))%经过信道后一个比特的波形。
%------------------------------------------------------------------
% Parse the signal zkj into overlapping segments v
v = zeros(fix(tailend/90)-1,fix(bit_extension/fs),K); %bit_extension=across*90;
for j = 1:K
for i = 1:fix(tailend/90)-(across-1)
for kk = 1:fix(bit_extension/fs)
v(i,kk,j) = zkj(j,kk+(i-1)*fix(90/fs)); % V就是窗口长度截取的数据V(1~20,180,USER),(1 2) (2 3) (3 4)......
end
end
end
%----------------------------------------------------------------
% 分析v信号,找出各个用户的主能量观察窗口以及首尾窗口
datav = zeros(K,3);
for j = 1:K
key = 0; temp1 = 0; temp2 = 0;
for i = 1:fix(tailend/90)-(across-1)%每90(1比特)一个窗口
temp1 = 0;
for kk = 1:fix(bit_extension/fs) %?符号的前10%能量?orignal:fix(18/fs),将18/fs改为180/fs后,性能大大提高。
temp1 = temp1+abs(v(i,kk,j));
end
if(temp1~=0 & key==0)
datav(j,1) = i;% 起始观察窗口序号
datav(j,2) = i;
datav(j,3) = i;
key = 1;
end
if(temp1 > temp2)
temp2 = temp1;
datav(j,2) = i;% 主能量观察窗口序号
datav(j,3) = i;
elseif(temp1~=0)
datav(j,3) = i;% 结尾观察窗口序号
end
end
end
%-------------------求出每比特信号能量----------------
Eb = 0;
for j = 1:K
i = datav(j,2);
for kk = 1:fix(bit_extension/fs)
Eb = Eb + v(i,kk,j)*v(i,kk,j);
end
end
Eb = Eb/K;
%-------------------叠加高斯白噪声-------------------
%open = input('是否加入高斯噪声(0-no;1-yes) open = ');
open =1;
noise = zeros(1,fix(bit_extension/fs));
tempnoise1 = zeros(1,fix(90/fs));
tempnoise2 = zeros(1,fix(bit_extension/fs));
if(open==1) % 考虑高斯噪声
MU = zeros(1,fix(bit_extension/fs));
%---------计算躁声方差-----------
% db = 20;% SNR=20db
% SIGMA = ones(1,bit_extension/fs)*sqrt((Eb/(10^(db/10))));
noise = normrnd(MU,SIGMA);
end
% Nsave = noise;
%-------------------CONVOLUTION ENCODER---------------------------------------------------------
% repeat=0;
% SUM=0;
%for nn=1:repeatnum%=====
data = zeros(K,datanum+buflength/2); %data分3 段,PN/2用于训练,block是数据,buflength/2为最后的全零。
data(1:K,1:datanum)=signalxy10(K,datanum); %调用程序
%interleaving_encode=zeros(K,M);%M必须为256,1024,4096.
for jj =1:K %调用卷积码程序
encoderout(jj,:)=convolutioncode(data(jj,:));%encoderout也是3部分:num*PN用于训练,num*2*block是编码信息,buflength是缓存长度
%interleaving_encode(jj,:)=interleaving(encoderout(jj,:));
%jiaozhi!!!
end
%--------------------------------------------------------------------------
% 产生每个用户的等概率数据比特流{+1,-1}
encoder_positive_nagetive = zeros(K,length(encoderout)+10);
for jj = 1:K
for i = 1: length(encoderout)
% 用户 jj 的第 i 个比特
temp = encoderout(jj,i);
if temp ==0
encoder_positive_nagetive(jj,i+2) = -1;
else
encoder_positive_nagetive(jj,i+2) = +1;
end
end
end
%--------------------------------------------------------------------------
%==============================MMSE==============================
% 采用RLS算法的参数
diat = 1;
nmda = 0.999;
I = eye(fix(bit_extension/fs));
P = zeros( fix(bit_extension/fs),fix(bit_extension/fs),K );
pai=zeros( K, fix(bit_extension/fs) );
k=zeros( fix(bit_extension/fs) , K );
% Wsave = zeros(fix(bit_extension/fs),K); % 初使化用户的权值
% % Wsave = w;
for ppp = 1 : K
P(:,:,ppp) = diat*I;
end
% Psave = P;
%-------------------decoding initialization-------------------
aa = zeros(K,PN/2,nstates);
bb=zeros(K,nstates);
a_temp=zeros(1,nstates);
factor=0;
gama_with_info=0; %r值 分支转移系数
gama_yk0=0;
gama_yk1=0;
%initialize a0,a1,b 书上有对应公式
aa(1:K,1,1)=1;
bb(1:K,1)=1.0/PN;
for i=2:nstates
aa(1:K,1,i)=0;%1.0/len;
bb(1:K,i)=1.0/PN;
end
%compute the gama
judge=zeros(nstates,nstates);
c=zeros(nstates,nstates);
d=zeros(nstates,nstates,2);
%matrix judge[i][j] judge the probability of the state i turn into the state j
judge(1,1)=1;
judge(1,2)=1;
judge(2,3)=1;
judge(2,4)=1;
judge(3,5)=1;
judge(3,6)=1;
judge(4,7)=1;
judge(4,8)=1;
judge(5,1)=1;
judge(5,2)=1;
judge(6,3)=1;
judge(6,4)=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -