home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 14 / MA_Cover_14.iso / source / c / pegase_src / fastfftc.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-11  |  4.6 KB  |  173 lines

  1. #ifndef _FASTFFT_CLASS_HPP
  2. #define _FASTFFT_CLASS_HPP 1
  3.  
  4. /*
  5. **
  6. ** FastFFTC.hpp
  7. **
  8. ** $VER: FastFFTC.hpp 1.0 (24.07.98)
  9. **
  10. ** Classe FastFFTC
  11. **
  12. ** $Revision: 1.3 $
  13. ** $State: Exp $
  14. ** $Date: 1998/08/16 19:03:45 $
  15. **
  16. ** $Log: FastFFTC.hpp $
  17. ** Revision 1.3  1998/08/16 19:03:45  kakace
  18. ** Version Beta3+
  19. **
  20. ** Revision 1.2  1998/08/02 15:17:11  kakace
  21. ** Fonctionnement OK (Layer 1/2 + Stereo/JStereo)
  22. **
  23. ** Revision 1.1  1998/07/24 14:26:57  kakace
  24. ** Automatic global CheckIn
  25. **
  26. **
  27. */
  28.  
  29. #ifndef  _PEGASECOND_HPP
  30. #include "PegaseCond.hpp"
  31. #endif
  32.  
  33. #ifndef  EXEC_TYPES_H
  34. #include <exec/types.h>
  35. #endif
  36.  
  37.  
  38. typedef float T_FFTDATAS;
  39.  
  40.  
  41. //----------------------------------------------------------------------------------------------------
  42. //========================================= Classe FastFFTC ==========================================
  43. //----------------------------------------------------------------------------------------------------
  44.  
  45. const ULONG SINCOSSIZE  =  768;
  46. const ULONG BLKSIZE     = 1024;
  47. const ULONG HBLKSIZE    =  513;
  48.  
  49.  
  50. //----------------------------------------------------------------------------------------------------
  51. // Version n'utilisant pas de table pour les valeurs Sin/Cos
  52.  
  53. class FastFFTC
  54. {
  55.     private:
  56.  
  57.         // Fonctions nécessaires lorsqu'on n'utilise pas les versions optimisées en ASM.
  58.  
  59. #if _USE_ASM_FCT_ == 0
  60.         void FastFFT(T_FFTDATAS *pd_FFTIn, UWORD iFFTSize);
  61.         void FixFFT_Stereo(T_FFTDATAS *pd_FFTIn, UWORD iFFTSize);
  62.         void FixFFT_Mono(T_FFTDATAS *pd_FFTIn, UWORD iFFTSize);
  63. #endif
  64.  
  65.         ULONG   GetShuffleIndex_10(ULONG input);
  66.         ULONG   GetShuffleIndex_8(ULONG input);
  67.  
  68.     protected:
  69.  
  70.         typedef T_FFTDATAS  T_HANN[BLKSIZE];
  71.         typedef T_FFTDATAS  T_FFTBUFF[2][BLKSIZE][2];
  72.  
  73.         // Sélection du type de table Sin/Cos.
  74.         // A partir du 68040, il est plus rapide de dériver les valeurs sin() et cos()
  75.         // depuis les valeurs précédentes, plutôt que d'utiliser une table précalculée
  76.         // (cette table demandant de nombreux accès mémoire). En contrepartie, les
  77.         // calculs doivent être effectués en double précision.
  78.  
  79. #if _USE_SINCOS_TABLE_ == 1
  80.         typedef float T_SINCOS[SINCOSSIZE];
  81.         T_SINCOS      FFT_dSinCos;
  82. #else
  83.         double        FFT_dSinCos[2][10];
  84. #endif
  85.  
  86.         T_HANN       *FFT_pdHannWindowShuffled;
  87.         T_FFTBUFF    *FFT_pdWinSmplShuffled;     // (wsamp_r[]/wsamp_i[])
  88.         int           FFT_MemoryError;
  89.  
  90.     public:
  91.  
  92.         FastFFTC();
  93.         ~FastFFTC();
  94.  
  95.         void ComputeFastFFT_Stereo(UWORD iFFTSize);
  96.         void ComputeFastFFT_Mono(UWORD iFFTSize);
  97.         void SetupWinSamples_1024(WORD *pSamples, UWORD wNumChannels);
  98.  
  99.         T_FFTBUFF       *FFT_pdWindowedSmpl;        // (wsamp_r[]/wsamp_i[])
  100.         T_HANN          *FFT_pdHannWindow;
  101.         REAL             FFT_dMaxErrorLevel;
  102. };
  103.  
  104. //----------------------------------------------------------------------------------------------------
  105.  
  106. #if _USE_ASM_FCT_ == 1
  107.  
  108. extern "C" {
  109. void SetupWinSamples_1024(WORD *pSamples, UWORD wNumChannels, const T_FFTDATAS *pdHANNWindow, T_FFTDATAS *pdWSmpls);
  110. void FastFFT_Stereo_C(T_FFTDATAS *pdFFTIn, double dSinCos[2][10], UWORD iFFTSize);
  111. void FastFFT_Stereo_T(T_FFTDATAS *pdFFTIn, float dSinCos[SINCOSSIZE], UWORD iFFTSize);
  112. void FastFFT_Mono_C(T_FFTDATAS *pdFFTIn, double dSinCos[2][10], UWORD iFFTSize);
  113. void FastFFT_Mono_T(T_FFTDATAS *pdFFTIn, float dSinCos[SINCOSSIZE], UWORD iFFTSize);
  114. }
  115.  
  116. inline void FastFFTC::SetupWinSamples_1024(WORD *pSamples, UWORD wNumChannels)
  117. {
  118.     ::SetupWinSamples_1024(pSamples, wNumChannels, (const T_FFTDATAS *) FFT_pdHannWindowShuffled, (T_FFTDATAS *) FFT_pdWinSmplShuffled);
  119. }
  120.  
  121. #endif
  122.  
  123.  
  124. inline void FastFFTC::ComputeFastFFT_Stereo(UWORD iFFTSize)
  125. {
  126.     T_FFTDATAS *pd_FFTIn = (T_FFTDATAS *) FFT_pdWinSmplShuffled;
  127.  
  128. #if _USE_ASM_FCT_ == 0
  129.  
  130.     FastFFT(pd_FFTIn, iFFTSize);
  131.     FixFFT_Stereo(pd_FFTIn, iFFTSize);
  132.  
  133. #else
  134.  
  135.     // Sélection de la fonction à utiliser suivant le type de la table Sin/Cos.
  136.  
  137. #if _USE_SINCOS_TABLE_ == 1
  138.     ::FastFFT_Stereo_T(pd_FFTIn, FFT_dSinCos, iFFTSize);
  139. #else
  140.     ::FastFFT_Stereo_C(pd_FFTIn, FFT_dSinCos, iFFTSize);
  141. #endif
  142.  
  143. #endif
  144. }
  145.  
  146.  
  147. inline void FastFFTC::ComputeFastFFT_Mono(UWORD iFFTSize)
  148. {
  149.     T_FFTDATAS *pd_FFTIn = (T_FFTDATAS *) FFT_pdWinSmplShuffled;
  150.  
  151. #if _USE_ASM_FCT_ == 0
  152.  
  153.     iFFTSize >>= 1;
  154.     FastFFT(pd_FFTIn, iFFTSize);
  155.     FixFFT_Mono(pd_FFTIn, iFFTSize);
  156.  
  157. #else
  158.  
  159.     // Sélection de la fonction à utiliser suivant le type de la table Sin/Cos.
  160.  
  161. #if _USE_SINCOS_TABLE_ == 1
  162.     ::FastFFT_Mono_T(pd_FFTIn, FFT_dSinCos, iFFTSize);
  163. #else
  164.     ::FastFFT_Mono_C(pd_FFTIn, FFT_dSinCos, iFFTSize);
  165. #endif
  166.  
  167. #endif
  168. }
  169.  
  170.  
  171. #endif  // _FASTFFT_CLASS_HPP
  172.  
  173.