libcm is a C development framework with an emphasis on audio signal processing applications.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmVectOps.c 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. //| Copyright: (C) 2009-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. #include "cmPrefix.h"
  4. #include "cmGlobal.h"
  5. #include "cmFloatTypes.h"
  6. #include "cmComplexTypes.h"
  7. #include "cmRpt.h"
  8. #include "cmErr.h"
  9. #include "cmCtx.h"
  10. #include "cmMem.h"
  11. #include "cmMallocDebug.h"
  12. #include "cmLinkedHeap.h"
  13. #include "cmSymTbl.h"
  14. #include "cmMath.h"
  15. #ifdef OS_LINUX
  16. #include <cblas.h>
  17. #endif
  18. #include "cmAudioFile.h"
  19. #include "cmFileSys.h"
  20. #include "cmProcObj.h"
  21. #include "cmProcTemplate.h"
  22. #include "cmProc.h"
  23. #include "cmVectOps.h"
  24. #define cmVectOpsTemplateCode_h
  25. #define cmVectOpsRICode_h
  26. #include "cmVectOpsTemplateMain.h"
  27. unsigned _cmVOU_Abs( unsigned x ) { return x; }
  28. void cmVOU_VPrint( cmRpt_t* rpt, const char* fmt, ... )
  29. {
  30. va_list vl;
  31. va_start(vl,fmt);
  32. if( rpt == NULL )
  33. vprintf(fmt,vl);
  34. else
  35. cmRptVPrintf(rpt,fmt,vl);
  36. va_end(vl);
  37. }
  38. void cmVOI_Print( cmRpt_t* rpt, unsigned rn, unsigned cn, const int* sbp )
  39. {
  40. unsigned fieldWidth = cmDefaultFieldWidth;
  41. if( fieldWidth < 0 )
  42. fieldWidth = 10;
  43. unsigned ri,ci;
  44. for(ri=0; ri<rn; ++ri)
  45. {
  46. for(ci=0; ci<cn; ++ci )
  47. cmVOU_VPrint(rpt,"%*i ",fieldWidth,sbp[ (ci*rn) + ri ]);
  48. if( cn > 0 )
  49. cmVOU_VPrint(rpt,"\n");
  50. }
  51. }
  52. void cmVOU_Print( cmRpt_t* rpt, unsigned rn, unsigned cn, const unsigned* sbp )
  53. {
  54. unsigned fieldWidth = cmDefaultFieldWidth;
  55. if( fieldWidth < 0 )
  56. fieldWidth = 10;
  57. unsigned ri,ci;
  58. for(ri=0; ri<rn; ++ri)
  59. {
  60. for(ci=0; ci<cn; ++ci )
  61. cmVOU_VPrint(rpt,"%*u ",fieldWidth,sbp[ (ci*rn) + ri ]);
  62. if( cn > 0 )
  63. cmVOU_VPrint(rpt,"\n");
  64. }
  65. }
  66. void cmVOI_PrintL( const char* label, cmRpt_t* rpt, unsigned rn, unsigned cn, const int* sp )
  67. {
  68. cmVOU_VPrint(rpt,"%s ",label);
  69. return cmVOI_Print(rpt,rn,cn,sp);
  70. }
  71. void cmVOU_PrintL( const char* label, cmRpt_t* rpt, unsigned rn, unsigned cn, const unsigned* sp )
  72. {
  73. cmVOU_VPrint(rpt,"%s ",label);
  74. return cmVOU_Print(rpt,rn,cn,sp);
  75. }
  76. unsigned* cmVOU_Mod( unsigned* dbp, unsigned dn, unsigned modVal )
  77. {
  78. const unsigned* dep = dbp + dn;
  79. unsigned* dp = dbp;
  80. while( dbp < dep )
  81. *dbp++ %= modVal;
  82. return dp;
  83. }
  84. unsigned* cmVOU_Hist( unsigned* hbp, unsigned hn, const unsigned* sbp, unsigned sn )
  85. {
  86. const unsigned* sep = sbp + sn;
  87. unsigned* rp = hbp;
  88. memset(hbp,0,hn * sizeof(*hbp));
  89. while( sbp < sep )
  90. {
  91. assert( *sbp < hn );
  92. ++hbp[ *sbp++ ];
  93. }
  94. return rp;
  95. }
  96. unsigned* cmVOU_Random( unsigned* vbp, unsigned vn, unsigned maxValue )
  97. {
  98. unsigned* rp = vbp;
  99. const unsigned* vep = vbp + vn;
  100. while( vbp < vep )
  101. *vbp++ = rand() % (maxValue+1);
  102. return rp;
  103. }
  104. unsigned* cmVOU_UniqueRandom( unsigned* dV, unsigned dN, unsigned maxValue )
  105. {
  106. assert( dN < maxValue );
  107. if( dN == 0 )
  108. return dV;
  109. // if maxValue is less than twice dN then use cmVOU_RandomSeq() to
  110. // generate the random numbers. This is intended to avoid a situation
  111. // where the attempt to generate a unique random number is confined
  112. // to an decreasing range of possible target values - as would occur
  113. // if dN==maxValue.
  114. if( maxValue / dN <= 2 )
  115. {
  116. unsigned* v = cmMemAllocZ( unsigned, maxValue+1 );
  117. cmVOU_RandomSeq(v,maxValue+1);
  118. cmVOU_Copy(dV,dN,v);
  119. cmMemPtrFree(&v);
  120. }
  121. unsigned* tV = cmMemAllocZ( unsigned, dN );
  122. unsigned i = 0;
  123. unsigned j = 0;
  124. unsigned n = dN;
  125. while(n)
  126. {
  127. // generate a set of random integers
  128. cmVOU_Random(tV,n,maxValue);
  129. // store each unique random int
  130. for(j=0; j<n; ++j)
  131. if( cmVOU_Count(dV,i,tV[j]) == 0 )
  132. dV[i++] = tV[j];
  133. n = dN - i;
  134. }
  135. cmMemPtrFree(&tV);
  136. return dV;
  137. }
  138. int cmVOU_Compare(const void* p0, const void* p1)
  139. { return *(unsigned*)p0 < *(unsigned*)p1; }
  140. unsigned* cmVOU_RandomSeq( unsigned* vbp, unsigned vn )
  141. {
  142. unsigned i,j;
  143. unsigned* r = cmMemAllocZ( unsigned, vn );
  144. // generate a list of random values
  145. for(i=0; i<vn; ++i)
  146. {
  147. r[i] = rand();
  148. vbp[i] = r[i];
  149. }
  150. // sort the random number list
  151. qsort(r,vn,sizeof(unsigned),cmVOU_Compare);
  152. // set vbp[i] to the index of the matching value in r[]
  153. for(i=0; i<vn; ++i)
  154. for(j=0; j<vn; ++j)
  155. if( vbp[i] == r[j] )
  156. {
  157. vbp[i] = j;
  158. break;
  159. }
  160. cmMemPtrFree(&r);
  161. return vbp;
  162. }
  163. cmReal_t cmVOU_Mean(const unsigned* sp, unsigned sn )
  164. {
  165. cmReal_t sum = (cmReal_t)cmVOU_Sum(sp,sn);
  166. return sum/sn;
  167. }
  168. cmReal_t cmVOU_Variance(const unsigned* sp, unsigned sn, const cmReal_t* meanPtr)
  169. {
  170. if( sn <= 1 )
  171. return 0;
  172. cmReal_t sum = 0;
  173. cmReal_t mv = meanPtr==NULL ? cmVOU_Mean(sp,sn) : *meanPtr;
  174. const unsigned* bp = sp;
  175. const unsigned* ep = sp + sn;
  176. for(; bp < ep; ++bp )
  177. sum += (((cmReal_t)*bp)-mv) * (((cmReal_t)*bp)-mv);
  178. return sum / (sn-1);
  179. }
  180. cmReal_t cmVOI_Mean(const int* sp, unsigned sn )
  181. {
  182. cmReal_t sum = (cmReal_t)cmVOI_Sum(sp,sn);
  183. return sum/sn;
  184. }
  185. cmReal_t cmVOI_Variance(const int* sp, unsigned sn, const cmReal_t* meanPtr)
  186. {
  187. if( sn <= 1 )
  188. return 0;
  189. cmReal_t sum = 0;
  190. cmReal_t mv = meanPtr==NULL ? cmVOI_Mean(sp,sn) : *meanPtr;
  191. const int* bp = sp;
  192. const int* ep = sp + sn;
  193. for(; bp < ep; ++bp )
  194. sum += (((cmReal_t)*bp)-mv) * (((cmReal_t)*bp)-mv);
  195. return sum / (sn-1);
  196. }
  197. // dbp[1,dn] = v[1,vn] * m[vn,dn]
  198. cmComplexR_t* cmVORC_MultVVM( cmComplexR_t* dbp, unsigned dn, const cmComplexR_t* vp, unsigned vn, const cmComplexR_t* mp )
  199. {
  200. cmComplexR_t alpha = 1.0 + (I*0);
  201. cmComplexR_t beta = 0.0 + (I*0);
  202. unsigned drn = 1;
  203. unsigned dcn = dn;
  204. unsigned n = vn;
  205. cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans, drn, dcn, n, &alpha, vp, drn, mp, n, &beta, dbp, drn );
  206. return dbp;
  207. }