Mô phỏng chuỗi thời gian cho năng lượng và mật độ quang phổ chéo


20

Tôi gặp khó khăn khi tạo ra một chuỗi các chuỗi thời gian có màu cố định, do ma trận hiệp phương sai của chúng (mật độ phổ công suất (PSD) và mật độ phổ công suất chéo (CSD)).

Tôi biết rằng, với hai chuỗi thời gian ytôi(t)yJ(t) , tôi có thể ước tính mật độ phổ công suất (PSD) và mật độ quang phổ chéo (CSD) bằng nhiều thói quen có sẵn rộng rãi, chẳng hạn như psd()và các csd()chức năng trong Matlab , v.v ... Các PSD và CSD tạo nên ma trận hiệp phương sai:

C(f)= =(Ptôitôi(f)PtôiJ(f)PJtôi(f)PJJ(f)),
nói chung là một hàm của tần sốf .

Điều gì xảy ra nếu tôi muốn làm ngược lại? Với ma trận hiệp phương sai, làm thế nào để tôi nhận ra ytôi(t)yJ(t) ?

Vui lòng bao gồm bất kỳ lý thuyết nền tảng nào, hoặc chỉ ra bất kỳ công cụ hiện có nào thực hiện điều này (mọi thứ trong Python đều tuyệt vời).

Nỗ lực của tôi

Dưới đây là một mô tả về những gì tôi đã cố gắng, và các vấn đề tôi đã nhận thấy. Đó là một chút của một đọc dài, và xin lỗi nếu nó có chứa các điều khoản đã bị sử dụng sai. Nếu những gì sai lầm có thể được chỉ ra, điều đó sẽ rất hữu ích. Nhưng câu hỏi của tôi là một trong những in đậm ở trên.

  1. Các PSD và CSD có thể được viết dưới dạng giá trị kỳ vọng (hoặc trung bình cộng) của các sản phẩm của các biến đổi Fourier của chuỗi thời gian. Vì vậy, ma trận hiệp phương sai có thể được viết là:
    C(f)= =2τY(f)Y(f),
    Nơi
    Y(f)= =(y~tôi(f)y~J(f)).
  2. Ma trận hiệp phương sai là ma trận Hermiti, có giá trị riêng thực tế bằng 0 hoặc dương. Vì vậy, nó có thể được phân tách ra thành
    C(f)= =X(f)λ12(f)tôiλ12(f)X(f),
    trong đóλ12(f)là một ma trận đường chéo có các phần tử khác không là căn bậc hai củacác giá trị riêngcủaC(f); X(f)là ma trận có các cột là các hàm riêng trực giao củaC(f); tôilà ma trận danh tính.
  3. Ma trận sắc được viết như
    tôi= =z(f)z(f),
    trong đó
    z(f)= =(ztôi(f)zJ(f)),
    {ztôi(f)}tôi= =tôi,J là không tương quan và phức tạp tần số-series với zero đúng nghĩa và đơn vị.
  4. Bằng cách sử dụng 3. trong 2., và sau đó so sánh với 1. Fourier biến đổi của chuỗi thời gian là:
    Y(f)= =τ2z(f)λ12(f)X(f).
  5. Chuỗi thời gian sau đó có thể thu được bằng cách sử dụng các thường trình như biến đổi Fourier nhanh nghịch đảo.

Tôi đã viết một thói quen trong Python để làm điều này:

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

Tôi đã áp dụng thói quen này cho các PSD và CSD, các biểu thức phân tích được lấy từ mô hình của một số máy dò mà tôi đang làm việc. Điều quan trọng là ở tất cả các tần số, chúng tạo thành một ma trận hiệp phương sai (ít nhất là chúng vượt qua tất cả các ifcâu lệnh trong thói quen). Ma trận hiệp phương sai là 3x3. Chuỗi 3 thời gian đã được tạo ra khoảng 9000 lần và các PSD và CSD ước tính, tính trung bình trên tất cả các nhận thức này được vẽ dưới đây với các phân tích. Mặc dù các hình dạng tổng thể đồng ý, có các tính năng nhiễu đáng chú ý ở các tần số nhất định trong CSDs (Hình 2). Sau khi chụp cận cảnh xung quanh các đỉnh trong PSD (Hình 3), tôi nhận thấy rằng các PSD thực sự bị đánh giá thấpvà các tính năng gây nhiễu trong CSD xảy ra ở cùng tần số với các đỉnh trong PSD. Tôi không nghĩ rằng đây là một sự trùng hợp ngẫu nhiên và bằng cách nào đó sức mạnh đang rò rỉ từ các PSD vào CSD. Tôi đã mong đợi các đường cong nằm trên nhau, với nhiều nhận thức về dữ liệu này.

Hình 1: P11
Hình 2: P12 Hình 2: P11 (cận cảnh)


Chào mừng đến với trang web. Tôi đã bỏ phiếu cho câu hỏi này, một phần, để bạn không thể đăng ảnh. Nếu không, chỉ cần đăng liên kết và ai đó có đủ danh tiếng sẽ chỉnh sửa để nhúng hình ảnh.
Đức hồng y

1
Bạn đã thử lọc tiếng ồn tần số cao?
Carl

Câu trả lời:


1

Vì các tín hiệu của bạn đứng yên, nên một cách tiếp cận đơn giản sẽ là sử dụng nhiễu trắng làm cơ sở và lọc nó để phù hợp với các PSD của bạn. Một cách để tính các hệ số bộ lọc này là sử dụng dự đoán tuyến tính .

Có vẻ như có một chức năng python cho nó, hãy thử nó:

from scikits.talkbox import lpc

Nếu bạn muốn (Tôi chỉ sử dụng tương đương MATLAB). Đây là một cách tiếp cận được sử dụng trong xử lý lời nói, trong đó các định dạng được ước tính theo cách này.


Ý bạn là không áp dụng bộ lọc cho tín hiệu chứ không phải nhiễu trắng?
Michael R. Chernick

Không, điều tôi hướng tới là ước tính một bộ lọc trong đó hàm truyền giống với PSD của một quá trình đứng yên. Nếu nhiễu trắng, có cùng công suất trong tất cả các dải tần số, được lọc bằng các tần số này, thì đầu ra sẽ tối ưu giống với các tín hiệu gốc trong mật độ phổ công suất của nó.
Jonas Schwarz

0

Một chút đến bữa tiệc, như thường lệ, nhưng tôi thấy một số hoạt động gần đây vì vậy tôi sẽ là hai yên của tôi.

Đầu tiên, tôi không thể lỗi OPs - nó có vẻ đúng với tôi. Sự khác biệt có thể là do các vấn đề với các mẫu hữu hạn, ví dụ sai lệch dương của ước tính công suất tín hiệu.

Tuy nhiên, tôi nghĩ rằng có nhiều cách đơn giản hơn để tạo chuỗi thời gian từ ma trận mật độ phổ chéo (CPSD, đây là cái mà OP gọi là ma trận hiệp phương sai).

Một cách tiếp cận tham số là sử dụng CPSD để có được một mô tả tự phát và sau đó sử dụng nó để tạo ra chuỗi thời gian. Trong MATLAB, bạn có thể thực hiện việc này bằng cách sử dụng các công cụ quan hệ nhân quả Granger (ví dụ: hộp công cụ quan hệ nhân quả Multivaraite Granger, Seth, Barnett ). Hộp công cụ rất dễ sử dụng. Vì sự tồn tại của CPSD đảm bảo mô tả tự phát, cách tiếp cận này là chính xác. (để biết thêm thông tin về CPSD và tự động xâm phạm, hãy xem "Đo lường sự phụ thuộc tuyến tính và phản hồi giữa nhiều chuỗi thời gian" của Geweke, 1982 hoặc nhiều bài báo của Aneil Seth + Lionel Barnett, để có được bức tranh đầy đủ).

Có khả năng đơn giản hơn, việc lưu ý CPSD có thể được hình thành bằng cách áp dụng fft cho hiệp phương sai tự động (đưa ra đường chéo của CPSD, tức là công suất của tín hiệu) và hiệp phương sai (đưa ra các yếu tố chéo, tức là công suất chéo). Do đó, bằng cách áp dụng fft nghịch đảo cho CPSD, chúng ta có thể nhận được tự động tương quan và hiệp phương sai tự động. Sau đó chúng tôi có thể sử dụng chúng để tạo các mẫu dữ liệu của chúng tôi.

Hi vọng điêu nay co ich. Vui lòng để lại bất kỳ yêu cầu thông tin trong các ý kiến ​​và tôi sẽ cố gắng giải quyết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.