Ecco la mia implementazione della trasformata di Hilbert da Matlab. Ho fatto alcuni confronti con l'output di Matlab e questo codice sembra produrre risposte identiche, ma non ho fatto alcun tipo di test approfondito con il .
Questo utilizza la libreria MathNet pubblicamente disponibile per eseguire i calcoli 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;
}
fonte
2013-09-12 19:36:25
Non l'ho fatto in MATLAB o R - Ho appena trovato qualcosa che qualcun altro aveva fatto. Ed è un FFT abbastanza diverso (simile nello scopo, sì, molto diverso nell'approccio), che è uno dei motivi per cui è interessante per me. Per le cose con cui sto lavorando, FFT ha vari problemi significativi. – mentics
@taotree: Intendevo dire che sospetto che il codice R e MATLAB che hai trovato utilizzi la FFT per calcolare la trasformata di Hilbert. Potresti apprezzare alcune delle tecniche alternative che ho descritto nel terzo capitolo della mia tesi di dottorato: http://www.ffconsultancy.com/free/thesis.pdf –
Apprezzo la tua risposta. Non è una trasformata di Hilbert, e per quanto ne so una FFT non verrebbe utilizzata nel suo calcolo. Ho sfogliato la tua tesi, sembra interessante. Sembra che tu suggerisca un'analisi wavelet standard ma proponi una nuova wavelet madre? – mentics