ESPRIT

​ 假设D个中心频率相同的远场窄带信号入射到一个M个阵元的均匀圆阵列中,则按逆时针来看,第l个阵元输出为

x l ( t ) = k = 1 D s k ( t ) e c o s φ k c o s ( 2 π ( l 1 ) M θ k ) + n l ( t )

其中 s k ( t ) 表示第 k 个源信号, θ k , φ k 分别表示第 k 个信号的俯仰角和方位角, n l ( t ) 表示第 l 个阵元上的噪声。将上式写成矩阵形式
X ( t ) = A S ( t ) + N ( t )

其中 X ( t ) = [ x 1 ( t ) , , x M ( t ) ] T 为阵元的输出矢量, N ( t ) = [ n 1 ( t ) , , n M ( t ) ] T 为加性白噪声矢量, S ( t ) = [ s 1 ( t ) , , s D ( t ) ] T 表示源信号矢量, A = [ a ( θ 1 , φ 1 ) , , a ( θ D , φ D ) ] 表示阵列方向矩阵。并且其中 a ( θ k , φ k ) = [ a 1 ( θ k , φ k , , a M ( θ k , φ k ) ) ] T , a l ( θ k , φ k ) = e i 2 π c o s ( φ k ) c o s ( 2 π ( l 1 ) M θ k ] )

​ 因为环阵结构并不能直接利用ESPRIT算法去进行测向,因而需要进行波束空间转换,从而利用贝塞尔函数的递归关系构造等式,从而进行测向。假设经过转换矩阵 F o H ,将均匀圆阵导向矢量变换成为 b ( θ , φ ) ,那么转换矩阵的具体定义可以表示为

F o H = C o C v V H

其中相应的矩阵具体定义为

C 0 = d i a g { ( 1 ) N , , ( 1 ) 1 , , 1 N } C v = d i a g { j N , , j 1 , , j N } V = M [ w N , , w N ] w m H = 1 M [ 1 , e j 2 π m / M , , e j 2 π m ( M 1 ) / V ]

其中 N 表示所能激励的最大阶数。那么我们可以得到 b ( θ , φ ) 的具体表达式为
b ( θ , φ ) = F o H a ( θ , φ ) = M J η v ( φ )

这里 v ( φ ) = [ e j N φ , , 1 , , e j N φ ] , J η = d i a g { J N ( η ) , , J N ( η ) } 其中 η 的具体表达式为 η = k r s i n θ ,然后我们从 b ( θ , φ ) 抽取三个大小为 2 N 1 ,让 b 0 , b 1 , b 1 分别表示 b ( θ , φ ) 的最后 2 N 1 的元素、中间 2 N 1 以及前面 2 N 1 元素,根据贝塞尔函数的递归关系
J m 1 ( ξ ) + J m + 1 ( ξ ) = 2 m ξ ( ξ )

我们可以得到关系
Ξ b 0 = ζ b 1 + ζ b 1

其中 ξ = s i n θ e j φ , Ξ = ( λ / r ) d i a g { ( N 1 ) , , N 1 } ,然后对我们阵元所接收到信号求相关矩阵,得到信号子空间 S u 和噪声子空间.根据参考文献[1]

这里写图片描述

最后得到 θ i , φ i 就是我们需要的测向角。相应的代码如下

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.

猜你喜欢

转载自blog.csdn.net/wilder_ting/article/details/80294587