Đâ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;
}
Nguồn
2013-09-12 19:36:25
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
@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 –
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