** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: procsignal.cpp,v 1.11 2000/12/29 15:45:06 kevin Exp $
+** $Id: procsignal.cpp,v 1.12 2001/01/01 10:14:34 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
pEZPlot->plot (pSGP);
}
#endif
- ProcessSignal::finiteFourierTransform (adFrequencyFilter, m_adFilter, m_nFilterPoints, -1);
+ ProcessSignal::finiteFourierTransform (adFrequencyFilter, m_adFilter, m_nFilterPoints, FORWARD);
delete adFrequencyFilter;\r
#ifdef HAVE_SGP
if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
m_adFilter = new double [m_nFilterPoints];
std::complex<double>* acInverseFilter = new std::complex<double> [m_nFilterPoints];\r
- finiteFourierTransform (adSpatialFilter, acInverseFilter, m_nFilterPoints, 1);
+ finiteFourierTransform (adSpatialFilter, acInverseFilter, m_nFilterPoints, BACKWARD);
delete adSpatialFilter;\r
for (i = 0; i < m_nFilterPoints; i++)
- m_adFilter[i] = std::abs(acInverseFilter[i]) * m_dSignalInc;
+ m_adFilter[i] = std::abs (acInverseFilter[i]) * m_dSignalInc;
delete acInverseFilter;\r
#ifdef HAVE_SGP
if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) {
for (i = m_nSignalPoints; i < m_nFilterPoints; i++)
inputSignal[i] = 0; // zeropad
std::complex<double>* fftSignal = new std::complex<double> [m_nFilterPoints];
- finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, -1);\r
+ finiteFourierTransform (inputSignal, fftSignal, m_nFilterPoints, FORWARD);\r
delete inputSignal;
for (i = 0; i < m_nFilterPoints; i++)
fftSignal[i] *= m_adFilter[i];
double* inverseFourier = new double [m_nFilterPoints];
- finiteFourierTransform (fftSignal, inverseFourier, m_nFilterPoints, 1);\r
+ finiteFourierTransform (fftSignal, inverseFourier, m_nFilterPoints, BACKWARD);\r
delete fftSignal;
for (i = 0; i < m_nSignalPoints; i++)
output[i] = inverseFourier[i];\r
for (i = m_nSignalPoints; i < m_nFilterPoints; i++)
inputSignal[i] = 0; // zeropad
std::complex<double>* fftSignal = new std::complex<double> [m_nFilterPoints];
- finiteFourierTransform (inputSignal, fftSignal, -1);\r
+ finiteFourierTransform (inputSignal, fftSignal, FORWARD);\r
delete inputSignal;
for (i = 0; i < m_nFilterPoints; i++)
fftSignal[i] *= m_adFilter[i];
double* inverseFourier = new double [m_nFilterPoints];
- finiteFourierTransform (fftSignal, inverseFourier, 1);\r
+ finiteFourierTransform (fftSignal, inverseFourier, BACKWARD);\r
delete fftSignal;
for (i = 0; i < m_nSignalPoints; i++)
output[i] = inverseFourier[i];\r
std::complex<double> sum (0,0);
for (int j = 0; j < n; j++) {
double angle = i * j * angleIncrement;
- std::complex<double> exponentTerm (cos(angle), sin(angle));
- sum += input[j] * exponentTerm;
+ std::complex<double> exponentTerm (cos(angle), sin(angle));\r
+ sum += input[j] * exponentTerm;\r
}
if (direction < 0) {
sum /= n;
} else { // Even\r
int iHalfN = n / 2;\r
pdTemp[0] = pdVector[iHalfN];\r
+#if USE_BROKEN_SHUFFLE\r
for (i = 0; i < iHalfN; i++)\r
pdTemp[i + 1] = pdVector[i + iHalfN];\r
for (i = 0; i < iHalfN - 1; i++)\r
pdTemp[i + iHalfN + 1] = pdVector[i];\r
+#else\r
+ for (i = 0; i < iHalfN - 1; i++)\r
+ pdTemp[i + 1] = pdVector[i + iHalfN + 1];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pdTemp[i + iHalfN] = pdVector[i];\r
+#endif\r
}\r
\r
for (i = 0; i < n; i++)\r
} else { // Even\r
int iHalfN = n / 2;\r
pdTemp[0] = pdVector[iHalfN];\r
+#if USE_BROKEN_SHUFFLE\r
for (i = 0; i < iHalfN; i++)\r
pdTemp[i + 1] = pdVector[i + iHalfN];\r
for (i = 0; i < iHalfN - 1; i++)\r
pdTemp[i + iHalfN + 1] = pdVector[i];\r
+#else\r
+ for (i = 0; i < iHalfN - 1; i++)\r
+ pdTemp[i + 1] = pdVector[i + iHalfN + 1];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pdTemp[i + iHalfN] = pdVector[i];\r
+#endif\r
}\r
\r
for (i = 0; i < n; i++)\r
delete [] pdTemp;\r
}\r
\r
-
+\r
+void\r
+ProcessSignal::shuffleNaturalToFourierOrder (float* pdVector, const int n)\r
+{\r
+ float* pdTemp = new float [n];\r
+ int i;\r
+ if (n % 2) { // Odd\r
+ int iHalfN = (n - 1) / 2;\r
+ \r
+ pdTemp[0] = pdVector[iHalfN];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pdTemp[i + 1] = pdVector[i + 1 + iHalfN];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pdTemp[i + iHalfN + 1] = pdVector[i];\r
+ } else { // Even\r
+ int iHalfN = n / 2;\r
+ pdTemp[0] = pdVector[iHalfN];\r
+#if USE_BROKEN_SHUFFLE\r
+ for (i = 0; i < iHalfN; i++)\r
+ pdTemp[i + 1] = pdVector[i + iHalfN];\r
+ for (i = 0; i < iHalfN - 1; i++)\r
+ pdTemp[i + iHalfN + 1] = pdVector[i];\r
+#else\r
+ for (i = 0; i < iHalfN - 1; i++)\r
+ pdTemp[i + 1] = pdVector[i + iHalfN + 1];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pdTemp[i + iHalfN] = pdVector[i];\r
+#endif\r
+ }\r
+ \r
+ for (i = 0; i < n; i++)\r
+ pdVector[i] = pdTemp[i];\r
+ delete pdTemp;\r
+}\r
+\r
+\r
+\r
void\r
ProcessSignal::shuffleFourierToNaturalOrder (double* pdVector, const int n)\r
{\r
delete pdTemp;\r
}\r
\r
+\r
void\r
ProcessSignal::shuffleFourierToNaturalOrder (std::complex<double>* pdVector, const int n)\r
{\r
delete [] pdTemp;\r
}\r
\r
+\r
+\r
+\r
+void\r
+ProcessSignal::shuffleFourierToNaturalOrder (float* pVector, const int n)\r
+{\r
+ float* pTemp = new float [n];\r
+ int i;\r
+ if (n % 2) { // Odd\r
+ int iHalfN = (n - 1) / 2;\r
+ \r
+ pTemp[iHalfN] = pVector[0];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pTemp[i + 1 + iHalfN] = pVector[i + 1];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pTemp[i] = pVector[i + iHalfN + 1];\r
+ } else { // Even\r
+ int iHalfN = n / 2;\r
+ pTemp[iHalfN] = pVector[0];\r
+ for (i = 0; i < iHalfN; i++)\r
+ pTemp[i] = pVector[i + iHalfN];\r
+ for (i = 0; i < iHalfN - 1; i++)\r
+ pTemp[i + iHalfN + 1] = pVector[i+1];\r
+ }\r
+ \r
+ for (i = 0; i < n; i++)\r
+ pVector[i] = pTemp[i];\r
+ delete [] pTemp;\r
+}\r
+\r