Güç ve çapraz spektral yoğunlukların verildiği zaman serilerinin simülasyonu


20

Kovaryans matrisleri (güç spektral yoğunlukları (PSD'ler) ve çapraz güç spektral yoğunlukları (CSD'ler)) göz önüne alındığında bir dizi sabit renkli zaman serisi oluşturmakta sorun yaşıyorum.

İki zaman serisi ve , güç spektral yoğunluklarını (PSD'ler) ve çapraz spektral yoğunluklarını (CSD'ler) ve Matlabda fonksiyonları, PSD'ler ve CSDs vb kovaryans matrisi oluşturan: yI(t)yJ(t)psd()csd()

C(f)=(PII(f)PIJ(f)PJI(f)PJJ(f)),
bu genellikle frekansının bir fonksiyonudur . f

Tersini yapmak istersem ne olur? Kovaryans matrisi göz önüne alındığında, ve nasıl gerçekleşir?yI(t)yJ(t)

Lütfen herhangi bir arka plan teorisi ekleyin veya bunu yapan mevcut araçlara dikkat edin (Python'daki herhangi bir şey harika olurdu).

Girişimi

Aşağıda denediklerimin ve fark ettiğim sorunların bir açıklaması var. Biraz uzun bir okuma ve yanlış kullanılmış terimler içeriyorsa özür dilerim. Hatalı olana işaret edilebilirse, bu çok yardımcı olacaktır. Ama benim sorum yukarıda koyu olan soru.

  1. PSD'ler ve CSD'ler, zaman serilerinin Fourier dönüşümlerinin ürünlerinin beklenti değeri (veya topluluk ortalaması) olarak yazılabilir. Dolayısıyla, kovaryans matrisi şu şekilde yazılabilir: nerede
    C(f)=2τY(f)Y(f),
    Y(f)=(y~I(f)y~J(f)).
  2. Kovaryans matrisi, sıfır veya pozitif gerçek özdeğerlere sahip olan bir Hermitian matrisidir. Böylece,
    C(f)=X(f)λ12(f)Iλ12(f)X(f),
    olarak ayrıştırılabilir. : \ boldsymbol \ lambda ^ {\ frac {1} {2}} (f) \ mathbf {X} ^ {\ dagger} (f) \ ;, burada λ12(f) sıfır olmayan öğeleri C(f) 'nin özdeğerlerinin kare kökleri olan bir köşegen matristir ; X(f) sütunları C(f) nin ortonormal özvektörleri olan matristir ;I kimlik matrisidir.
  3. Kimlik matrisi olarak yazılmıştır, burada ve ilişkisiz ve sıfır ortalama ve birim varyanslı karmaşık frekans serileridir.
    I=z(f)z(f),
    z(f)=(zI(f)zJ(f)),
    {zi(f)}i=I,J
  4. 3. içinde 2. kullanarak ve sonra 1 ile karşılaştırın. Zaman serisinin Fourier dönüşümleri:
    Y(f)=τ2z(f)λ12(f)X(f).
  5. Zaman serileri daha sonra ters hızlı Fourier dönüşümü gibi rutinler kullanılarak elde edilebilir.

Bunu yapmak için Python bir rutin yazdım:

def get_noise_freq_domain_CovarMatrix( comatrix , df , inittime , parityN , seed='none' , N_previous_draws=0 ) :
    """                                                                                                          
    returns the noise time-series given their covariance matrix                                                  
    INPUT:                                                                                                       
    comatrix --- covariance matrix, Nts x Nts x Nf numpy array                                                   
      ( Nts = number of time-series. Nf number of positive and non-Nyquist frequencies )                     
    df --- frequency resolution
    inittime --- initial time of the noise time-series                                                           
    parityN --- is the length of the time-series 'Odd' or 'Even'                                                 
    seed --- seed for the random number generator                                                                
    N_previous_draws --- number of random number draws to discard first                                          
    OUPUT:                                                                                                       
    t --- time [s]                                                                                               
    n --- noise time-series, Nts x N numpy array                                                                 
    """
    if len( comatrix.shape ) != 3 :
       raise InputError , 'Input Covariance matrices must be a 3-D numpy array!'
    if comatrix.shape[0]  != comatrix.shape[1] :
        raise InputError , 'Covariance matrix must be square at each frequency!'

    Nts , Nf = comatrix.shape[0] , comatrix.shape[2]

    if parityN == 'Odd' :
        N = 2 * Nf + 1
    elif parityN == 'Even' :
        N = 2 * ( Nf + 1 )
    else :
        raise InputError , "parityN must be either 'Odd' or 'Even'!"
    stime = 1 / ( N*df )
    t = inittime + stime * np.arange( N )

    if seed == 'none' :
        print 'Not setting the seed for np.random.standard_normal()'
        pass
    elif seed == 'random' :
        np.random.seed( None )
    else :
        np.random.seed( int( seed ) )
    print N_previous_draws
    np.random.standard_normal( N_previous_draws ) ;

    zs = np.array( [ ( np.random.standard_normal((Nf,)) + 1j * np.random.standard_normal((Nf,)) ) / np.sqrt(2)
                 for i in range( Nts ) ] )

    ntilde_p = np.zeros( ( Nts , Nf ) , dtype=complex )
    for k in range( Nf ) :
        C = comatrix[ :,:,k ]
        if not np.allclose( C , np.conj( np.transpose( C ) ) ) :
            print "Covariance matrix NOT Hermitian! Unphysical."
        w , V = sp_linalg.eigh( C )
        for m in range( w.shape[0] ) :
            w[m] = np.real( w[m] )
            if np.abs(w[m]) / np.max(w) < 1e-10 :
                w[m] = 0
            if w[m] < 0 :
                print 'Negative eigenvalue! Simulating unpysical signal...'

        ntilde_p[ :,k ] =  np.conj( np.sqrt( N / (2*stime) ) * np.dot( V , np.dot( np.sqrt( np.diag( w ) ) , zs[ :,k ] ) ) )

    zerofill = np.zeros( ( Nts , 1 ) )
    if N % 2 == 0 :
        ntilde = np.concatenate( ( zerofill , ntilde_p , zerofill , np.conj(np.fliplr(ntilde_p)) ) , axis = 1 )
    else :
        ntilde = np.concatenate( ( zerofill , ntilde_p , np.conj(np.fliplr(ntilde_p)) ) , axis = 1 )
    n = np.real( sp.ifft( ntilde , axis = 1 ) )
    return t , n

Bu rutini, analitik ifadeleri çalıştığım bazı dedektörlerin modellemesinden elde edilen PSD'lere ve CSD'lere uyguladım. Önemli olan, tüm frekanslarda, bir kovaryans matrisi oluşturmalarıdır (en azından tüm bu ififadeleri rutinde geçerler ). Kovaryans matrisi 3x3'tür. 3 zaman serisi yaklaşık 9000 kez oluşturuldu ve tüm bu gerçekleşmeler üzerinden ortalaması alınan tahmini PSD'ler ve CSD'ler, analitik olanlarla aşağıda çizildi. Genel şekiller aynı fikirde olmakla birlikte , CSD'lerde belirli frekanslarda belirgin gürültülü özellikler vardır (Şekil 2). PSD'lerin zirveleri etrafında bir yakın çekimden sonra (Şekil 3), PSD'lerin aslında hafife alındığını fark ettimve CSD'lerin gürültülü özelliklerinin PSD'lerin zirveleriyle hemen hemen aynı frekanslarda meydana geldiği. Bunun bir tesadüf olduğunu ve PSD'lerden CSD'lere bir şekilde güç sızdığını düşünmüyorum. Verilerin bu kadar çok gerçekleştirilmesiyle eğrilerin üst üste gelmesini beklerdim.

Şekil 1: P11
Şekil 2: P12 Şekil 2: P11 (yakın çekim)


Siteye hoş geldiniz. Bu soruyu kısmen oyladım, böylece resim yayınlayamamanız gerekir. Değilse, bağlantıları gönderin ve yeterli üne sahip biri görüntüleri gömmek için düzenleyecektir.
kardinal

1
Yüksek frekanslı gürültüyü filtrelemeyi denediniz mi?
Carl

Yanıtlar:


1

Sinyalleriniz sabit olduğundan, basit bir yaklaşım beyaz gürültüyü temel olarak kullanmak ve PSD'lerinize uyacak şekilde filtrelemek olacaktır. Bu filtre katsayılarını hesaplamanın bir yolu, doğrusal tahmin kullanmaktır .

Görünüşe göre bunun için bir python işlevi var, deneyin:

from scikits.talkbox import lpc

İsterseniz (Yalnızca MATLAB eşdeğerini kullandım). Bu, formanların bu şekilde tahmin edildiği konuşma işlemede kullanılan bir yaklaşımdır.


Filtreyi beyaz gürültüye değil sinyale mi uygulamak istediniz?
Michael R.Chernick

Hayır, amaçladığım şey, transfer fonksiyonunun sabit bir işlemin PSD'sine benzediği bir filtreye yaklaşmaktır. Tüm frekans bantları boyunca aynı güce sahip olan beyaz gürültü bunlarla filtrelenirse, çıkış güç spektral yoğunluğundaki orijinal sinyallere en iyi şekilde benzemektedir.
Jonas Schwarz

0

Her zamanki gibi partiye biraz geç kaldım, ama yeni bir aktivite görüyorum, bu yüzden iki yenimi alacağım.

İlk olarak, OP girişiminde hata yapamam - bana doğru görünüyor. Tutarsızlıklar olabilir sinyal gücü tahmin örnek pozitif önyargı için, sonlu örnekleri ile sorunları nedeniyle olabilir.

Ancak, çapraz spektral yoğunluk matrisinden (CPSD, OP'nin kovaryans matrisi olarak adlandırdığı şey) zaman serisi oluşturmanın daha basit yolları olduğunu düşünüyorum.

Parametrik yaklaşımlardan biri, otoregresif bir tanım elde etmek için CPSD'yi kullanmak ve daha sonra bunu zaman serilerini oluşturmaktır. Matlab'da bunu Granger nedensellik araçlarını (örn. Multivaraite Granger nedensellik araç kutusu, Seth, Barnett ) kullanarak yapabilirsiniz. Araç kutusunun kullanımı çok kolaydır. CPSD'nin varlığı otoregresif bir tanımı garanti ettiğinden, bu yaklaşım kesindir. (CPSD ve otoregresyon hakkında daha fazla bilgi için, Geweke, 1982 veya Aneil Seth + Lionel Barnett gazetelerinin çoğunun tam görüntüsünü almak için "Birden Fazla Zaman Serisi Arasındaki Doğrusal Bağımlılık ve Geribildirim Ölçümü" konusuna bakın).

CPSD'nin, otomatik kovaryansa (CPSD'nin diyagonalini, yani sinyallerin gücünü vererek) ve çapraz kovaryansa (kapalı diyagonal elemanlar, yani çapraz güç vererek) fft uygulanarak oluşturulabileceğini belirtmek daha basittir. Böylece CPSD'ye ters fft uygulayarak otokorelasyon ve oto kovaryans elde edebiliriz. Daha sonra bunları verilerimizin örneklerini oluşturmak için kullanabiliriz.

Bu yardımcı olur umarım. Lütfen herhangi bir bilgi isteğini yorumlarda bırakın, ben de ele almaya çalışacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.