annotate fft.h @ 5:5f3c32dc6e17

* Adjust comment syntax to permit Doxygen to generate HTML documentation; add Doxyfile
author Chris Cannam
date Wed, 06 Oct 2010 15:19:49 +0100
parents 6422640a802f
children 977f541d6683
rev   line source
xue@1 1 #ifndef fftH
xue@1 2 #define fftH
xue@1 3
Chris@5 4 /**
Chris@5 5 \file fft.h - fast Fourier and cosine transforms
xue@1 6
xue@1 7 Arguments of the function in this unit roughly follow the following rules:
xue@1 8 Wid : size of transform
xue@1 9 Order : log2(Wid)
xue@1 10 W : FFT buffer: twiddle factors, standard size Wid/2
xue@1 11 X : FFT buffer: data buffer, standard size Wid
xue@1 12 bitinv: FFT buffer: table of bit-inversed integers, standard size Wid
xue@1 13 Window: window function, standard size Wid
xue@1 14 spec : complex spectrogram
xue@1 15 Amp : amplitude spectrogram
xue@1 16 Arg : phase spectrogram
xue@1 17 prefix h- : half-size
xue@1 18 prefix q- : quarter-size
xue@1 19 */
xue@1 20
xue@1 21
xue@1 22 #include <math.h>
xue@1 23 #include "xcomplex.h"
xue@1 24 #include "align8.h"
xue@1 25
xue@1 26 //---------------------------------------------------------------------------
Chris@5 27 /**
xue@1 28 macro AllocateFFTBuffer: allocates FFT buffers X and W of given length with an extra LDATA buffer the
xue@1 29 right size for hosting such arrays as the standard-size window function or output amplitude spectrum.
xue@1 30
xue@1 31 This macro allocates buffer with 64-bit alignment, which must be freed with free8() or FreeFFTBuffer
xue@1 32 macro.
xue@1 33 */
xue@1 34 #define AllocateFFTBuffer(_WID, _LDATA, _W, _X) \
xue@1 35 double *_LDATA=(double*)malloc8(sizeof(double)*_WID*4); \
xue@1 36 cdouble *_X=(cdouble*)&_LDATA[_WID]; \
xue@1 37 cdouble *_W=(cdouble*)&_X[_WID]; \
xue@1 38 SetTwiddleFactors(_WID, _W);
xue@1 39 #define FreeFFTBuffer(_LDATA) free8(_LDATA);
xue@1 40
xue@1 41 //--compelx FFT and IFFT-----------------------------------------------------
xue@1 42 void CFFTCbii(int Order, cdouble* W, cdouble* X); //complex FFT subroutine after bit-inversed ordering
xue@1 43 void CFFTC(int Order, cdouble* W, cdouble* X, int* bitinv=0); //complex FFT, compact in-place
xue@1 44 void CFFTC(cdouble* Input, double* Amp, double *Arg, int Order, cdouble* W, cdouble* X, int* bitinv=0); //complex FFT
xue@1 45 void CFFTCW(double* Window, int Order, cdouble* W, cdouble* X, int* bitinv=0); //complex FFT with window, compact in-place
xue@1 46 void CFFTCW(cdouble* Input, double* Window, double *Amp, double *Arg, int Order, cdouble* W, cdouble* X, int* bitinv=0); //complex FFT with window
xue@1 47 void CIFFTC(int Order, cdouble* W, cdouble* X, int* bitinv=0); //complex IFFT, compact in-place
xue@1 48 void CIFFTC(cdouble* Input, int Order, cdouble* W, cdouble* X, int* bitinv=0); //complex IFFT
xue@1 49
xue@1 50 //--real FFT and IFFT--------------------------------------------------------
xue@1 51 void RFFTC_ual(double* Input, double* Amp, double* Arg, int Order, cdouble* W, cdouble* X, int* hbitinv=0); //real-to-complex FFT
xue@1 52 void RFFTC_ual_old(double* Input, double *Amp, double *Arg, int Order, cdouble* W, double* XR, double* XI, int* bitinv=0); //depreciated
xue@1 53 void RFFTCW(double* Input, double* Window, double *Amp, double *Arg, int Order, cdouble* W, cdouble* X, int* hbitinv=0); //real-to-complex FFT with window, double-type input
xue@1 54 void RFFTCW(__int16* Input, double* Window, double *Amp, double *Arg, int Order, cdouble* W, cdouble* X, int* hbitinv=0); //real-to-complex FFT with window, __int16 input
xue@1 55 void CIFFTR(cdouble* Input, int Order, cdouble* W, double* X, int* hbitinv=0); //complex-to-real IFFT
xue@1 56
xue@1 57 /*
xue@1 58 macro RFFTC: was defined as RFFTC_ual (literally "unaligned RFFTC") enveloped by ALIGN8(). However, as
xue@1 59 ALIGN8() is currently disabled for lack of compiler support, RFFTC is equivalent to RFFTC_ual.
xue@1 60 */
xue@1 61 #define RFFTC(Input, Amp, Arg, Order, W, X, hbitinv) RFFTC_ual(Input, Amp, Arg, Order, W, X, hbitinv);
xue@1 62
xue@1 63 //--MFT----------------------------------------------------------------------
xue@1 64 void CMFTC(double* xR, double* xI, int Order, cdouble** X, cdouble* W); //complex fast multiresolution FT
xue@1 65
xue@1 66 //--DCT and IDCT-------------------------------------------------------------
xue@1 67 void RDCT1(double* Input, double* Output, int Order, cdouble* qW, cdouble* qX, int* qbitinv=0); //DCT1
xue@1 68 void RDCT4(double* Input, double* Output, int Order, cdouble* hW, cdouble* hX, int* hbitinv=0); //DCT4
xue@1 69 void RIDCT1(double* Input, double* Output, int Order, cdouble* qW, cdouble* qX, int* qbitinv=0); //IDCT1
xue@1 70 void RIDCT4(double* Input, double* Output, int Order, cdouble* hW, cdouble* hX, int* hbitinv=0); //IDCT4
xue@1 71
xue@1 72 //--LCT----------------------------------------------------------------------
xue@1 73 void RLCT(double** spec, double* data, int Count, int Order, int wid, double* g); //local cosine transform
xue@1 74 void RILCT(double* data, double** spec, int Fr, int Order, int wid, double* g); //inverse local cosine transform
xue@1 75
xue@1 76 //--tools--------------------------------------------------------------------
xue@1 77 double Atan2(double, double);
xue@1 78 int* CreateBitInvTable(int Order); //creates table of bit-inversed integers
xue@1 79 void SetTwiddleFactors(int N, cdouble* w); //set twiddle factors
xue@1 80
xue@1 81
xue@1 82 #endif