def bispec(ys,window=1,norm=1): from scipy.linalg.basic import hankel from scipy.fftpack import fft,fftfreq from numpy import zeros,ones,sin,linspace,pi,arange,r_ """ calculate the bicoherence ys[number of realization, sample size] b(k,l) return frequency 0:0.5 and b(0<k<0.5,0<l<0.5) """ nr,nt=ys.shape ys=(ys-ys.mean(axis=1).reshape(nr,1)*ones((1,nt)))#detrend if window ==1: wind=ones((nr,1))*sin(linspace(0,pi,nt)).reshape(1,nt)**2 ys=ys*wind #nfft=2**floor(log2(nt)) nfft=nt mask=hankel(arange(nfft),r_[nfft-1,arange(nfft-1)]) bi=zeros((nr,nfft,nfft)) pkl=zeros((nr,nfft,nfft)) pm=zeros((nr,nfft,nfft)) for i in arange(nr): y=ys[i,:] spec=fft(y)/nfft pkl[i,:,:]=abs(spec.reshape(nfft,1)*(spec.conj().reshape(1,nfft)))**2 pm[i,:,:]=(abs(spec)**2)[mask] bi[i,:,:]=(spec.reshape(nfft,1) * spec.reshape(1,nfft)) * (spec.conj()[mask]) if norm==1: bi=abs(bi.mean(axis=0))**2/pkl.mean(axis=0)/pm.mean(axis=0) else: bi=abs(bi.mean(axis=0))**2 print "max of b(k,l)=",bi.max() freq=fftfreq(nfft) return freq,bi
def F(x=None,z=None): if x is None: x = cb.matrix(0.0, (rm+rn+1,1)) if init_p is None or init_q is None: x[rm] = 1 else: x[:rm] = Mp*i_p x[rm:rm+rn] = Mq*i_q return 1, x xp = x[:rm] p = fromiter(Mp.T*xp, float) p[0] += 1 xq = x[rm:rm+rn] q = fromiter(Mq*xq, float) num = pp2p(p) den = pp2p(q) if num is None or den is None: return None xcep = cb.matrix( arma2cep(num,den,m-1), (m,1)) xcov = cb.matrix( arma2cov(num,den,n-1), (n,1)) f = 0.5*xp.T*i_w_p*xp + 0.5*xq.T*i_w_q*xq + xp.T*Mp*xcep -1 + xcep[0] - x[rm+rn] Df = cb.matrix(-1.0, (1,rm+rn+1)) Df[0,0:rm] = (i_w_p*xp + Mp*xcep).T Df[0,rm:rm+rn] = (i_w_q*xq - Mq*xcov).T if z is None: return f, Df H = cb.matrix(0.0, (rm+rn+1,rm+rn+1)) # evaluate hessian w.r.t p c_p = arma2cov(ones(1),num,2*m-2) H_pp = 0.5*toeplitz(c_p[:m]) + 0.5*hankel(c_p[:m], c_p[m-1:]) H[:rm,:rm] = Mp*cb.matrix(H_pp, (m,m))*Mp.T + i_w_p # evaluate hessian w.r.t q c_q = arma2cov(num,polymul(den,den),2*n-2) H_qq = 0.5*toeplitz(c_q[:n]) + 0.5*hankel(c_q[:n], c_q[n-1:]) H[rm:rm+rn,rm:rm+rn] = Mq*cb.matrix(H_qq, (n,n))*Mq.T + i_w_q # evaluate the mixed part cc = arma2cov(ones(1),den,n+m-2) H_pq = -0.5*toeplitz(cc[:m], cc[:n]) - 0.5*hankel(cc[:m],cc[m-1:]) H[:rm,rm:rm+rn] = Mp*cb.matrix(H_pq, (m,n))*Mq.T H[rm:rm+rn,:rm] = H[:rm,rm:rm+rn].T # save for debugging purposes for k in range(0,rm+rn+1): tmp_x[k] = x[k] return f, Df, z[0]*H
def bispec2d(yss,m1,m2,m3,window=1,norm=1): """ calculate the 2d bicoherence specify m1,m2,m3 so that m1+m2=m3 (0...Nt/2) ys[nr , nm ,nt] b(k,l) return frequency 0:0.5 and b(0<k<0.5,0<l<0.5) """ from scipy.linalg.basic import hankel from scipy.fftpack import fft2,fftfreq from numpy import zeros,ones,sin,linspace,pi,arange,r_ ys=yss.copy() nr,ny,nt=ys.shape #windowing wind=sin(linspace(0,pi,ny)).reshape(ny,1)**2*sin(linspace(0,pi,nt)).reshape(1,nt)**2 for i in arange(nr): print "detrending" y=ys[i,:,:] #2d detrend y=(y-y.mean(axis=1).reshape(ny,1)*ones((1,nt))) y=(y-ones((ny,1))*y.mean(axis=0).reshape(1,nt)) if window ==1: ys[i,:,:]=y*wind else: ys[i,:,:]=y print "down detrending" #2D fft" print "calculating fft2d" spec2d=fft2(ys,axes=(-2,-1))/nt/ny print "done fft2d" mask=hankel(arange(nt),r_[nt-1,arange(nt-1)]) bi=zeros((nr,nt,nt)) pkl=zeros((nr,nt,nt)) pm=zeros((nr,nt,nt)) for i in arange(nr): print 'nr=',i sm1=spec2d[i,m1,:] sm2=spec2d[i,m2,:] sm3=spec2d[i,m3,:] pkl[i,:,:]=abs(sm1.reshape(nt,1)*(sm2.conj().reshape(1,nt)))**2 pm[i,:,:]=(abs(sm3)**2)[mask] bi[i,:,:]=(sm1.reshape(nt,1) * sm2.reshape(1,nt)) * (sm3.conj()[mask]) if norm==1: bi=abs(bi.mean(axis=0))**2/pkl.mean(axis=0)/pm.mean(axis=0) else: bi=abs(bi.mean(axis=0))**2 print "max of b(k,l)=",bi.max() freq=fftfreq(nt) return freq,bi