/// \ingroup newmat ///@{ /// \file tmtf.cpp /// Part of matrix library test program. //#define WANT_STREAM #define WANT_MATH #include "include.h" #include "newmatap.h" //#include "newmatio.h" #include "tmt.h" #ifdef use_namespace using namespace NEWMAT; #endif static void SlowFT(const ColumnVector& a, const ColumnVector&b, ColumnVector& x, ColumnVector& y) { int n = a.Nrows(); x.ReSize(n); y.ReSize(n); Real f = 6.2831853071795864769/n; for (int j=1; j<=n; j++) { Real sumx = 0.0; Real sumy = 0.0; for (int k=1; k<=n; k++) { Real theta = - (j-1) * (k-1) * f; Real c = cos(theta); Real s = sin(theta); sumx += c * a(k) - s * b(k); sumy += s * a(k) + c * b(k); } x(j) = sumx; y(j) = sumy; } } static void SlowDTT_II(const ColumnVector& a, ColumnVector& c, ColumnVector& s) { int n = a.Nrows(); c.ReSize(n); s.ReSize(n); Real f = 6.2831853071795864769 / (4*n); int k; for (k=1; k<=n; k++) { Real sum = 0.0; const int k1 = k-1; // otherwise Visual C++ 5 fails for (int j=1; j<=n; j++) sum += cos(k1 * (2*j-1) * f) * a(j); c(k) = sum; } for (k=1; k<=n; k++) { Real sum = 0.0; for (int j=1; j<=n; j++) sum += sin(k * (2*j-1) * f) * a(j); s(k) = sum; } } static void SlowDTT(const ColumnVector& a, ColumnVector& c, ColumnVector& s) { int n1 = a.Nrows(); int n = n1 - 1; c.ReSize(n1); s.ReSize(n1); Real f = 6.2831853071795864769 / (2*n); int k; int sign = 1; for (k=1; k<=n1; k++) { Real sum = 0.0; for (int j=2; j<=n; j++) sum += cos((j-1) * (k-1) * f) * a(j); c(k) = sum + (a(1) + sign * a(n1)) / 2.0; sign = -sign; } for (k=2; k<=n; k++) { Real sum = 0.0; for (int j=2; j<=n; j++) sum += sin((j-1) * (k-1) * f) * a(j); s(k) = sum; } s(1) = s(n1) = 0; } void SlowFT2(const Matrix& U, const Matrix& V, Matrix& X, Matrix& Y) { Tracer trace("SlowFT2"); int m = U.Nrows(); int n = U.Ncols(); if (m != V.Nrows() || n != V.Ncols() || m == 0 || n == 0) Throw(ProgramException("Matrix dimensions unequal or zero", U, V)); X.ReSize(U); Y.ReSize(V); const Real pi2 = atan(1.0) * 8.0; for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) { Real sumr = 0.0, sumi = 0.0; for (int k = 0; k < m; ++k) for (int l = 0; l < n; ++l) { Real a = -pi2 * ( (Real)k * (Real)i / (Real)m + (Real)j * (Real)l / (Real)n ); Real cs = cos(a); Real sn = sin(a); sumr += cs * U(k+1,l+1) - sn * V(k+1,l+1); sumi += cs * V(k+1,l+1) + sn * U(k+1,l+1); } X(i+1,j+1) = sumr; Y(i+1,j+1) = sumi; } } static void test(int n) { Tracer et("Test FFT"); MultWithCarry mwc; ColumnVector A(n), B(n), X, Y; for (int i=0; i