ESPRIT算法

打算把这个课程里的大部分代码都整理下。

ESPRIT算法

ESPRIT算法,estimating signal parameter via rotational invariance techniques,中文名“基于旋转不变技术的信号参数估计”。

同样的,和Musci,Root-Music算法一样,这类基于相关矩阵特征分解的信号频率估计方法,书上都是基于复正弦加白噪声信号模型:

                                                                 

  • 根据M个时刻的观测值可以表示出向量形式,x(n)=As(n)+v(n);然后定义y(n)=x(n+1),同理写出矩阵形式,并找出y(n)和s(n)的关系:

                                                         

       这里的φ是e^(-jwK)组成的对角矩阵。

  • 求x(n)的自相关(与y(n)的自相关是相等的)和与y(n)的互相关;然后对Rxx进行特征值分解,然后定义两个矩阵:

           

  • 对上面那个矩阵对放在一起并求广义特征值,然后由非零解和矩阵是否奇异得出秩的关系:

                                                            

  • 所以广义特征值恰为φ^H的对角元,其与信号频率有关。

ESPRIT算法代码:在代码中由于相关矩阵都是估计的,对矩阵对进行广义特征值分解时,取的是最接近圆的K个广义特征值。K是由输入向量里有多少个频率得出的。

clear all,close all
N=1000;%样本数
noise=(rand(1,N)+1i*rand(1,N))/sqrt(2);
n=1:1:N;
un(n)=exp(1i*0.5*pi*n+1i*2*pi*rand(1))+exp(-1i*0.3*pi*n+1i*2*pi*rand(1))+noise;
%% 构造自相关矩阵
M=8;
for k=1:N-M
xs(:,k)=un(k+M-1:-1:k).'; %从 k+m-1 一直减到 k 并变为列向量
end
Rxx=xs(:,1:end-1)*xs(:,1:end-1)'/(N-M-1);
Rxy=xs(:,1:end-1)*xs(:,2:end)'/(N-M-1);
%% 利用奇异分解找到最小特征值
[V,D]=svd(Rxx);
ev=diag(D);emin=ev(end);
%% 构造矩阵对,并对其进行特征分解
z=[zeros(M-1,1),eye(M-1);0,zeros(1,M-1)];
Cxx=Rxx-emin*eye(M);
Cxy=Rxy-emin*z;
[V,D]=eig(Cxx,Cxy);
z=diag(D);
w=angle(z)/(2*pi);
err=abs(abs(z)-1);
[Enew,ad] = sort(err); %对其排序,小到大排列
w(ad([1,3]))

你可能感兴趣的:(现代数字信号处理)