├── Main_Overhead.m ├── ULAdictionaryGeneralize.m ├── README.md ├── vec.m ├── Muturalance_correlance.m ├── CS_MMV_SOMP.m ├── ChannelGenralize.m ├── CSMUSIC_AOD_Estimation.m ├── RIS_SequenceOptimization.m ├── SMJCE.m └── SMJCE_iteration.m /Main_Overhead.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayJieChen/ChannelEstimation-RIS-MUmmWAVe-MIMO-Systems/HEAD/Main_Overhead.m -------------------------------------------------------------------------------- /ULAdictionaryGeneralize.m: -------------------------------------------------------------------------------- 1 | function Dictionary=ULAdictionaryGeneralize(Dimension,NumResolu) 2 | Dictionary=zeros(Dimension,NumResolu); 3 | for ite=1:1:NumResolu 4 | Dictionary(:,ite)=(sqrt(1/Dimension)*exp(-1j*2*pi*(-0.5+(ite-1)/NumResolu)*[0:Dimension-1])).'; 5 | end 6 | end -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChannelEstimation-RIS-MUmmWAVe-MIMO-Systems 2 | This repository contains the main source codes of the proposed algorithm (S-MJCE) in the paper ``Channel Estimation for Reconfigurable Intelligent 3 | Surface Aided Multi-User mmWave MIMO Systems'' published in IEEE Transactions on Wireless Communications. 4 | -------------------------------------------------------------------------------- /vec.m: -------------------------------------------------------------------------------- 1 | function v = vec( x ) 2 | 3 | % VEC Vectorize. 4 | % VEC(X), where X is a vector, matrix, or N-D array, returns a column vector 5 | % containing all of the elements of X; i.e., VEC(X)=X(:). 6 | 7 | v = reshape( x, numel( x ), 1 ); 8 | 9 | % Copyright 2005-2016 CVX Research, Inc. 10 | % See the file LICENSE.txt for full copyright information. 11 | % The command 'cvx_where' will show where this file is located. 12 | -------------------------------------------------------------------------------- /Muturalance_correlance.m: -------------------------------------------------------------------------------- 1 | function [Number_random,MeanC,varC]=Muturalance_correlance(Gr,V,Dr,xbins1) 2 | ind=1:1:Gr; 3 | ind=(ind-1)*Gr+ind; 4 | Dic=V'*Dr; 5 | for ite=1:1:Gr 6 | Dic(:,ite)=Dic(:,ite)./norm(Dic(:,ite)); 7 | end 8 | Grammatrix=(Dic'*Dic); 9 | vecGrammatrix=abs(vec(Grammatrix)); 10 | vecGrammatrix(ind)=[]; 11 | % yy2=dsort(vecGrammatrix); 12 | [Number_random,~]=hist(vecGrammatrix,xbins1); 13 | MeanC=mean(vecGrammatrix); 14 | varC=var(vecGrammatrix); 15 | end -------------------------------------------------------------------------------- /CS_MMV_SOMP.m: -------------------------------------------------------------------------------- 1 | function Inedxk=CS_MMV_SOMP(z_bk2,Dmatrixo,yita) 2 | 3 | [length01,length2]=size(Dmatrixo); 4 | 5 | Rk=z_bk2; 6 | AMplitude=zeros(length2,1); 7 | 8 | Dmatrix=Dmatrixo; 9 | for ii=1:1:length2 10 | AMplitude(ii)=sqrt(real(Dmatrixo(:,ii)'*Dmatrixo(:,ii)));% norm(D_matxo(:,ii),2); 11 | if AMplitude(ii)<=1e-12 12 | AMplitude(ii)=1; 13 | else 14 | Dmatrix(:,ii)=Dmatrixo(:,ii)/AMplitude(ii); 15 | end 16 | end 17 | 18 | IdentiMatrix=diag(ones(length01,1)); 19 | InedxOmega_k=zeros(1,length2); 20 | for iteSup=1:1:length2 21 | erv=sum(abs(Dmatrix'*Rk).^2,2); 22 | [~,jmax]=max(erv); 23 | InedxOmega_k(1,jmax(1))=1; 24 | Inedxk=find(InedxOmega_k(1,:)==1); 25 | it=0; 26 | while rank(Dmatrix(:,Inedxk))MDL_value_bef 34 | break 35 | end 36 | end 37 | 38 | 39 | r=min(min(MDLk-1,NM),N_bpilot);%===!!=== 40 | ChannelSubpace=S_CovarianceZ_Trans(:,1:r); 41 | R_reduce=sum(CovarianceZ_eigvalue_Trans(r+1:end)); 42 | end -------------------------------------------------------------------------------- /RIS_SequenceOptimization.m: -------------------------------------------------------------------------------- 1 | 2 | function LISpilotO=RIS_SequenceOptimization(System,N_bpilot) 3 | Gr=System.Gr; 4 | Dr=System.Dr; 5 | NL=System.NL; 6 | xbins1=0:0.01:0.09; 7 | LISpilot=sqrt(0.5)*(normrnd(0,1,NL,N_bpilot) + 1j*normrnd(0,1,NL,N_bpilot));%1-ny-nsignalzeros(n_signal,1);% 8 | while rank(LISpilot)0)); 24 | cur=inf; 25 | for ite=1:1:1 26 | cuf=cur; 27 | for jj=1:1:CA0 28 | Tamma=Sxtrans'*LISpilot; 29 | VV=diag(valuemaxtoimin)*Tamma; 30 | Ej=CA0.*diag(valuemaxtoimin)-VV*VV'+VV(:,jj)*VV(:,jj)'; 31 | [Sj,Vj,~]=eig(Ej); % 32 | [c1,~]=find(real(Vj)==(max(max(real(Vj))))); 33 | temvec=LISpilot(:,jj); 34 | for ii=1:1:CA2 35 | temvec(ii)=Sj(ii,c1(1))*sqrt(Vj(c1(1),c1(1)))/valuemaxtoimin(ii); 36 | end 37 | LISpilot(:,jj)=Sxtrans*temvec; 38 | LISpilot(:,jj)= LISpilot(:,jj)./abs(LISpilot(:,jj)); 39 | end 40 | [~,cur,~]=Muturalance_correlance(Gr,LISpilot,Dr,xbins1); 41 | if cur=0%real(trace(X_cur*X_cur'*DiagnolaValue))>real(trace(CovarianceZ_est'*((Dt_opt*DiagnolaValue_inv*Dt_opt')^(-1))*CovarianceZ_est)) 89 | break 90 | end 91 | if flag==1 92 | break 93 | end 94 | end 95 | 96 | if flag==1 97 | break 98 | end 99 | 100 | if itegradient1.7*G_hatini %heuristically 118 | alphaAll=A_all_ini; 119 | Xall=X_curini; 120 | end 121 | end 122 | 123 | 124 | 125 | 126 | --------------------------------------------------------------------------------