Root-Music方法进行频率估计

Root-Music算法是在Music算法的基础上提出的。

Music算法:利用信号子空间和噪声子空间的正交性,构造空间谱函数,通过谱峰搜索,估计信号频率。

具体就是先对信号用矩阵形式表示出来,接着求解相关矩阵,并对其进行特征分解,得出有K个非零特征值,利用剩下的M-K个零特征值得出信号子空间与噪声子空间的正交性。而实际中,自相关矩阵R是估计出来的,因此特征向量本身也带有一定误差,因此最终的公式中有求和(平滑作用)。

Root-Music算法:直接构造函数,并将噪声子空间的向量写成矩阵G,最终将信号频率估计问题转化成了一元高次方程的求根问题。在实际求解时,需要在2(M-1)个根中,找出其中位置最接近单位元的K个根,其相位就是信号频率的估计值。


  • FFT计算自相关函数:补零,FFT,计算功率谱,IFFT得II,然后截取前面m个值N个即为我们的信号自相关函数r(0),r(1)...r(N)
  • 计算相关矩阵:构造M阶相关矩阵来说,对于复值信号来说II的最后M-1即为r(-7)~r(-1),用fliplr()左右镜像为r(-1)~r(-7),II的前M个即为r(0)~r(7),然后就是用toeplitz来计算。。(网上看到好几个用xcorr直接计算相关系数,然后用toeplitz)
%% 计算自相关矩阵(计算时可用FFT计算)
u2=[u,zeros(1,N)];  %将u(n)进行扩展,补N个零
U2=fft(u2);
P=abs(U2).^2/N; %计算功率谱
r2=ifft(P);
r=r2(1:M);%取前M个值 
rc=r2(2*N-M+2:2*N);%取出r(-M+1):r(-1)
rc=[rc,r(1)];%r(-M+1):r(0)
rc=fliplr(rc);%首尾颠倒
Rxx=toeplitz(r,rc)';
  • 对相关矩阵进行特征值分解:因为上面求出的相关矩阵是一个复数类型,matlab调用eig求解后特征值为复数类型(相关矩阵的特征值为非负实数,看了下里面的数都是虚部为0i,然而matlab却还是认为是复数),难道每次都要对特征值取abs吗?      QAQ
  • 得到M-K个特征子空间,即对特征值进行排列,取出最小的M-K个特征值和特征向量。(eigs可解决?)
    if ~issorted(diag(D)) [V,D] = eig(A); [D,I] = sort(diag(D)); V = V(:, I) 
  • 接下来我在想如何把方程写出来,因为这是一个矩阵G,因此变量也得表示成一个向量。。
    syms z
    az = z.^([0:M-1]');
  • 最后对整个表达式进行系数提取(注意的是如果直接提取会报错sym2poly输入非多项式,因为这是含有z的负数次幂,因此可等价转化乘以最低次),并求解,求出来是复数解,找出其中最接近单位圆的K个根(最接近单位圆可能有很多根,最后选的时候稍微隔开几个),这些根的相位angle函数就是信号频率的估计。
    fz = z.^(M-1)*pz1*G*G'*pz;
    % fz=aN*G*G'*aP';如果是这个,在下一步会报错说不是多项式,因为含有z的负数次幂
    factor=sym2poly(fz);
    zx=roots(factor);
    rx=zx.';
    [as,ad]=(sort(abs((abs(rx)-1))));
    frequency=angle(rx(ad([1,3])))./pi


猜你喜欢

转载自blog.csdn.net/ai136172022/article/details/79798350
今日推荐