Hilbert-Huang 变换,经验模态分解...
我发现它在 R 和 Matlab 中实现。我想在 C#/F#/.NET 中找到它的开源实现。
Hilbert-Huang 变换,经验模态分解...
我发现它在 R 和 Matlab 中实现。我想在 C#/F#/.NET 中找到它的开源实现。
这是我从 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;
}
.NET 的高质量开源数字代码数量很少。就在几年前,我还在努力寻找一个像样的 FFT。所以我严重怀疑你会找到这个算法的一个不错的现有实现,因为它非常晦涩!
您最好的选择是根据 FFT(例如我的 F# 书籍或 F#.NET 期刊文章中的那个)构建 Hilbert-Huang 变换,我猜这就是您在 MATLAB 和 R 中所做的?
我很好奇你为什么想要这个?它看起来对我来说不是很有吸引力......