假设D个中心频率相同的远场窄带信号入射到一个M个阵元的均匀圆阵列中,则按逆时针来看,第l个阵元输出为
其中 表示第 个源信号, 分别表示第 个信号的俯仰角和方位角, 表示第 个阵元上的噪声。将上式写成矩阵形式
其中 为阵元的输出矢量, 为加性白噪声矢量, 表示源信号矢量, 表示阵列方向矩阵。并且其中
因为环阵结构并不能直接利用ESPRIT算法去进行测向,因而需要进行波束空间转换,从而利用贝塞尔函数的递归关系构造等式,从而进行测向。假设经过转换矩阵
,将均匀圆阵导向矢量变换成为
,那么转换矩阵的具体定义可以表示为
其中相应的矩阵具体定义为
其中 表示所能激励的最大阶数。那么我们可以得到 的具体表达式为
这里 其中 的具体表达式为 ,然后我们从 抽取三个大小为 ,让 分别表示 的最后 的元素、中间 以及前面 元素,根据贝塞尔函数的递归关系
我们可以得到关系
其中 , ,然后对我们阵元所接收到信号求相关矩阵,得到信号子空间 和噪声子空间.根据参考文献[1]
最后得到 就是我们需要的测向角。相应的代码如下
clear all;
close all;
j=sqrt(-1);
% ======= elevation and azimuth in degree ======== %
azimuth = [-35 -40 -15 13 19 ]; % from -180 - 180
elevation = [ 60 41 28 17 2]; % from 0 - 90
% ================================================ %
snapshot = 512;
n = size( azimuth, 2 ); % number of signals
SNR = 20;
P = 10.^(SNR/10);
Ps = diag( ones( 1, n )*P ) ; % power of singal
Pn = 1; % power of noise
N = 13; % number of sensors N > 2n , test for N = 5, 6 ,8 , 10 ,...
Border = 6;%ceil(N/2);%5;%6; % order of first kind Bessel function
if Border > N/2
Border = Border - 1;
end
M = -Border : Border;
M1 = 2*Border + 1;
Ntry = 200;
for mm = 1:Ntry
% X is an observation data
X = ucadata( azimuth ,elevation ,Ps,snapshot,Pn,N);
Rx = X*X'/snapshot; % Covariance of observation datas
temp1 = ones( N,1 )*M;
R = 2*pi*j*[ 0: N-1 ]'/N ;
temp2 = R*ones( 1, M1 );
Wm = exp( temp1.*temp2 )/N; % Weight matrix wm
Cv = diag(j.^( -abs( M ) ) );
V = sqrt( N )*Wm; % Weight matrix V
FeH = Cv*V'; % Eq.( 9 ) in reference
alpha = 2*pi*M/M1;
alpha = ones( M1, 1 )*alpha;
temp3 = M'*ones( 1,M1 );
W = exp( j*temp3.*alpha )/sqrt( M1 ); % Weight matrix
FrH = W'*FeH; % Real Beam Former
Ry = FrH*Rx*FrH';
Rr = real( Ry ); % Real Beam space covariance matrix
% [ U, D, Vec ] = svd( Rr );
[Vec, Deig] = eig(Rr);
S = Vec( :, 1: n ); % Real Beam space signal subspace
% G = Vec( :, n + 1 : end ); % Real Beam space noise subspace
Co = diag( [( -1 ).^( [ Border:-1:1 ]) ones( 1, M1 - Border ) ] );
% FoH = Co*W*FeH;
So_hat = Co*W*S;
% ---------------------------------- %
Me = M1 - 2;
S_1 = So_hat( 1: Me,: );
S0 = So_hat( 2: Me + 1,: );
temp = abs( 2 - Border : Border );
D = diag( (-1).^temp );
In = zeros( Me,Me );
for i = 1:Me
In(i, Me +1-i) = 1;
end
E2 = D*In*( conj( S_1 ) ); %
E = [ S_1,E2 ];
T = diag( [ -( Border - 1 ):( Border - 1 ) ] )/pi;
Ls = E\( T*S0 );
y = Ls( 1:end/2 , : )';
[ Ui, Vi ] = eigs( y );
EV = diag( Vi );
AZIMUTH(mm,:) = ( angle( EV ) * 180 /pi )';
ELEVATION(mm,:) = ( asin( abs( EV ) ) * 180/pi )';
end
AzimuthMean = mean(AZIMUTH);
ElevationMean = mean(ELEVATION);
clc
fprintf( ' @----------------------------- UCA ESPRIT -----------------------------@\n ' );
Info = sprintf('Number of elements = %d \nNumber of snapshots = %d \nNumber of signals = %d \nSNR = %d dB \nBessel = %d ',N ,snapshot,n ,SNR,Border)
fprintf( 'Original Angles are as follows: ( in degree )\n' ),
azimuth,elevation
fprintf( ' @---------------------------- Simulation Result ---------------------------@ \n' );
fprintf( 'Estimated Angles are as follows: ( in degree )\n' ),
AzimuthMean, ElevationMean
fprintf( 'Maximum Estimation Error are as follows: ( in degree )\n' ),
AzimuthMaxError = max(abs(sort(AzimuthMean) - sort(azimuth))),
ElevationMaxError = max(abs(sort(ElevationMean) - sort(elevation)))
fprintf( ' @---------------------------------- END -----------------------------------@ ' );
相应的结果如下
reference
[1] C. P. Mathews and M. D. Zoltowski, “Eigenstructure techniques for 2-D angle estimation with uniform circular arrays,” in IEEE Transactions on Signal Processing, vol. 42, no. 9, pp. 2395-2407, Sep 1994.