Пример #1
0
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
Пример #2
0
	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
Пример #3
0
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