5

Hilbert-Huang 变换,经验模态分解...

我发现它在 R 和 Matlab 中实现。我想在 C#/F#/.NET 中找到它的开源实现。

4

2 回答 2

4

这是我从 Matlab 实现的希尔伯特变换。我已经与 Matlab 的输出进行了一些比较,这段代码似乎产生了相同的答案,但我没有进行任何广泛的测试。

这使用公开可用的 MathNet 库来进行 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;
    }
于 2013-09-12T19:36:25.360 回答
2

.NET 的高质量开源数字代码数量很少。就在几年前,我还在努力寻找一个像样的 FFT。所以我严重怀疑你会找到这个算法的一个不错的现有实现,因为它非常晦涩!

您最好的选择是根据 FFT(例如我的 F# 书籍或 F#.NET 期刊文章中的那个)构建 Hilbert-Huang 变换,我猜这就是您在 MATLAB 和 R 中所做的?

我很好奇你为什么想要这个?它看起来对我来说不是很有吸引力......

于 2010-08-12T22:05:51.020 回答