📄 spastemat.m
字号:
% This must be an error. %size(elementFactor) elFactorMatrix = diag(sparse(elementFactor)); %elFactorMatrix = sparse(diag(elementFactor)); % This generates a to large matrix% elFactorMatrix = diag(elementFactor);% arrayFactor = exp(thSign*i*2*pi*k'*d/lambda*sin(theta')); arrayFactor = exp(thSign*i*2*pi*dmek'/lambda*sin(theta)); A = full(arrayFactor*elFactorMatrix); % --------------------------------------------------------------------- % % AIMT Experimental Antenna. % % What global variables are used and from where do the come? % expCalVerG (from defant): Version of the calibration compensation % information. % c0 (from defant): The speed of light. % cmpmetGlobal (): % nearfieldMethodFlagGlobal (): % Some more global variables are used in functions called by spastemat. % % Start: 97xxxx Svante Bj鰎klund (svabj). % --------------------------------------------------------------------- % elseif (strcmp(antenna.name,'expAnt')) global expCalVerG if (isempty(expCalVerG)) dbterror('Missing calibration information.') end%if lpSign = +1; % Because Lars has defined angels differently than DBT. % +1 : as Lars and as in dbt (now) at other places. doas = lpSign * doas; if ((expCalVerG == 2) | (expCalVerG == 3)) global c0 global cmpmetGlobal nearfieldMethodFlagGlobal %global Ccmp wctab sphitab wcmedel wcmat frequencyMhz = (c0/lambda)*1e-6; cmpmet = cmpmetGlobal; coupFlag = 1; % An empty matrix indicates a false value. wctabAngles = 19; % A dummy value. %wctabAngles = phitab; distElem = antenna.distElem; noElem = antenna.noElem; sphitest=sin(doas(1,:))'; if (nearfieldMethodFlagGlobal == 1) wnfcmp=eincdbt(sphitest,frequencyMhz,'nearfield'); % Calculate information for compensation of near field. %stest0=exp(j*k0*sphitest*xel).'/sqrt(nel); else %Do not compensate for near field. wnfcmp = []; end%if A0 = exp(j*(2*pi/lambda)*distElem*(0:noElem-1)' *sin(doas(1,:))); % The not compensated steering matrix. % "Utstyrt i sphix vid mittfrekvens" (larpet). % A0 is the steering matrix for an ULA with isotropical elements. % The sign in the exponent is maybe the opposite. A = wscordbt(A0,[],coupFlag,cmpmet,[],wnfcmp,[], doas(1,:)); % Compensate the steering matrix for antenna element coupling, % amplitude and phase drift and near field. end%if expCalVerG% ----------------------------------------------------------------------- %% Antenna Elements (one channel antennas).%% Start: 980607 Svante Bj鰎klund (svabj).% ----------------------------------------------------------------------- % elseif (strcmp(antennaType,'elem')) %disp('spastemat elem') nDoas = size(doas,2); % Number of DOA:s. pType = antenna.patternType; if (strcmp(pType,'isotrop')) A = ones(1,nDoas); elseif (strcmp(pType,'func')) x = doas - repmat(antenna.elemOrient,1,size(doas,2)); A = eval(antenna.patternFunc); % x is the evaluated variable. else error('Illegal pattern type for element.') end%if% ----------------------------------------------------------------------- %% Antenna elements.%% spastevec is called.%% Start: 9xxxxx David Rejdemyhr (davrej).% ----------------------------------------------------------------------- % elseif ( strcmp(antennaType,'elem') ) % This code should never be executed because of the if-branch above. dbtwarning('Calling "spastevec" for antenna elements.') M = size(doas,2); % No DOA:s. noElem = antenna.noElem; % Allways == 1. A = zeros(noElem, M); for n = 1:M A(:,n) = spastevec(antenna, doas(1,n), lambda, focusDist); %A(:,n) = spastevec(antenna, doas(1,n), lambda, focusDist(1,n)); % If there can be different focusing distances to the % different sources, the commented line can be used. end%for% ----------------------------------------------------------------------- %% ULA and LA.%% spastevec is called.%% Start: 9xxxxx David Rejdemyhr (davrej).% ----------------------------------------------------------------------- % elseif (strcmp(antennaType,'ULA') | strcmp(antennaType,'LA')) old = 1; if (old) %disp('Use spastevec') %dbtwarning('Calling "spastevec" for ULA or LA.') M = size(doas,2); % No DOA:s. noElem = antenna.noElem; A = zeros(noElem, M); for n = 1:M A(:,n) = spastevec(antenna, doas(1,n), lambda, focusDist); %A(:,n) = spastevec(antenna, doas(1,n), lambda, focusDist(1,n)); % If there can be different focusing distances to the % different sources, the commented line can be used. end%for elseif (0) noElem = antenna.noElem; if (strcmp(antennaType,'ULA')) distElem = antenna.distElem; elemPos = distElem*(0:noElem-1).'; else elemPos = antenna.elemPos; end%if a = exp(thSign*j*2*pi*(elemPos/lambda)*sin(doas(1,:))); % Array faktor. w = antenna.element.beamSpaceTrans; %a = a * (w' * spastevec(antenna.element, doas, lambda, focusDist)); a = a * (w' * spastemat(antenna.element, doas, lambda, focusDist)); else end%if (old)% ----------------------------------------------------------------------- %% Array antenna.%% Start: 980515 Svante Bj鰎klund (svabj).% ----------------------------------------------------------------------- % elseif (strcmp(antennaType,'array')) if iscell(antenna.element) % If not the same definition of all elements. Asub = spastemat(antenna.element, doas, lambda, focusDist, pointSubDoa); % Or a loop. Will this be faster? else % Identical elements. Asub = repmat(spastemat(antenna.element, doas, lambda, focusDist, ... pointSubDoa), antenna.noElem,1); % Any way to avoid a whole matrix Asub and to gain execution time? end%if scanPhases = repmat(-1*antenna.elemPos.'*doa2wavevec(pointSubDoa,lambda),... 1,size(doas,2)); % "The array factor is maximum when the far-field contributions from % elements add in phase." ([6] p. 161). When the far-field contributions % from elements add in phase, the phase differences between elements % in the array factor are zero. AF = exp(-1*thSign * j * (antenna.elemPos.' * doa2wavevec(doas,lambda) ... + scanPhases)); %if (isempty(antenna.beamSpaceTrans)) A = AF.*Asub; %else % This does not work because the antenna definition field %"noElem" is wrong. Shall "noElem" mean number of channels in or out? % %size(antenna.beamSpaceTrans),size(AF),size(Asub) % A = antenna.beamSpaceTrans' * (AF.*Asub); %end%if;if(0)% ----------------------------------------------------------------------- %% Array antenna with beamforming.%% Start: 980530 Svante Bj鰎klund (svabj).% ----------------------------------------------------------------------- % elseif (strcmp(antennaType,'BFArray')) % ... As antenna type 'array'. %A = AF.*(antenna.beamSpaceTrans' * Asub); A = antenna.beamSpaceTrans' * (AF.*Asub);end%if(0)% ----------------------------------------------------------------------- %% Beamforming virtual antenna%% Start: 980520 Svante Bj鰎klund (svabj).% ----------------------------------------------------------------------- % elseif (strcmp(antennaType,'beamform')) Asub = spastemat(antenna.element, doas, lambda, focusDist, pointSubDoa); A = antenna.beamSpaceTrans' * Asub;% ----------------------------------------------------------------------- %% The else branch.% ----------------------------------------------------------------------- % else error('DBT-Error: Not implemented for desired antenna type.') end%if name% ----------------------------------------------------------------------- %% Normalization of the steering matrix.% ----------------------------------------------------------------------- %if (0) %disp('Normalizing A...') %r2d(doas(:,[1, 2, end-1, end])) %A(:,[1, 2, end-1, end]) %ANorm = vecnorm2(A); %A = weightcols(A, 1./ANorm); %diag(A'*A).' %A(:,[1, 2, end-1, end])end%if (0)end%if iscell(antenna)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -