00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
#include <math.h>
00041
#include "idsig.h"
00042
#include "idprint.h"
00043
00044 #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
00045 #define REAL double
00046
00047
00055
void
00056 IdSigFFT(
PSIGNAL_COMPLEX sig,
int isign)
00057 {
00058
int n, nn, mmax, m, j, istep, i;
00059
REAL wtemp, wr, wpr, wpi, wi, theta;
00060
REAL tempr, tempi;
00061
00062
if (!sig) {
00063
IdErrPrintf(
"IdSigFFT: Parametrer is NULL\n");
00064
return;
00065 }
00066
00067
if (
IdLibidoType(sig) !=
SIG) {
00068
IdErrPrintf(
"IdSigFFT: Parametrer is NOT a SIGNAL\n");
00069
return;
00070 }
00071
if ((
IdLibidoDataType(sig) !=
TY_COMPLEX) &&
00072 (
IdLibidoDataType(sig) !=
TY_COMPLEX_DOUBLE))
00073 {
00074
IdErrPrintf
00075 (
"IdSigFFT: Parametrer is NOT a PSIGNAL_COMPLEX_DOUBLE\n");
00076
return;
00077 }
00078
00079 nn =
IdSigDimX(sig);
00080 n = nn;
00081 j = 1;
00082
for (i = 1; i < n; i++) {
00083
if (j > i) {
00084
SWAP(sig[j - 1].re, sig[i - 1].re);
00085
SWAP(sig[j - 1].im, sig[i - 1].im);
00086 }
00087 m = n >> 1;
00088
while (m >= 2 && j > m) {
00089 j -= m;
00090 m >>= 1;
00091 }
00092 j += m;
00093 }
00094 mmax = 1;
00095
while (n > mmax) {
00096 istep = 2 * mmax;
00097 theta = 6.28318530717959 / (-isign * mmax * 2);
00098
00099
00100
00101
00102 wtemp = sin(0.5 * theta);
00103 wpr = -2.0 * wtemp * wtemp;
00104 wpi = sin(theta);
00105 wr = 1.0;
00106 wi = 0.0;
00107
for (m = 0; m < mmax; m++) {
00108
for (i = m; i < n; i += istep) {
00109 j = i + mmax;
00110 tempr = wr * sig[j].
re - wi * sig[j].im;
00111 tempi = wr * sig[j].im + wi * sig[j].re;
00112 sig[j].re = sig[i].re - tempr;
00113 sig[j].im = sig[i].im - tempi;
00114 sig[i].re += tempr;
00115 sig[i].im += tempi;
00116 }
00117 wtemp = wr;
00118 wr = (wtemp) * wpr - wi * wpi + wr;
00119 wi = wi * wpr + wtemp * wpi + wi;
00120 }
00121 mmax = istep;
00122 }
00123
if (isign == -1)
00124
for (i = 0; i < n; i++) {
00125 sig[i].
re /= nn;
00126 sig[i].
im /= nn;
00127 }
00128 }