주어진 전력 및 교차 스펙트럼 밀도에서 시계열 시뮬레이션


20

공분산 행렬 (PSD (Power Spectral Densities) 및 CSD (Cross-Power Spectral Density))을 감안할 때 고정 색상 시계열 세트를 생성하는 데 문제가 있습니다.

I는 주어진 두 개의 시계열 알 yI(t) 및 yJ(t) 많은 널리 사용과 같은 루틴을 이용하여, I가 전력 스펙트럼 밀도 (PSD를) 및 크로스 스펙트럼 밀도 (CSD가)를 추정 할 수 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. 공분산 행렬은 실제 고유 값이 0이거나 양수인 Hermitian 행렬입니다. 따라서 여기서 0이 아닌 원소가 의 고유 값 의 제곱근 인 대각 행렬입니다 . 는 열이 의 직교 정규 고유 벡터 인 행렬입니다 .
    C(f)=X(f)λ12(f)Iλ12(f)X†(f),
    λ12(f)C(f)X(f)C(f)I 는 항등 행렬입니다.
  3. 항등 행렬은 여기서 및 는 평균 및 단위 분산이 0 인 상관되지 않은 복잡한 주파수 계열입니다.
    I=⟨z†(f)z(f)⟩,
    z(f)=(zI(f)zJ(f)),
    {zi(f)}i=I,J
  4. 시계열의 푸리에 변환은 다음과 같습니다.
    Y(f)=τ2z(f)λ12(f)X†(f).
  5. 그런 다음 역 고속 푸리에 변환과 같은 루틴을 사용하여 시계열을 얻을 수 있습니다.

나는 이것을하기 위해 파이썬으로 루틴을 작성했다.

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
고주파 노이즈를 필터링 해 보셨습니까?
— Carl

답변:


1

신호가 정지되어 있기 때문에 간단한 접근 방식은 화이트 노이즈를 기본으로 사용하여 PSD에 맞게 필터링하는 것입니다. 이러한 필터 계수를 계산하는 방법은 선형 예측 을 사용 하는 것 입니다.

파이썬 기능이있는 것 같습니다. 시도하십시오.

from scikits.talkbox import lpc

원하는 경우 (MATLAB 동등 항목 만 사용했습니다). 이것은 음성 처리에 사용되는 방식으로, 포먼트가 이런 식으로 추정됩니다.


백색 잡음이 아닌 신호에 필터를 적용한다는 의미는 아닙니까?
— Michael R. Chernick 2016 년

아니요, 내가 목표로하는 것은 전달 함수가 고정 프로세스의 PSD와 유사한 필터를 근사화하는 것입니다. 모든 주파수 대역에서 동일한 전력을 갖는 백색 잡음이 이들로 필터링되면, 출력은 전력 스펙트럼 밀도에서 원래 신호와 최적으로 유사합니다.
— Jonas Schwarz

0

평소와 같이 파티에 조금 늦었지만 최근 활동이 보이므로 2 엔을 내야합니다.

첫째, OP 시도를 잘못 할 수는 없습니다. 불일치 는 유한 샘플의 문제, 예를 들어 신호 전력 추정의 양의 바이어스로 인한 것일 수 있습니다.

그러나 교차 스펙트럼 밀도 매트릭스 (CPSD, OP가 공분산 매트릭스라고 함)에서 시계열을 생성하는 더 간단한 방법이 있다고 생각합니다.

하나의 매개 변수 접근법은 CPSD를 사용하여 자동 회귀 설명을 얻은 다음이를 사용하여 시계열을 생성하는 것입니다. matlab에서는 Granger causality 도구 (예 : Multivaraite Granger causality toolbox, Seth, Barnett )를 사용하여이 작업을 수행 할 수 있습니다 . 툴박스는 사용하기 매우 쉽습니다. CPSD의 존재는 자기 회귀 적 설명을 보장하므로이 접근법은 정확합니다. (CPSD 및 자동 회귀에 대한 자세한 내용은 1982 년 Geweke의 "다중 시계열 간 선형 의존성 및 피드백 측정"또는 많은 Aneil Seth + Lionel Barnett 논문을 참조하십시오.)

CPFT는 자동 공분산 (CPSD의 대각선, 즉 신호의 전력을 제공함)과 교차 공분산 (비대 각 요소, 즉 교차 전력을 제공함)에 fft를 적용하여 CPSD를 형성 할 수 있다는 점이 간단합니다. 따라서 CPSD에 역 fft를 적용하면 자기 상관과 자기 공분산을 얻을 수 있습니다. 그런 다음이를 사용하여 데이터 샘플을 생성 할 수 있습니다.

이것이 도움이되기를 바랍니다. 의견에 정보 요청을 남겨 주시면 해결하겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.