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
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
00243 for (i = 1; i < iRealLengthAsPowOf4; i++)
00244 pfSrcDest[i] += pfSrc1[i] * pfSrc2[i] - pfSrc1[iDoubleNumOfSamples-i] * pfSrc2[iDoubleNumOfSamples-i];
00245
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 }