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
00038
00039 #if !defined(__libzplVecLib_HEADER_INCLUDED__)
00040 #define __libzplVecLib_HEADER_INCLUDED__
00041
00042
00043
00044 #ifdef WIN32
00045 typedef float zCOMPLEX;
00046 #define ZCDECL __cdecl
00047 #elif defined(_MACH)
00048 typedef float zCOMPLEX;
00049 #define ZCDECL
00050 #else
00051 #error "undefined system"
00052 #endif
00053 #if defined (NDEBUG) || (GP_DEBUG == 0)
00054 #define ZASSERT(exp) ((void)0)
00055 #else
00056 #include <assert.h>
00057 #define ZASSERT(exp) assert(!(exp))
00058 #endif
00059
00060 #include "RingBuffer.h"
00061
00062
00063
00071 void zplVecLibDispatcher ();
00072
00073
00081 extern float* (ZCDECL *zplfMalloc) (int iNumOfFloats);
00082
00090 extern void (ZCDECL *zplfFree) (float *&ppfBuffer);
00091
00100 extern void (ZCDECL *zplfSetZero) (float *pfBuffer, int iLengthAsPowOf4);
00101
00102
00113 extern void (ZCDECL *zplfRealFindMax) (float *pfSrc, float *pfMax, int *piIdx, int iLengthAsPowOf4);
00114
00124 extern void (ZCDECL *zplfRealAdd_I) (float *pfSrcDest, float *pfSrc, int iLengthAsPowOf4);
00125
00135 extern void (ZCDECL *zplfRealAddC_I) (float *pfSrcDest, float fValue, int iLengthAsPowOf4);
00136
00146 extern void (ZCDECL *zplfRealSub_I) (float *pfSrcDest, float *pfSrc, int iLengthAsPowOf4);
00147
00157 extern void (ZCDECL *zplfRealMul_I) (float *pfSrcDest, float *pfSrc, int iLengthAsPowOf4);
00158
00168 extern void (ZCDECL *zplfRealMulC_I) (float *pfSrcDest, float fScaleFactor, int iLengthAsPowOf4);
00169
00179 extern void (ZCDECL *zplfRealDiv_I) (float *pfNomSrcDest, float *pfDenomSrc, int iLengthAsPowOf4);
00180
00191 extern void (ZCDECL *zplfRealMac_I) (float *pfSrcDest, float *pfSrc1, float *pfSrc2, int iLengthAsPowOf4);
00192
00201 extern void (ZCDECL *zplfRealAbs_I) (float *pfSrcDest, int iLengthAsPowOf4);
00202
00211 extern float (ZCDECL *zplfRealSum) (float *pfSrc, int iLengthAsPowOf4);
00212
00213
00223 extern void (ZCDECL *zplfCompAdd_I) (zCOMPLEX *pfSrcDest, zCOMPLEX *pfSrc, int iRealLengthAsPowOf4);
00224
00234 extern void (ZCDECL *zplfCompMul_I) (zCOMPLEX *pfSrcDest, zCOMPLEX *pfSrc, int iRealLengthAsPowOf4);
00235
00245 extern void (ZCDECL *zplfCompDiv_I) (zCOMPLEX *pfNomSrcDest, zCOMPLEX *pfDenomSrc, int iRealLengthAsPowOf4);
00246
00257 extern void (ZCDECL *zplfCompMac_I) (zCOMPLEX *pfSrcDest, zCOMPLEX *pfSrc1, float *pfSrc2, int iRealLengthAsPowOf4);
00258
00268 extern void (ZCDECL *zplfCompAbs) (float *pfDest, zCOMPLEX *pfSrc1, int iRealLengthAsPowOf4);
00269
00270
00271 class CzplfFFT_If
00272 {
00273 public:
00274
00275
00277 enum _Fft_Windows_
00278 {
00279 _RECT,
00280 _HANNING,
00281 _HAMMING,
00282 _BLACKMAN,
00283 _BARTLETT,
00284 _WELCH
00285 };
00286
00287
00288
00297 virtual void zplfFFT (zCOMPLEX *pfDest, float *pfSrc) = 0;
00298
00307 virtual void zplfIFFT (float *pfDest, zCOMPLEX *pfSrc) = 0;
00308
00309
00317 int zplfGetWindow (float *pfWindow);
00318
00319 protected:
00320 int m_eLastError;
00321
00322 void CalculateWindow (_Fft_Windows_ eWindowType);
00323 unsigned int Log2 (int iValueAsPowOf2);
00324 virtual int BuildFFTTables () = 0;
00325 virtual void FreeFFTTables () = 0;
00326
00327 int m_iFFTLength,
00328 m_iBlockLength;
00329
00330 float *m_pfWindow;
00331 };
00332
00333
00344 extern int (ZCDECL *zplfFFTCreateInstance) (CzplfFFT_If*& pCFFT, int iBlockLength, int iZeroPadFactor, CzplfFFT_If::_Fft_Windows_ eWindowType);
00345
00353 extern int (ZCDECL *zplfFFTDestroyInstance) (CzplfFFT_If*& pCFFT);
00354
00355
00356 extern int (ZCDECL *zplfZeroCrossings) (float *pfSrc, int iRealLengthAsPowOf4);
00357
00358
00359 #endif // #if !defined(__libzplVecLib_HEADER_INCLUDED__)
00360
00361
00362