📄 scm.m
字号:
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 + -