This is libfft.c in view mode; [Download] [Up]
/* libfft.c - fast Fourier transform library
**
** Copyright (C) 1989 by Jef Poskanzer.
**
** Permission to use, copy, modify, and distribute this software and its
** documentation for any purpose and without fee is hereby granted, provided
** that the above copyright notice appear in all copies and that both that
** copyright notice and this permission notice appear in supporting
** documentation. This software is provided "as is" without express or
** implied warranty.
*/
#include <stdio.h>
#include <math.h>
#include "libfft.h"
#define TWOPI ( M_PI + M_PI )
static int bitreverse[MAXFFTSIZE], bits;
/* initfft - initialize for fast Fourier transform
**
** b = power of two such that 2**nu = number of samples
*/
void initfft ( int b ) {
register int i, j, k;
if ( ( bits = b ) > LOG2_MAXFFTSIZE ) {
fprintf ( stderr, "%d is too many bits, max is %d\n", bits, LOG2_MAXFFTSIZE );
exit( 1 );
}
for ( i = ( 1 << bits ) - 1; i >= 0; --i ) {
for ( j = 0, k = 0; j < bits; ++j ) {
k *= 2;
if ( i & ( 1 << j ) ) k++;
}
bitreverse[i] = k;
}
}
/* fft - a fast Fourier transform routine
**
** xr real part of data to be transformed
** xi imaginary part (normally zero, unless inverse transform in effect)
** inv flag for inverse
*/
void fft ( float xr[], float xi[], int inv ) {
int n, n2, i, k, kn2, l, p;
float ang, s, c, tr, ti;
n2 = ( n = ( 1 << bits ) ) / 2;
for ( l = 0; l < bits; ++l ) {
for ( k = 0; k < n; k += n2 ) {
for ( i = 0; i < n2; ++i, ++k ) {
p = bitreverse[k / n2];
ang = TWOPI * p / n;
c = cos( ang );
s = sin( ang );
kn2 = k + n2;
if ( inv ) s = -s;
tr = xr[kn2] * c + xi[kn2] * s;
ti = xi[kn2] * c - xr[kn2] * s;
xr[kn2] = xr[k] - tr;
xi[kn2] = xi[k] - ti;
xr[k] += tr;
xi[k] += ti;
}
}
n2 /= 2;
}
for ( k = 0; k < n; k++ ) {
if ( ( i = bitreverse[k] ) <= k ) continue;
tr = xr[k];
ti = xi[k];
xr[k] = xr[i];
xi[k] = xi[i];
xr[i] = tr;
xi[i] = ti;
}
/* Finally, multiply each value by 1/n, if this is the forward transform. */
if ( ! inv ) {
register float f;
for ( i = 0, f = 1.0 / n; i < n ; i++ ) {
xr[i] *= f;
xi[i] *= f;
}
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.