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


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.