時系列の与えられたパワーとクロススペクトル密度のシミュレーション


20

共分散行列(それらのパワースペクトル密度(PSD)およびクロスパワースペクトル密度(CSD))を考えると、一連の定常色付き時系列の生成に問題があります。

2つの時系列と与えられると、yI(t)yJ(t)ような多くの広く利用可能なルーチンを使用して、パワースペクトル密度(PSD)およびクロススペクトル密度(CSD)を推定できることを知っていますMatlabなどの関数psd()csd()関数。PSDとCSDは共分散行列を構成します

C(f)=(PII(f)PIJ(f)PJI(f)PJJ(f)),
これは一般に周波数f関数です。

逆にしたい場合はどうなりますか? 共分散行列が与えられた場合、yI(t)yJ(t)実現をどのように生成しますか?

背景理論を含めるか、これを行う既存のツールを指摘してください(Pythonのすべてが素晴らしいでしょう)。

私の試み

以下は、私が試したものと、私が気づいた問題の説明です。少し長い間読んでおり、誤用された用語が含まれている場合は申し訳ありません。間違っていることが指摘できる場合、それは非常に役立ちます。しかし、私の質問は上記の太字のものです。

  1. PSDとCSDは、時系列のフーリエ変換の積の期待値(またはアンサンブル平均)として記述できます。したがって、共分散行列は次のように記述できます
    C(f)=2τY(f)Y(f),
    ここで、
    Y(f)=(y~I(f)y~J(f)).
  2. 共分散行列はエルミート行列であり、ゼロまたは正の実固有値を持ちます。だから、に分解することができる
    Cf=バツfλ12fλ12fバツf
    どこλ12fは、非ゼロ要素がCfの固有値の平方根である対角行列です。バツfは、その列がCf正規直交固有ベクトルである行列です。は単位行列です。
  3. 単位行列は次のように書かれている
    =zfzf
    ここで、
    zf=zfzJf
    および{zf}=J平均値と単位分散がゼロの無相関の複素周波数系列です。
  4. 2.で3.を使用し、1と比較します。時系列のフーリエ変換は次のとおりです
    Yf=τ2zfλ12fバツf
  5. 時系列は、逆高速フーリエ変換などのルーチンを使用して取得できます。

これを行うためにPythonでルーチンを作成しました。

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

このルーチンをPSDとCSDに適用しました。これらの分析表現は、使用している検出器のモデリングから取得されています。重要なことは、すべての周波数で、共分散行列を構成することです(少なくとも、これらのifステートメントはすべてルーチンで渡されます)。共分散行列は3x3です。3つの時系列は約9000回生成されており、これらのすべての実現にわたって平均された推定PSDおよびCSDは、分析的なものとともに以下にプロットされます。全体的な形状は一致しますが、CSDの特定の周波数で顕著なノイズの特徴があります(図2)。PSDのピーク付近を拡大した後(図3)、PSDが実際に過小評価されていることに気付きました、CSDのノイズの多い特徴は、PSDのピークとほぼ同じ周波数で発生します。これは偶然ではなく、何らかの形でPSDからCSDに電力が漏れているとは思いません。このように多くのデータを実現することで、曲線が互いに重なり合うことを期待していました。

図1:P11
図2:P12 図2:P11(クローズアップ)


サイトへようこそ。画像を投稿できないようにするため、この質問に一部賛成票を投じました。そうでない場合は、単にリンクを投稿すれば、評判の良い人が画像を埋め込むために編集します。
枢機

1
高周波ノイズを除去しようとしましたか?
カール

回答:


1

信号は定常的であるため、単純なアプローチは、ホワイトノイズをベースとして使用し、PSDに適合するようにフィルタリングすることです。これらのフィルター係数を計算する方法は、線形予測を使用することです。

それのためのPython関数があるようです、試してみてください:

from scikits.talkbox import lpc

ご希望の場合(MATLABで同等のもののみを使用しました)。これは音声処理で使用されるアプローチで、フォルマントはこの方法で推定されます。


ホワイトノイズではなく、信号にフィルターを適用するつもりはありませんか?
マイケルR.チェルニック

いいえ、私が目指しているのは、伝達関数が定常プロセスのPSDに似ているフィルターを近似することです。すべての周波数帯域で同じパワーを持つホワイトノイズをこれらでフィルタリングすると、出力はそのパワースペクトル密度の元の信号に最適に似ています。
ジョナスシュワルツ

0

いつものようにパーティーに少し遅れましたが、最近の活動が見られるので、2円にします。

最初に、私はOPの試みに失敗することはできません-それは私には正しく見えます。この不一致、有限サンプルの問題、たとえば信号電力推定の正のバイアスが原因である可能性があります。

ただし、クロススペクトル密度行列(CPSD、これはOPが共分散行列と呼ぶもの)から時系列を生成するより簡単な方法があると思います。

1つのパラメトリックアプローチは、CPSDを使用して自己回帰の説明を取得し、それを使用して時系列を生成することです。matlabでは、Granger因果関係ツールを使用してこれを行うことができます(例: Multivaraite Granger因果関係ツールボックス、Seth、Barnettなど)。ツールボックスは非常に使いやすいです。CPSDの存在は自己回帰記述を保証するため、このアプローチは正確です。(CPSDと自己回帰の詳細については、1982年Gewekeの「複数の時系列間の線形依存性とフィードバックの測定」、またはAneil Seth + Lionel Barnettの論文の多くを参照してください)。

潜在的に簡単なのは、自己共分散(CPSDの対角、つまり信号のパワーを与える)と相互共分散(非対角要素、つまりクロスパワーを与える)にfftを適用することでCPSDを形成できることです。したがって、逆fftをCPSDに適用すると、自己相関と自己共分散を取得できます。その後、これらを使用してデータのサンプルを生成できます。

お役に立てれば。コメントに情報のリクエストを残してください、私は対処しようとします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.