本文首發在我的個人博客,http://www.weekreport.cn/archives/440,歡迎來踩。
1.MUSIC算法簡介
MUSIC算法由R.O.Schmidt在1979年提出,該算法利用了信號的頻率向量和噪聲子空間的正交性構造空間譜函數,通過譜峯搜索來估計信號頻率。
MUSIC算法需要構造掃描函數如下:P^MUSIC(w)=aH(w)GGHa(w)1=∑i=K+1M∣aH(w)ui∣21,wϵ[−π,π]
上式中,M代表信號自相關矩陣的階數,K代表頻率源個數,aw=⎣⎢⎢⎢⎡1e−jw⋮e−j(M−1)w⎦⎥⎥⎥⎤是信號頻率向量;ui是信號自相關矩陣的特徵向量,可以看到我們只取後(M−K)個特徵值對應的特徵向量,即最小的(M-K)個特徵值對應的特徵向量(噪聲子空間)。
MUSIC算法就是在掃描w,理想情況下w掃描到信號頻率點時aH(w)GGHa(w)=0。
在實際工程中,由於使用信號樣本的時間自相關R^代替R進行特徵分解,所以aH(w)GGHa(w)在信號頻率點處並不嚴格爲0,而是一個很小的值,於是P^MUSIC(w)在該頻率點的值較大。
所以P^MUSIC(w)的峯值的位置反映了信號的頻率值,但P^MUSIC(w)並不是信號的功率譜,所以通常將它稱之爲僞譜或MUSIC譜。
1.1 MUSIC算法步驟
- 根據觀測樣本值x(0),x(1),⋯,x(N−1),估計自相關矩陣R^ϵCM×M。
- 對R^進行特徵分解,得到M−K個最小特徵值對應的特徵向量,構造矩陣G。
- 在[−π,π]內改變w,計算P^MUSIC(w),峯值位置就是信號角頻率的估計值。
2.ROOT−MUSIC算法
MUSIC算法通過搜索w來估計信號頻率,實質上是做了一個頻率的遍歷,ROOT−MUSIC算法將MUSIC算法aw=⎣⎢⎢⎢⎡1e−jw⋮e−j(M−1)w⎦⎥⎥⎥⎤中的ejw看作複數z,則可以得到:aH(w)GGHa(w)=aH(z)GGHa(z)=0(1)
所以,zk=ejwk,k=1,⋯,K(信號的K個頻率點),就是方程(1)的根,信號頻率的估計由搜索/遍歷問題轉化成了一元高次方程的求根問題,這也是該算法被叫做ROOT−MUSIC的原因。
將方程(1)做變換以後可以得到修正後的方程如下:aT(z−1)GGHa(z)=0(2)
方程(2)共有2(M−1)個根,但只有位於單位圓上的K個根纔是需要的解。
在實際應用中,使用有限時間樣本信號的時間自相關矩陣R^代替隨機信號的統計自相關矩陣R,所以求解方程(2)得到的K個根並不準確位於單位圓上,而是位於單位圓附近,所以求解方程後應該找最接近單位圓的K個根,這些根就是信號頻率的估計。
2.1 ROOT−MUSIC算法步驟
- 根據觀測樣本值x(0),x(1),⋯,x(N−1),估計自相關矩陣R^ϵCM×M。
- 對R^進行特徵分解,得到M−K個最小特徵值對應的特徵向量,構造矩陣G。
- 求解方程(2),找出其中最接近單位圓的K個根,這些根的相位就是信號頻率的估計。
3.算例
設隨機過程u(n)爲u(n)=ej0.5πn+jϕ1+e−j0.3πn+jϕ2+vn,其中,vn是0均值,方差爲1的白噪聲,ϕ1、ϕ2是相互獨立並在[0,2π]上服從均勻分佈的隨機相位,使用MUSIC算法和ROOT−MUSIC算法進行信號頻率估計。
4.Matlab仿真結果
5.Matlab代碼實現
MUSIC算法和ROOT−MUSCI算法具體實現如下,點擊下載源碼!
N=1000;%信號樣本數
noise=(randn(1,N)+1j*randn(1,N))/sqrt(2);%產生噪聲
%產生信號
c1=2*pi*rand;
c2=2*pi*rand;
signal1=exp(1j*(0.5*pi*(0:N-1)+c1));
signal2=exp(1j*(-0.3*pi*(0:N-1)+c2));
%觀察樣本
s=signal1+signal2+noise;
M=8;%自相關矩陣的階數
for i=1:N-M
xx(:,i)=s(i+M-1:-1:i).'; %構造樣本矩陣
end
R=xx*xx'/(N-M);%自相關矩陣
[EV,D]=eig(R);%特徵值分解
EVA=diag(D)';
[EVA,I]=sort(EVA);%特徵值從小到大排序
EVA=fliplr(EVA);%左右翻轉,從大到小排序
EV=fliplr(EV(:,I));%對應特徵矢量排列
G=EV(:,3:M); %噪聲子空間
NF=2048;
%MUSIC算法
w=linspace(-pi,pi,NF);
for ii=1:NF
a=exp(-1j*w(ii)*(0:M-1)');
Pmusic(ii)=1/(a'*G*G'*a);
end
Pmusic=abs(Pmusic)/max(abs(Pmusic));
plot(w/2/pi,10*log10(Pmusic));
xlabel('w/2/pi')
ylabel('歸一化功率譜 (dB)')
title('MUSIC算法');
%root—music算法
GG=G*G';
co=zeros(2*M-1,1);%初始化3.6.38的2*(M-1)次方程的係數
for m=1:M
co(m:m+M-1)=co(m:m+M-1)+GG(M:-1:1,m);%計算3.6.38左邊的多項式係數
end
z=roots(co);%多項式求根
ph=angle(z)/(2*pi);%歸一化頻率
err=abs(abs(z)-1);%求2(M-1)個根與單位圓之間的距離
[err1,I]=sort(err);%將距離誤差從小到大排序構成一個列向量
f=[ph(I(1)),ph(I(3))];%選擇誤差最小的二個值所對應的歸一化頻率
zz=[z(I(1)),z(I(3))];
ff=sort(f);