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

📄 mequal_estimation_bit_improve.m

📁 Convolution_decoder_bit_by_bit for DS-UWB is revising信号模板的估计
💻 M
📖 第 1 页 / 共 4 页
字号:
%-------------------------------------------------------------------------
%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 + -