diff --git a/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.Bluestein.cs b/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.Bluestein.cs
index 2fd90d99..d45b966f 100644
--- a/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.Bluestein.cs
+++ b/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.Bluestein.cs
@@ -57,10 +57,10 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
}
///
- /// Convolution with the bluestein sequence.
+ /// Convolution with the bluestein sequence (Parallel Version).
///
/// Sample Vector.
- private static void BluesteinConvolution(Complex[] samples)
+ private static void BluesteinConvolutionParallel(Complex[] samples)
{
int n = samples.Length;
Complex[] sequence = BluesteinSequence(n);
@@ -102,7 +102,7 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
a[i] *= b[i];
}
- Radix2(a, 1);
+ Radix2Parallel(a, 1);
var nbinv = 1.0 / m;
for (int i = 0; i < samples.Length; i++)
@@ -142,7 +142,7 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
SwapRealImaginary(samples);
}
- BluesteinConvolution(samples);
+ BluesteinConvolutionParallel(samples);
if (exponentSign == 1)
{
diff --git a/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.RadixN.cs b/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.RadixN.cs
index 6f170db6..0e2b93bf 100644
--- a/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.RadixN.cs
+++ b/src/Managed/IntegralTransforms/Algorithms/DiscreteFourierTransform.RadixN.cs
@@ -31,6 +31,7 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
using System;
using NumberTheory;
using Properties;
+ using Threading;
///
/// Complex Fast (FFT) Implementation of the Discrete Fourier Transform (DFT).
@@ -103,13 +104,37 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
Radix2Reorder(samples);
for (int levelSize = 1; levelSize < samples.Length; levelSize *= 2)
{
- for (int k = 0; k <= levelSize - 1; k++)
+ for (int k = 0; k < levelSize; k++)
{
Radix2Step(samples, exponentSign, levelSize, k);
}
}
}
+ ///
+ /// Radix-2 generic FFT for power-of-two sample vectors (Parallel Version).
+ ///
+ /// Sample vector, where the FFT is evaluated in place.
+ /// Fourier series exponent sign.
+ ///
+ internal static void Radix2Parallel(Complex[] samples, int exponentSign)
+ {
+ if (!samples.Length.IsPowerOfTwo())
+ {
+ throw new ArgumentException(Resources.ArgumentPowerOfTwo);
+ }
+
+ Radix2Reorder(samples);
+ for (int levelSize = 1; levelSize < samples.Length; levelSize *= 2)
+ {
+ int size = levelSize;
+ Parallel.For(
+ 0,
+ size,
+ k => Radix2Step(samples, exponentSign, size, k));
+ }
+ }
+
///
/// Radix-2 forward FFT for power-of-two sample vectors.
///
@@ -118,7 +143,7 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
///
public void Radix2Forward(Complex[] samples, FourierOptions options)
{
- Radix2(samples, SignByOptions(options));
+ Radix2Parallel(samples, SignByOptions(options));
ForwardScaleByOptions(options, samples);
}
@@ -130,7 +155,7 @@ namespace MathNet.Numerics.IntegralTransforms.Algorithms
///
public void Radix2Inverse(Complex[] samples, FourierOptions options)
{
- Radix2(samples, -SignByOptions(options));
+ Radix2Parallel(samples, -SignByOptions(options));
InverseScaleByOptions(options, samples);
}
}