ref: e2bbb893173aa6d3ce24e00938603633e19c4aa6
parent: 5346aad4cf31ed56208283a3984698b9cc084777
author: lenox <lenox>
date: Mon Feb 14 05:35:29 EST 2000
removed rdft due to new real fft
--- a/rdft.h
+++ /dev/null
@@ -1,8 +1,0 @@
-#ifdef USE_FFTW
-#include <rfftw.h>
-rfftw_plan rdft_plan11;
-rfftw_plan rdft_plan8;
-#endif
-
-void fftw_init();
-void fftw_destroy();
--- a/rdft_spectrum.c
+++ /dev/null
@@ -1,243 +1,0 @@
-
-/* rdft_spectrum.c by James Salsman 25 April 1999 for public domain */
-
-/* spectrum( double *f, unsigned lg2n ):
- input f[0...2^lg2n-1] amplitudes, modified in-place;
- output f[0...2^(lg2n-1)-1] magnitudes (scaling depends on lg2n;
- f[0] ill-defined);
- complspectrum( double *f, unsigned lg2n ): same as above but
- f[2^(lg2n-1)+1...2^lg2n-1] are also phases in radians
- (f[2^(lg2n-1)] meaningless.) */
-
-/* computes a power spectrum using a real discrete Fourier transform,
- faster than a full FFT but not exactly a Hartley transform. */
-
-/* adapted from Joerg Arndt's code found around
- http://www.spektracom.de/~arndt/joerg.html
- in turn from Ron Mayer's 1988 Stanford project, and Ron credits
- Bracewell, Hartley, Gauss, and Euler. Don't forget Pappus,
- Pythagoras, and Euclid! */
-
-#include <math.h> /* we need sqrt(), sin(), cos(), and atan2(),
- and we want the sincos(x,*cos) FP primitive, but if we can't
- have that, we should use floor() and fmod(,) instead of cos() */
-
-/* these are the two primordial constants of DSP */
-#define SQRT2 1.414213562373095048801688724209698078569
-#define PI 3.1415926535897932384626433832795
-
-/* these six macros save source space and execution time */
-#define SWAP(x, y) { double tmp=x; x=y; y=tmp; }
-#define SUMDIFF2(s, d) { double tmp=s-d; s+=d; d=tmp; }
-#define SUMDIFF4(a, b, s, d) { s=a+b; d=a-b; }
-#define CSQR4(a, b, u, v) { u=a*a-b*b; v=a*b; v+=v; }
-#define CMULT6(c, s, c1, s1, u, v) { u=c1*c-s1*s; v=c1*s+s1*c; }
-
-void fftw_init(){}
-void fftw_destroy(){}
-
-void rdft( double *fr, unsigned lg2n )
-/* real discrete Fourier transform; not recursive */
-{
- double *fi, *fn, *gi, tt;
- unsigned n=(1 << lg2n), m, j, p, k, k4;
-
- if (lg2n <= 1) /* degenerate cases */
- {
- if (lg2n == 1) SUMDIFF2(fr[0], fr[1]); /* two point rdft */
-
- return;
- }
-
- for ( m=1,j=0; m<n-1; m++ )
- {
- for ( p=n>>1; (!((j^=p)&p)); p>>=1 ); /* butterfly */
- if (j>m) SWAP(fr[m], fr[j]); /* shuffle */
- }
-
- k = lg2n & 1; /* is the size a power of 4? */
-
- if (k==0) /* yes a power of 4 */
- {
- for ( fi=fr,fn=fr+n; fi<fn; fi+=4 )
- {
- double f0, f1, f2, f3;
-
- SUMDIFF4(fi[0], fi[1], f0, f1);
- SUMDIFF4(fi[2], fi[3], f2, f3);
-
- SUMDIFF4(f0, f2, fi[0], fi[2]);
- SUMDIFF4(f1, f3, fi[1], fi[3]);
- }
- }
- else /* lg2n & 1 == 1, so n is not a power of 4 */
- {
- for ( fi=fr,fn=fr+n,gi=fi+1; fi<fn; fi+=8,gi+=8 )
- {
- double s1, c1, s2, c2, g0, f0, f1, g1;
-
- SUMDIFF4(fi[0], gi[0], s1, c1);
- SUMDIFF4(fi[2], gi[2], s2, c2);
-
- SUMDIFF4(s1, s2, f0, f1);
- SUMDIFF4(c1, c2, g0, g1);
-
- SUMDIFF4(fi[4], gi[4], s1, c1);
- SUMDIFF4(fi[6], gi[6], s2, c2);
-
- SUMDIFF2(s1, s2);
-
- c1 *= SQRT2;
- c2 *= SQRT2;
-
- SUMDIFF4(f0, s1, fi[0], fi[4]);
- SUMDIFF4(f1, s2, fi[2], fi[6]);
-
- SUMDIFF4(g0, c1, gi[0], gi[4]);
- SUMDIFF4(g1, c2, gi[2], gi[6]);
- }
- }
-
- if (n<16) return; /* base work was as much as 8-point */
-
- do
- {
- unsigned k1, k2, k3, kx, i;
-
- k += 2;
- k1 = 1 << k;
- k2 = k1 << 1;
- k4 = k2 << 1;
- k3 = k2 + k1;
- kx = k1 >> 1;
- fi = fr;
- gi = fi + kx;
- fn = fr + n;
-
- do
- {
- double f0, f1, f2, f3;
-
- SUMDIFF4(fi[0], fi[k1], f0, f1);
- SUMDIFF4(fi[k2], fi[k3], f2, f3);
-
- SUMDIFF4(f0, f2, fi[0], fi[k2]);
- SUMDIFF4(f1, f3, fi[k1], fi[k3]);
-
- SUMDIFF4(gi[0], gi[k1], f0, f1);
-
- f3 = SQRT2 * gi[k3];
- f2 = SQRT2 * gi[k2];
-
- SUMDIFF4(f0, f2, gi[0], gi[k2]);
- SUMDIFF4(f1, f3, gi[k1], gi[k3]);
-
- gi += k4;
- fi += k4;
- }
- while (fi<fn);
-
- tt = PI/4/kx;
-
- for ( i=1; i<kx; i++ )
- {
- double tti, cs1, sn1, cs2, sn2;
-
- tti = tt*i;
- sn1 = sin(tti); /* ideally, we should be using a sincos() primitive; */
- cs1 = cos(tti); /* but this can be faster by deriving cos from sin
- cos(tti) := +/- sqrt(1-sin(tti)^2)
- the sign needs to use floor() and fmod(,):
- 2.0*(floor(fmod(tti-PI/2, PI))-0.5) ??? */
-
- CSQR4(cs1, sn1, cs2, sn2);
-
- fn = fr + n;
- fi = fr + i;
- gi = fr + k1 - i;
-
-//most timeconsuming part of rdft (tuning?)
- do
- {
- double a, b, g0, f0, f1, g1, f2, g2, f3, g3;
-
- CMULT6(sn2, cs2, fi[k1], gi[k1], b, a);
- SUMDIFF4(fi[0], a, f0, f1);
- SUMDIFF4(gi[0], b, g0, g1);
-
- CMULT6(sn2, cs2, fi[k3], gi[k3], b, a);
- SUMDIFF4(fi[k2], a, f2, f3);
- SUMDIFF4(gi[k2], b, g2, g3);
-
- CMULT6(sn1, cs1, f2, g3, b, a);
- SUMDIFF4(f0, a, fi[0], fi[k2]);
- SUMDIFF4(g1, b, gi[k1], gi[k3]);
-
- CMULT6(cs1, sn1, g2, f3, b, a);
- SUMDIFF4(g0, a, gi[0], gi[k2]);
- SUMDIFF4(f1, b, fi[k1], fi[k3]);
-
- gi += k4;
- fi += k4;
- }
- while (fi<fn);
- }
- }
- while (k4<n);
-}
-
-void spectrum( double *f, unsigned lg2n )
-/* magnitude power spectrum from rdft */
-{
- const int n=(1<<lg2n), k=(n>>1); /* k=n/2 */
- int i, j;
-
- rdft(f, lg2n);
-
- for ( i=1,j=n-1; i<k; i++,j-- )
- {
- double a, b;
-
- a = f[i] + f[j]; /* real part */
- b = f[i] - f[j]; /* imag part */
-
- f[i] = sqrt(a*a + b*b); /* magnitude -- please note that the
- scaling depends on size n */
- }
-
- f[0]=sqrt(f[0]*f[0]+f[n/2]*f[n/2]); /* ill-defined bin */
- /* Reciprocated division by zero precludes any meaning
- of "0 Hz" so please avoid using the f[0] output! */
-}
-
-void complspectrum( double *f, unsigned lg2n )
-/* polar complex power spectrum from rdft */
-{
- const int n=(1<<lg2n), k=(n>>1); /* k=n/2 */
- int i, j;
-
- rdft(f, lg2n);
-
- for ( i=1,j=n-1; i<k; i++,j-- )
- {
- double a, b;
-
- a = f[i] + f[j]; /* real part */
- b = f[i] - f[j]; /* imag part */
-
- f[i] = sqrt(a*a + b*b); /* magnitude -- please note that the
- scaling depends on size n */
- /* complex part: phase */
-
- if (a != 0.0) f[j] = atan2(b, a); /* magnitude f[i] has phase f[n-i] */
- else f[j] = 0.0;
- }
-
- f[0]=sqrt(f[0]*f[0]+f[n/2]*f[n/2]); /* ill-defined bin */
-
- /* The corresponding phase, f[k], should really be set to
- some kind of not-a-number value because it is completely
- meaningless, instead of just tainted like f[0]. */
-}
-
-/* end of rdft_spectrum.c :jps 26 April 1999 */
\ No newline at end of file
--- a/rdft_spectrum2.c
+++ /dev/null
@@ -1,112 +1,0 @@
-
-/* rdft_spectrum.c by James Salsman 25 April 1999 for public domain */
-
-/* spectrum( double *f, unsigned lg2n ):
- input f[0...2^lg2n-1] amplitudes, modified in-place;
- output f[0...2^(lg2n-1)-1] magnitudes (scaling depends on lg2n;
- f[0] ill-defined);
- complspectrum( double *f, unsigned lg2n ): same as above but
- f[2^(lg2n-1)+1...2^lg2n-1] are also phases in radians
- (f[2^(lg2n-1)] meaningless.) */
-
-/* computes a power spectrum using a real discrete Fourier transform,
- faster than a full FFT but not exactly a Hartley transform. */
-
-/* adapted from Joerg Arndt's code found around
- http://www.spektracom.de/~arndt/joerg.html
- in turn from Ron Mayer's 1988 Stanford project, and Ron credits
- Bracewell, Hartley, Gauss, and Euler. Don't forget Pappus,
- Pythagoras, and Euclid! */
-
-#include <math.h> /* we need sqrt(), sin(), cos(), and atan2(),
- and we want the sincos(x,*cos) FP primitive, but if we can't
- have that, we should use floor() and fmod(,) instead of cos() */
-
-#include "rdft.h"
-#include <rfftw.h>
-
-
-void fftw_init(){
-rdft_plan11=rfftw_create_plan(11,FFTW_REAL_TO_COMPLEX,FFTW_MEASURE);
-rdft_plan8=rfftw_create_plan(8,FFTW_REAL_TO_COMPLEX,FFTW_MEASURE);
-}
-
-void fftw_destroy(){
-rfftw_destroy_plan(rdft_plan11);
-rfftw_destroy_plan(rdft_plan8);
-}
-
-void rdft( double *fr, unsigned lg2n )
-/* real discrete Fourier transform; not recursive */
-{
-rfftw_plan rdft_plan;
-double fo[lg2n];
-switch(lg2n) {
- case 11: rfftw_one(rdft_plan11,fr,fo);
- break;
- case 8: rfftw_one(rdft_plan8,fr,fo);
- break;
- default: rdft_plan=rfftw_create_plan(lg2n,FFTW_REAL_TO_COMPLEX,
- FFTW_ESTIMATE);
- rfftw_one(rdft_plan,fr,fo);
- rfftw_destroy_plan(rdft_plan);
- printf("ERROR: rdft with size %i",lg2n);
-}
- memcpy(fr,fo,sizeof(fr));
-}
-
-void spectrum( double *f, unsigned lg2n )
-/* magnitude power spectrum from rdft */
-{
- const int n=(1<<lg2n), k=(n>>1); /* k=n/2 */
- int i, j;
-
- rdft(f, lg2n);
-
- for ( i=1,j=n-1; i<k; i++,j-- )
- {
- double a, b;
-
- a = f[i] + f[j]; /* real part */
- b = f[i] - f[j]; /* imag part */
-
- f[i] = sqrt(a*a + b*b); /* magnitude -- please note that the
- scaling depends on size n */
- }
-
- f[0]=sqrt(f[0]*f[0]+f[n/2]*f[n/2]); /* ill-defined bin */
- /* Reciprocated division by zero precludes any meaning
- of "0 Hz" so please avoid using the f[0] output! */
-}
-
-void complspectrum( double *f, unsigned lg2n )
-/* polar complex power spectrum from rdft */
-{
- const int n=(1<<lg2n), k=(n>>1); /* k=n/2 */
- int i, j;
-
- rdft(f, lg2n);
-
- for ( i=1,j=n-1; i<k; i++,j-- )
- {
- double a, b;
-
- a = f[i] + f[j]; /* real part */
- b = f[i] - f[j]; /* imag part */
-
- f[i] = sqrt(a*a + b*b); /* magnitude -- please note that the
- scaling depends on size n */
- /* complex part: phase */
-
- if (a != 0.0) f[j] = atan2(b, a); /* magnitude f[i] has phase f[n-i] */
- else f[j] = 0.0;
- }
-
- f[0]=sqrt(f[0]*f[0]+f[n/2]*f[n/2]); /* ill-defined bin */
-
- /* The corresponding phase, f[k], should really be set to
- some kind of not-a-number value because it is completely
- meaningless, instead of just tainted like f[0]. */
-}
-
-/* end of rdft_spectrum.c :jps 26 April 1999 */#include <rfftw.h>