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:
psd()
csd()
Tersini yapmak istersem ne olur? Kovaryans matrisi göz önüne alındığında, ve nasıl gerçekleşir?
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.
- 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
- Kovaryans matrisi, sıfır veya pozitif gerçek özdeğerlere sahip olan bir Hermitian matrisidir. Böylece, olarak ayrıştırılabilir. : \ boldsymbol \ lambda ^ {\ frac {1} {2}} (f) \ mathbf {X} ^ {\ dagger} (f) \ ;, burada sıfır olmayan öğeleri 'nin özdeğerlerinin kare kökleri olan bir köşegen matristir ; sütunları nin ortonormal özvektörleri olan matristir ; kimlik matrisidir.
- Kimlik matrisi olarak yazılmıştır,
burada
ve ilişkisiz ve sıfır ortalama ve birim varyanslı karmaşık frekans serileridir.
- 3. içinde 2. kullanarak ve sonra 1 ile karşılaştırın. Zaman serisinin Fourier dönüşümleri:
- 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 if
ifadeleri 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.