2010-08-12 3 views

risposta

2

La quantità di codice numerico open source di qualità per .NET è minuscola. Ho faticato a trovare un FFT decente solo un paio di anni fa. Quindi dubito seriamente che troverai un'implementazione decente di questo algoritmo perché è piuttosto oscuro!

La soluzione migliore è costruire una Trasformazione di Hilbert-Huang in termini di FFT (come quella di uno dei miei libri F # o degli articoli di giornale F # .NET) che è, immagino, che cosa avete fatto in MATLAB e R?

Sono curioso di sapere perché vorresti questo? Non sembra molto interessante per me ...

+0

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

+0

@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 –

+0

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

4

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; 
    } 
+0

Dave, si tratta di un'implementazione della trasformata di Hilbert-Huang (HHT)? – tofutim

+0

@tofutim No, non lo è. Vedi questo: http://en.wikipedia.org/wiki/Hilbert%E2%80%93Huang_transform –

Problemi correlati