/// <summary>
/// Performs the Fast Hilbert Transform over a double[] array.
/// </summary>
///
public static void FHT(double[] data, FourierTransform.Direction direction)
{
int N = data.Length;
// Forward operation
if (direction == FourierTransform.Direction.Forward)
{
// Copy the input to a complex array which can be processed
// in the complex domain by the FFT
Complex[] cdata = new Complex[N];
for (int i = 0; i < N; i++)
{
cdata[i] = new Complex(data[i], 0.0);
}
// Perform FFT
FourierTransform2.FFT(cdata, FourierTransform.Direction.Forward);
//double positive frequencies
for (int i = 1; i < (N / 2); i++)
{
cdata[i] *= 2.0;
}
// zero out negative frequencies
// (leaving out the dc component)
for (int i = (N / 2) + 1; i < N; i++)
{
cdata[i] = Complex.Zero;
}
// Reverse the FFT
FourierTransform2.FFT(cdata, FourierTransform.Direction.Backward);
// Convert back to our initial double array
for (int i = 0; i < N; i++)
{
data[i] = cdata[i].Imaginary;
}
}
else // Backward operation
{
// The inverse Hilbert can be calculated by
// negating the transform and reapplying the
// transformation.
//
// H^–1{h(t)} = –H{h(t)}
FHT(data, FourierTransform.Direction.Forward);
for (int i = 0; i < data.Length; i++)
{
data[i] = -data[i];
}
}
}