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

📄 scm.m

📁 3gpp信道模型代码
💻 M
📖 第 1 页 / 共 2 页
字号:
        BsGainIsScalar=1;        
    else
        BsGainPatternInterpolated=repmat(BsGainPattern, [NumLinks S N M]);
        BsGainIsScalar=1;
    end
end

if numel(MsGainPattern)>1
    if (strcmp(ScmOptions,'polarized')==1)
        MsGainPatternInterpolated=zeros([2 U size(aoas)]);% [polarizations(2) elements links N(6) M(20)]
        MsGainPatternInterpolated(1,:,:,:,:)=feval(InterpFunction,squeeze(MsGainPattern(:,1,1,:)),MsGainAnglesAz,aoas, InterpMethod); % V
        MsGainPatternInterpolated(2,:,:,:,:)=feval(InterpFunction,squeeze(MsGainPattern(:,2,1,:)),MsGainAnglesAz,aoas, InterpMethod); % H
        MsGainPatternInterpolated=permute(MsGainPatternInterpolated,[3 2 1 4 5]); % [link Ms_element polarization path subpath]
    else
        MsGainPatternInterpolated=feval(InterpFunction,squeeze(MsGainPattern(:,1,1,:)),MsGainAnglesAz,aoas, InterpMethod); % V only
        MsGainPatternInterpolated=permute(MsGainPatternInterpolated,[2 1 3 4]);
    end
else    % if MsGainPattern is scalar
    if (strcmp(ScmOptions,'polarized')==1)
        MsGainPatternInterpolated=repmat(MsGainPattern, [NumLinks U 2 N M]);    % [link rx_element polarization path subpath]
        MsGainIsScalar=1;
    else
        MsGainPatternInterpolated=repmat(MsGainPattern, [NumLinks U N M]);
        MsGainIsScalar=1;
    end
end

% Note: The gain patterns at this point have size(MsGainPatternInterpolated) = [link rx_element path subpath]
%  OR
% size(MsGainPatternInterpolated) = [link rx_element polarization path subpath]
% (the same for BsGainPatternInterpolated)

% Do antenna field pattern interpolation for the LOS path
if (strcmp(ScmOptions,'los')==1)
    if numel(BsGainPattern)>1
        BsGain_Theta_BS= feval(InterpFunction,squeeze(BsGainPattern(:,1,1,:)),BsGainAnglesAz,ThetaBs(:), InterpMethod); % V only
        BsGain_Theta_BS= BsGain_Theta_BS.'; % size()= [NumLinks S]
    else
        BsGain_Theta_BS=repmat(BsGainPattern,[NumLinks S]);
    end
    
    if numel(MsGainPattern)>1
        MsGain_Theta_MS= feval(InterpFunction,squeeze(MsGainPattern(:,1,1,:)),MsGainAnglesAz,ThetaMs(:), InterpMethod); % V only 
        MsGain_Theta_MS= MsGain_Theta_MS.'; % size()= [NumLinks U]
    else
        MsGain_Theta_MS= repmat(MsGainPattern,[NumLinks U]);
    end
else 
    % Set dummy values in case LOS option is not used
    BsGain_Theta_BS=NaN;
    MsGain_Theta_MS=NaN;
    
end





% CHANNEL MATRIX GENERATION
[H delta_t FinalPhases FinalPhases_LOS drift_delays] = scm_core( scmpar,...
                                                    linkpar,...
                                                    antpar,...
                                                    bulkpar,...
                                                    BsGainPatternInterpolated,...
                                                    BsGain_Theta_BS,...             % gain of LOS path
                                                    MsGainPatternInterpolated,...
                                                    MsGain_Theta_MS,...             % gain of LOS path
                                                    0,...                            % offset time (not used typically)
                                                    BsGainIsScalar,...      
                                                    MsGainIsScalar);

% final phases
bulkpar.subpath_phases=FinalPhases;

if strcmpi(scmpar.DriftDelaysAngles,'yes')==true
    bulkpar.delays=drift_delays;
end

% time sampling grid
bulkpar.delta_t=delta_t;

[U S N T K]=size(H);

% If path loss and shadowing are to be multiplied into the output
if ( (strcmp(PathLossModelUsed,'yes')==1) || strcmp(ShadowingModelUsed,'yes')==1 )
    
    if (K==1) % only one link
        if (strcmpi(PathLossModelUsed,'yes')==1)
            H=sqrt(bulkpar.path_losses).*H;   % path loss in linear scale
        end
        
        if strcmpi(ShadowingModelUsed,'yes')==1
            if strcmpi(DriftShadowFading,'yes')==0
                H=H*sqrt(bulkpar.shadow_fading);           % shadow fading in linear scale
            else    % time-variant shadow fading
                Hmat=reshape(H,U*S*N,T);  % a matrix with NumLinks cols
                if nargin>3     % initial values given
                    [sf_proc, sf_final]=sfad(scmpar,linkpar, initvalues.sf_init);
                    sf_mat=diag(sparse(sqrt(sf_proc)));    % shadow fading is in linear scale 
                    Hmat=Hmat*sf_mat;           % multiply shadow fading into each link
                    
                else
                    [sf_proc, sf_final]=sfad(scmpar,linkpar);
                    sf_mat=diag(sparse(sqrt(sf_proc)));    % shadow fading is in linear scale 
                    Hmat=Hmat*sf_mat;           % multiply shadow fading into each link
                    
                end
                
                H=reshape(Hmat,U,S,N,T);      % put back to original size
                bulkpar.sf_init=sf_final;    
            end
            
            
        end
        
    else    % if more than one link
        
        if (strcmpi(PathLossModelUsed,'yes')==1)
            Hmat=reshape(H,U*S*N*T,K);  % a matrix with NumLinks cols
            pl_mat=diag(sparse(sqrt(bulkpar.path_losses))); 
            Hmat=Hmat*pl_mat;           % multiply path loss into each link
            H=reshape(Hmat,U,S,N,T,K);      % put back to original size

        end
        
        if (strcmpi(ShadowingModelUsed,'yes')==1)
            if strcmpi(DriftShadowFading,'yes')==0
                Hmat=reshape(H,U*S*N*T,K);  % a matrix with NumLinks cols
                sf_mat=diag(sparse(sqrt(bulkpar.shadow_fading)));    % shadow fading is in linear scale 
                Hmat=Hmat*sf_mat;           % multiply shadow fading into each link
                H=reshape(Hmat,U,S,N,T,K);      % put back to original size

            else
                if nargin>3     % initial values given
                    
                    [sf_proc, sf_final]=sfad(scmpar,linkpar, initvalues.sf_init);
                    for q=1:K
                        Hmat=reshape(H(:,:,:,:,q),U*S*N,T);  % a matrix with NumLinks cols
                        sf_mat=diag(sparse(sqrt(sf_proc(q,:))));    % shadow fading is in linear scale 
                        Hmat=Hmat*sf_mat;           % multiply shadow fading into each link
                        H(:,:,:,:,q)=reshape(Hmat,U,S,N,T);      % put back to original size
                    end
                else
                    [sf_proc, sf_final]=sfad(scmpar,linkpar);
                    for q=1:K
                        Hmat=reshape(H(:,:,:,:,q),U*S*N,T);  % a matrix with NumLinks cols
                        sf_mat=diag(sparse(sqrt(sf_proc(q,:))));    % shadow fading is in linear scale 
                        Hmat=Hmat*sf_mat;           % multiply shadow fading into each link
                        H(:,:,:,:,q)=reshape(Hmat,U,S,N,T);      % put back to original size
                    end
                    
                end
                bulkpar.sf_init=sf_final;
                
            end
        end
        
        
    end
    
end
    
    
% GENERATE OUTPUT
no=nargout;
if (no>1)
    delays=bulkpar.delays;
end

if (no>2)
    switch lower(ScmOptions)
        case {'none','urban_canyon','polarized'}
            full_output=bulkpar;
            
        case ('los')
            bulkpar.Phi_LOS=FinalPhases_LOS;
            full_output=bulkpar;
            
    end
end
    






%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% A function that maps inputs from (-inf,inf) to (-180,180)
function y=prin_value(x)
y=mod(x,360);
y=y-360*floor(y/180);



function [sf_proc, Zfinal]=sfad(scmpar,linkpar, varargin)
% SFAD Generate lognormal shadow fading process
% P=SFAD(SCMPAR,LINKPAR) returns lognormal shadow fading processes with
% standard deviation and correlation distance defined in [2]. P is a K x N
% matrix, where K is the number of links and N=scmpar.NumTimeSamples.
%
% [P FINAL]=SFAD(SCMPAR,LINKPAR,INIT) uses the initial state INIT for generating
% shadow fading. INIT is a Kx1 vector. FINAL is a Kx1 vector of final
% conditions.
%
%   Ref. [2]:   D. Baum et al, "An Interim Channel Model for Beyond-3G
%               Systems", VTC'2005 spring

%   Authors: Pekka Ky鰏ti, Jari Salo
%   $Revision= 0.11$, $Date: May 19, 2005$


K=length(linkpar.MsBsDistance);
MsVelocity = linkpar.MsVelocity;  % This is needed in UniformTimeSampling case
UniformTimeSampling = scmpar.UniformTimeSampling;
SampleDensity = scmpar.SampleDensity;
CenterFrequency = scmpar.CenterFrequency;
N = scmpar.NumTimeSamples;
Scenario=scmpar.Scenario;
ScmOptions=scmpar.ScmOptions;

SpeedOfLight = 2.99792458e8;

% Calculate channel sampling distance in meters
if strcmpi(UniformTimeSampling,'no')
    % Distance per channel sample: ds = v*1/fs = c/(2*SD*fc)
    ds = SpeedOfLight/(2*SampleDensity*CenterFrequency);
    ds=repmat(ds,K,1);
else    % Channel time sampling according to highest MSvelocity
    SD = SampleDensity*max(MsVelocity)./MsVelocity';
    % Distance per channel sample: ds = v*1/fs = c/(2*SD*fc)
    ds = SpeedOfLight./(2*SD*CenterFrequency);
end



switch lower(Scenario)
    % See [2].
    case 'urban_micro'
        CorrDist=5;     % in meters
        
        switch ScmOptions
            case {'none', 'polarized', 'urban_canyon'}
                SFstd=10;       % in dB
            case 'los'
                SFstd=4;        % in dB
        end
        
    case 'urban_macro'
        CorrDist=50;     % in meters
        switch ScmOptions
            case {'none', 'polarized', 'urban_canyon'}
                SFstd=10;       % in dB
            case 'los'
                SFstd=4;        % in dB
        end
        
    case 'suburban_macro'
        CorrDist=250;     % in meters
        switch ScmOptions
            case {'none', 'polarized', 'urban_canyon'}
                SFstd=10;       % in dB
            case 'los'
                SFstd=4;        % in dB
        end
end


% Generate iid Gaussian SF sequences (KxN)
uncorr = randn(K,N);

if length(varargin)==0      % if initial state not given
    Zinit = randn(K,1);      % IIR filter initial state
else                        % if initial state given
    Zinit=10*log10(varargin{1});  
    if ~isfinite(Zinit)
        warning('Non-finite shadow fading initialization!')
    end
end

corr = zeros(K,N);

% Get proper IIR coefficients for K links
lambda = exp(-ds./CorrDist*log(2));
forwcoeff = SFstd.*sqrt(1-lambda.^2);
backwcoeff = [ones(K,1) -lambda];

for k=1:K
    [corr(k,:),Zfinal(k)] = filter(forwcoeff(k),backwcoeff(k,:),uncorr(k,:),Zinit(k));
end
    

Zfinal=10.^(0.1*Zfinal(:));     % to lognormal 
sf_proc=10.^(0.1*corr);      % to lognormal




% %%%%%%%%%%%%%%%%
% %%%%%%%%%%%
% %%%%%%%%
% %%%%%        That's all folks !!!
% %%
% %

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -