public void Transform2D() { // Transform forward and inverse and compare with initial values. var random = new Random(1234567); var s = new Vector2F[16, 8]; var t = new Vector2F[16, 8]; for (int i = 0; i < s.GetLength(0); i++) { for (int j = 0; j < s.GetLength(1); j++) { s[i, j] = random.NextVector2F(-10, 10); t[i, j] = s[i, j]; } } var fft = new FastFourierTransformF(16); fft.Transform2D(t, true); Assert.IsFalse(Vector2F.AreNumericallyEqual(s[0, 0], t[0, 0])); fft.Transform2D(t, false); for (int i = 0; i < s.GetLength(0); i++) { for (int j = 0; j < s.GetLength(1); j++) { Assert.IsTrue(Vector2F.AreNumericallyEqual(s[i, j], t[i, j])); } } }
public void Transform2D(Vector2F[,] values, bool forward) { if (values == null) throw new ArgumentNullException("values"); int nx = values.GetLength(0); int ny = values.GetLength(1); if (nx > _buffer.Length || ny > _buffer.Length) throw new ArgumentException("The values array is too large for the current Capacity."); // Values must contain n = 2^m elements. int mx = (int)MathHelper.Log2GreaterOrEqual((uint)nx); int my = (int)MathHelper.Log2GreaterOrEqual((uint)ny); if ((1 << mx) > nx || (1 << my) > ny) throw new ArgumentException("The number of values must be a power of two (e.g. 2, 4, 8, ...) in each dimension."); // Transform the rows. for (int j = 0; j < ny; j++) { for (int i = 0; i < nx; i++) { _buffer[i].X = values[i, j].X; _buffer[i].Y = values[i, j].Y; } Transform1D(_buffer, nx, mx, forward); for (int i = 0; i < nx; i++) { values[i, j].X = _buffer[i].X; values[i, j].Y = _buffer[i].Y; } } // Transform the columns. for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { _buffer[j].X = values[i, j].X; _buffer[j].Y = values[i, j].Y; } Transform1D(_buffer, ny, my, forward); for (int j = 0; j < ny; j++) { values[i, j].X = _buffer[j].X; values[i, j].Y = _buffer[j].Y; } } }
public void Transform2D() { // Transform forward and inverse and compare with initial values. var random = new Random(1234567); var s = new Vector2F[16, 8]; var t = new Vector2F[16, 8]; for (int i = 0; i < s.GetLength(0); i++) { for (int j = 0; j < s.GetLength(1); j++) { s[i, j] = random.NextVector2F(-10, 10); t[i, j] = s[i, j]; } } var fft = new FastFourierTransformF(16); fft.Transform2D(t, true); Assert.IsFalse(Vector2F.AreNumericallyEqual(s[0, 0], t[0, 0])); fft.Transform2D(t, false); for (int i = 0; i < s.GetLength(0); i++) for (int j = 0; j < s.GetLength(1); j++) Assert.IsTrue(Vector2F.AreNumericallyEqual(s[i, j], t[i, j])); }