Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

FEAPIExamplePluginZeroCrossings/zplVecLibGen.cpp

Go to the documentation of this file.
00001 
00002 //     /*! \file zplVecLibGen.cpp: \brief implementation of the zplVecLib generic functions. */
00003 //
00004 //        Copyright (c) 2004-2007  
00005 //        zplane.development
00006 //        Flohrer Lerch Schwerdtfeger GbR
00007 //        All rights reserved.
00008 //
00009 //        Redistribution and use in source and binary forms, with or without 
00010 //        modification, are permitted provided that the following conditions 
00011 //        are met:
00012 //
00013 //        *   Redistributions of source code must retain the above copyright 
00014 //            notice, this list of conditions and the following disclaimer. 
00015 //        *   Redistributions in binary form must reproduce the above 
00016 //            copyright notice, this list of conditions and the following 
00017 //            disclaimer in the documentation and/or other materials 
00018 //            provided with the distribution. 
00019 //        *   Neither the name of the FEAPI development team nor the names 
00020 //            of its contributors may be used to endorse or promote products 
00021 //            derived from this software without specific prior written 
00022 //            permission. 
00023 //
00024 //        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
00025 //        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
00026 //        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
00027 //        FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
00028 //        COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
00029 //        INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
00030 //        BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
00031 //        LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
00032 //        CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
00033 //        LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
00034 //        ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
00035 //        POSSIBILITY OF SUCH DAMAGE.
00036 //
00039 
00040 #include <stdlib.h>
00041 #include <string.h>
00042 #include <math.h>
00043 
00044 #include "zplVecLib.h"
00045 
00046 #ifndef ZABS
00047 #define ZABS(a)                 (((a) > (0)) ? (a) : -(a))
00048 #endif
00049 
00050 float*   zplfMalloc_Gen      (int       iNumOfFloats)
00051 {
00052     ZASSERT (iNumOfFloats <= 0);
00053     
00054     return ((float*) malloc (iNumOfFloats * sizeof(float)));
00055 }
00056 
00057 
00058 void       zplfFree_Gen        (float   *&ppfBuffer)
00059 {
00060     ZASSERT (&ppfBuffer == 0 || ppfBuffer == 0);
00061 
00062     free (ppfBuffer);
00063     ppfBuffer   = 0;
00064 
00065     return;
00066 }
00067 
00068 
00069 void       zplfSetZero_Gen     (float   *pfBuffer, int iLengthAsPowOf4)
00070 {
00071     ZASSERT (pfBuffer == 0);
00072     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00073 
00074     if (iLengthAsPowOf4 == 0)
00075         return;
00076 
00077     memset (pfBuffer, 0, sizeof (float) * iLengthAsPowOf4);
00078     return;
00079 }
00080 
00081 
00082 void       zplfRealFindMax_Gen   (float    *pfSrc, float    *pfMax, int    *piIdx, int    iLengthAsPowOf4)
00083 {
00084     ZASSERT (pfSrc == 0 || pfMax == 0 || piIdx == 0);
00085     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00086     
00087     *piIdx = 0;
00088     *pfMax  = -1e37F;
00089 
00090     for (int i = 0; i < iLengthAsPowOf4; i++)
00091     {
00092         if (pfSrc[i] >= *pfMax)
00093         {
00094             *pfMax  = pfSrc[i];
00095             *piIdx  = i;
00096         }
00097     }
00098     return;
00099 }
00100 
00101 void       zplfRealAdd_I_Gen   (float   *pfSrcDest, float    *pfSrc, int    iLengthAsPowOf4)
00102 {
00103     ZASSERT (pfSrc == 0 || pfSrcDest == 0);
00104     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00105 
00106     for (int i = 0; i < iLengthAsPowOf4; i++)
00107         pfSrcDest[i]   += pfSrc[i];
00108 
00109     return;
00110 }
00111 
00112 void       zplfRealAddC_I_Gen   (float   *pfSrcDest, float    fValue, int    iLengthAsPowOf4)
00113 {
00114     ZASSERT (pfSrcDest == 0);
00115     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00116 
00117     for (int i = 0; i < iLengthAsPowOf4; i++)
00118         pfSrcDest[i]   += fValue;
00119 
00120     return;
00121 }
00122 
00123 void       zplfRealSub_I_Gen   (float   *pfSrcDest, float    *pfSrc, int    iLengthAsPowOf4)
00124 {
00125     ZASSERT (pfSrc == 0 || pfSrcDest == 0);
00126     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00127 
00128     for (int i = 0; i < iLengthAsPowOf4; i++)
00129         pfSrcDest[i]   -= pfSrc[i];
00130 
00131     return;
00132 }
00133 
00134 
00135 void       zplfRealMul_I_Gen   (float   *pfSrcDest, float    *pfSrc, int    iLengthAsPowOf4)
00136 {
00137     ZASSERT (pfSrc == 0 || pfSrcDest == 0);
00138     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00139 
00140     for (int i = 0; i < iLengthAsPowOf4; i++)
00141         pfSrcDest[i]   *= pfSrc[i];
00142 
00143     return;
00144 }
00145 
00146 void       zplfRealMulC_I_Gen  (float   *pfSrcDest, float    fScaleFactor, int    iLengthAsPowOf4)
00147 {
00148     ZASSERT (pfSrcDest == 0);
00149     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00150 
00151     for (int i = 0; i < iLengthAsPowOf4; i++)
00152         pfSrcDest[i]   *= fScaleFactor;
00153 
00154     return;
00155 }
00156 
00157 void       zplfRealDiv_I_Gen   (float   *pfNomSrcDest, float    *pfDenomSrc, int    iLengthAsPowOf4)
00158 {
00159     ZASSERT (pfDenomSrc == 0 || pfNomSrcDest == 0);
00160     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00161 
00162     for (int i = 0; i < iLengthAsPowOf4; i++)
00163     {
00164         ZASSERT (pfDenomSrc[i] == 0);
00165         pfNomSrcDest[i]   /= pfDenomSrc[i];
00166     }
00167 
00168     return;
00169 }
00170 
00171 
00172 void       zplfRealMac_I_Gen   (float   *pfSrcDest, float    *pfSrc1, float   *pfSrc2, int   iLengthAsPowOf4)
00173 {
00174     ZASSERT (pfSrc1 == 0 || pfSrc2 == 0 || pfSrcDest == 0);
00175     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00176 
00177     for (int i = 0; i < iLengthAsPowOf4; i++)
00178         pfSrcDest[i]   += pfSrc1[i] * pfSrc2[i];
00179 
00180     return;
00181 }
00182 
00183 
00184 void       zplfRealAbs_I_Gen   (float   *pfSrcDest, int iLengthAsPowOf4)
00185 {
00186     ZASSERT (pfSrcDest == 0);
00187     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00188 
00189     for (int i = 0; i < iLengthAsPowOf4; i++)
00190         pfSrcDest[i]    = ZABS(pfSrcDest[i]);
00191 
00192     return;
00193 }
00194 
00195 
00196 float    zplfRealSum_Gen   (float   *pfSrc, int iLengthAsPowOf4)
00197 {
00198     float fResult = 0;
00199     ZASSERT (pfSrc == 0);
00200     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00201 
00202     for (int i = 0; i < iLengthAsPowOf4; i+=4)
00203     {
00204         fResult += pfSrc[i];
00205         fResult += pfSrc[i+1];
00206         fResult += pfSrc[i+2];
00207         fResult += pfSrc[i+3];
00208     }
00209     return fResult;
00210 }
00211 
00212 
00213 void       zplfCompAdd_I_Gen   (zCOMPLEX   *pfSrcDest, zCOMPLEX    *pfSrc,  int iRealLengthAsPowOf4)
00214 {
00215     zplfRealAdd_I (pfSrcDest, pfSrc, (iRealLengthAsPowOf4<<1));
00216 }
00217 
00218 
00219 void       zplfCompMul_I_Gen   (zCOMPLEX   *pfSrcDest, zCOMPLEX    *pfSrc,  int iRealLengthAsPowOf4)
00220 {
00221     ZASSERT (1); 
00222 }
00223 
00224 
00225 void       zplfCompDiv_I_Gen   (zCOMPLEX   *pfNomSrcDest, zCOMPLEX    *pfDenomSrc, int    iRealLengthAsPowOf4)
00226 {
00227     ZASSERT (1); 
00228 }
00229 
00230 
00231 void       zplfCompMac_I_Gen   (zCOMPLEX   *pfSrcDest, zCOMPLEX    *pfSrc1, float   *pfSrc2, int   iRealLengthAsPowOf4)
00232 {
00233     int    i,
00234             iDoubleNumOfSamples = (iRealLengthAsPowOf4<<1);
00235 
00236     ZASSERT (pfSrc1 == 0 || pfSrc2 == 0 || pfSrcDest == 0);
00237     ZASSERT ((iRealLengthAsPowOf4 < 0) || (iRealLengthAsPowOf4%4 != 0));
00238 
00239     pfSrcDest[0]                    += pfSrc1[0] * pfSrc2[0];
00240     pfSrcDest[iRealLengthAsPowOf4]  += pfSrc1[iRealLengthAsPowOf4] * pfSrc2[iRealLengthAsPowOf4];
00241 
00242     //Re
00243     for (i = 1; i < iRealLengthAsPowOf4; i++)
00244         pfSrcDest[i] += pfSrc1[i] * pfSrc2[i] - pfSrc1[iDoubleNumOfSamples-i] * pfSrc2[iDoubleNumOfSamples-i];
00245     //Im
00246     for (i = iRealLengthAsPowOf4+1; i < iDoubleNumOfSamples; i++)
00247         pfSrcDest[i] += pfSrc1[i] * pfSrc2[iDoubleNumOfSamples-i] + pfSrc1[iDoubleNumOfSamples-i] * pfSrc2[i];
00248 
00249     return;
00250 }
00251 
00252 
00253 void       zplfCompAbs_Gen     (float   *pfDest,    zCOMPLEX    *pfSrc1, int iRealLengthAsPowOf4)
00254 {
00255     int    i;
00256 
00257     float  *pfImagData = pfSrc1 + iRealLengthAsPowOf4;
00258 
00259     ZASSERT (pfSrc1 == 0 || pfDest == 0);
00260     ZASSERT ((iRealLengthAsPowOf4 < 0) || (iRealLengthAsPowOf4%4 != 0));
00261 
00262     pfDest[0] = ZABS (pfSrc1[0]);
00263         
00264     for (i = 1; i < iRealLengthAsPowOf4; i++)
00265         pfDest[i]       = sqrtf (pfSrc1[i] * pfSrc1[i] + pfImagData[iRealLengthAsPowOf4-i] * pfImagData[iRealLengthAsPowOf4-i]);
00266 
00267     return;
00268 }
00269 
00270 
00271 int zplfZeroCrossings_Gen (float *pfSrc, int iLengthAsPowOf4)
00272 {
00273     ZASSERT (pfSrc == 0);
00274     ZASSERT ((iLengthAsPowOf4 < 0) || (iLengthAsPowOf4%4 != 0));
00275 
00276     int iResult = 0;
00277     for (int i = 1; i < iLengthAsPowOf4; i++)
00278     {
00279         if (pfSrc[i] * pfSrc[i-1] < 0)
00280             iResult++;
00281     }
00282     return iResult;
00283 }

Generated on Fri Mar 23 10:28:54 2007 for FEAPI Plugin Documentation by  doxygen 1.3.9.1