资源描述:
《用最大似然估计的方法来估计频率》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用最大似然估计的方法来估计频率本作品采用知识共享署名-非商业性使用-相同方式共享3.0Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。作者:xialulee最初发布于:2010年5月31日,最近对频率估计感兴趣。之前阅读了Matlab的rootmusic.m(参见《读Matlab7.7SignalProcessingToolbox的rootmusic函数(一)--rootmusic是怎么估计信号频率的》),后来又试了LS-ESPRIT算法(参见《Python的LS-ESPRIT》)。今天看资料,说最大似然估计的方法也可用于频率的估计。
2、想想这也是理所当然的事情,最大似然法本来就可以用来估计参数,而频率也是信号的重要参数。但是资料中说如果直接用最大似然法估计频率会有很多困难。看看其表达式,想想也是。所以可能实际中还是MUSIC,ESPRIT比较好用吧。曾经还在IEEE上看过一篇讲解用MUSIC估计DTMF频率的文章。纵然实际中不方便使用最大似然法来估计频率,还是稍微看看它的性能吧。在《Python的LS-ESPRIT》中贴出的代码的基础上,写了如下的代码(paramestimate.py):from__future__importdivisionimportscipyimportitert
3、oolsfromnumpyimporttracefromscipy.linalgimportdet,eigvals,pinv,svdfromscipy.optimizeimportfminfromscipyimportangle,arange,atleast_1d,complex128,conjugate,convolve,exp,eye,mat,multiply,pi,r_,randn,zerosfromnumpy.matlibimportrepmat#--paramestimate.py--#--2010.05.26Createdbyxialule
4、e--#--2010.05.31Modifiedbyxialulee--defRxx(x,m=None):'''Estimateautocorrelationmatrixofvectorxx:signalvector;m:sizeofRxx;returnvalue:autocorrelationmatrix'''N=len(x)ifm==None:m=Ntemp=mat(arange(0,m))#generateaindicesmatrix,as#0-1-2-3.#10-1-2.#210-1.#3210.#.indices=repmat(temp.T,1,
5、m)-repmat(temp,m,1)#calcuatesamplesofautocorrelationfunctionsusingconvolutionacsamples=convolve(x,conjugate(x[:-1]))#usingautocorrelationsamplesandindicesmatrixtocreateRxx#Rxx=#r[0]r[-1]r[-2]r[-3].#r[1]r[0]r[-1]r[-2].#r[2]r[1]r[0]r[-1].#r[3]r[2]r[1]r[0].#.returnacsamples[indices+N
6、-1]/Ndefls_esprit(Rxx,p):'''EstimatesignalfrequenciesusingLS-ESPRITalgorithmRxx:autocorrelationmatrixofsignal;p:numberofcomplexsinusoidsreturnvalue:normalizedfrequencies.'''Rxx=mat(Rxx)N=Rxx.shape[0]U,S,Vh=svd(Rxx)#getsignalsubspacefromUUsig=U[:,0:p]#subarrayU0=mat(Usig[:N-1,:])U1
7、=mat(Usig[1:,:])#calcuateeigenvaluesofU1U0return-angle(eigvals(pinv(U1)*U0))/2./pidefgen_x(n,freqs,amps,sigma):'''Generateatestingsignal.n:sampleindices;freqs:normalizedfrequenciesofcomplexsinusoids;amps:amplitudesofcomplexsinusoids;sigma:standarddeviationofgaussiannoise;returnva
8、lue:signalvector.'''x=complex128(