2010-08-12 23 views

Trả lời

2

Lượng mã số mã nguồn mở cho .NET là rất nhỏ. Tôi đã đấu tranh để tìm một FFT phong nha chỉ vài năm trước. Vì vậy, tôi nghiêm túc nghi ngờ bạn sẽ tìm thấy một thực hiện phong nha hiện có của thuật toán này bởi vì nó là khá mơ hồ! Đặt cược tốt nhất của bạn là xây dựng một Hilbert-Huang Transform về một FFT (giống như một từ một trong những cuốn sách F # của tôi hoặc các bài báo F # .NET), đó là, tôi đoán, những gì bạn đã làm trong MATLAB và R?

Tôi tò mò tại sao bạn lại muốn điều này? Nó không trông rất hấp dẫn đối với tôi ...

+0

Tôi đã không làm điều đó trong MATLAB hoặc R - Tôi chỉ tìm thấy điều gì đó mà người khác đã thực hiện. Và nó hoàn toàn khác FFT (tương tự với mục đích, có, rất khác nhau trong cách tiếp cận), đó là một trong những lý do nó thú vị với tôi. Đối với những điều tôi đang làm việc với, FFT có nhiều vấn đề quan trọng. – mentics

+0

@taotree: Tôi có nghĩa là tôi nghi ngờ mã R và MATLAB bạn tìm thấy sử dụng FFT để tính toán biến đổi Hilbert. Bạn có thể đánh giá cao một số kỹ thuật thay thế mà tôi đã mô tả trong chương thứ ba của luận án tiến sĩ của tôi: http://www.ffconsultancy.com/free/thesis.pdf –

+0

Tôi đánh giá cao phản hồi của bạn. Nó không phải là một biến đổi Hilbert, và theo như tôi biết một FFT sẽ không được sử dụng trong tính toán của nó. Tôi lướt qua luận án của bạn, có vẻ thú vị. Dường như bạn đề nghị phân tích wavelet tiêu chuẩn nhưng đề xuất một wavelet mẹ mới? – mentics

4

Đây là việc thực hiện của tôi về biến đổi Hilbert từ Matlab. Tôi đã thực hiện một số so sánh với đầu ra của Matlab và mã này dường như để sản xuất câu trả lời giống hệt nhau, nhưng tôi có không thực hiện bất kỳ loại thử nghiệm rộng rãi.

Điều này sử dụng thư viện MathNet công khai có sẵn để thực hiện các tính toán FFT/iFFT.

public static Complex[] MatlabHilbert(double[] xr) 
    { 
     var fft = new MathNet.Numerics.IntegralTransforms.Algorithms.DiscreteFourierTransform(); 
     var x = (from sample in xr select new Complex(sample, 0)).ToArray(); 
     fft.BluesteinForward(x, FourierOptions.Default); 
     var h = new double[x.Length]; 
     var fftLengthIsOdd = (x.Length | 1) == 1; 
     if (fftLengthIsOdd) 
     { 
      h[0] = 1; 
      for (var i = 1; i < xr.Length/2; i++) h[i] = 2; 
     } 
     else 
     { 
      h[0] = 1; 
      h[(xr.Length/2)] = 1; 
      for (var i = 1; i < xr.Length/2; i++) h[i] = 2; 
     } 
     for (var i = 0; i < x.Length; i++) x[i] *= h[i]; 
     fft.BluesteinInverse(x, FourierOptions.Default); 
     return x; 
    } 
+0

Dave, đây có phải là việc thực hiện biến đổi Hilbert-Huang (HHT) không? – tofutim

+0

@tofutim Không, không phải. Xem: http://en.wikipedia.org/wiki/Hilbert%E2%80%93Huang_transform –

Các vấn đề liên quan