Вот моя реализация преобразования Гильберта из 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;
}