math_helper.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "ref_common.h"
  2. float riscv_snr_f32(float* pRef, float* pTest, uint32_t buffSize)
  3. {
  4. float EnergySignal = 0.0, EnergyError = 0.0;
  5. uint32_t i;
  6. float SNR;
  7. int temp;
  8. int* test;
  9. for (i = 0; i < buffSize; i++) {
  10. /* Checking for a NAN value in pRef array */
  11. test = (int*)(&pRef[i]);
  12. temp = *test;
  13. if (temp == 0x7FC00000) {
  14. return (0);
  15. }
  16. /* Checking for a NAN value in pTest array */
  17. test = (int*)(&pTest[i]);
  18. temp = *test;
  19. if (temp == 0x7FC00000) {
  20. return (0);
  21. }
  22. EnergySignal += pRef[i] * pRef[i];
  23. EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]);
  24. }
  25. /* Checking for a NAN value in EnergyError */
  26. test = (int*)(&EnergyError);
  27. temp = *test;
  28. if (temp == 0x7FC00000) {
  29. return (0);
  30. }
  31. SNR = 10 * log10(EnergySignal / EnergyError);
  32. return (SNR);
  33. }
  34. float32_t ref_detrm(float32_t* pSrc, float32_t* temp, uint32_t size)
  35. {
  36. float32_t s = 1, det = 0;
  37. int i, j, m, n, c;
  38. if (size == 1) {
  39. return (pSrc[0]);
  40. } else {
  41. det = 0;
  42. for (c = 0; c < size; c++) {
  43. m = 0;
  44. n = 0;
  45. for (i = 0; i < size; i++) {
  46. for (j = 0; j < size; j++) {
  47. temp[i * size + j] = 0;
  48. if (i != 0 && j != c) {
  49. temp[m * (size - 1) + n] = pSrc[i * size + j];
  50. if (n < (size - 2)) {
  51. n++;
  52. } else {
  53. n = 0;
  54. m++;
  55. }
  56. }
  57. }
  58. }
  59. det +=
  60. s * (pSrc[c] * ref_detrm(temp, temp + size * size, size - 1));
  61. s = -s;
  62. }
  63. }
  64. return (det);
  65. }
  66. void ref_cofact(float32_t* pSrc, float32_t* pDst, float32_t* temp,
  67. uint32_t size)
  68. {
  69. int p, q, m, n, i, j;
  70. if (size == 1) {
  71. pDst[0] = 1;
  72. return;
  73. }
  74. for (q = 0; q < size; q++) {
  75. for (p = 0; p < size; p++) {
  76. m = 0;
  77. n = 0;
  78. for (i = 0; i < size; i++) {
  79. for (j = 0; j < size; j++) {
  80. temp[i * size + j] = 0;
  81. if (i != q && j != p) {
  82. temp[m * (size - 1) + n] = pSrc[i * size + j];
  83. if (n < (size - 2)) {
  84. n++;
  85. } else {
  86. n = 0;
  87. m++;
  88. }
  89. }
  90. }
  91. }
  92. pDst[q * size + p] =
  93. ref_pow(-1, q + p) *
  94. ref_detrm(temp, temp + (size - 1) * (size - 1), size - 1);
  95. }
  96. }
  97. }
  98. float64_t ref_detrm64(float64_t* pSrc, float64_t* temp, uint32_t size)
  99. {
  100. float64_t s = 1, det = 0;
  101. int i, j, m, n, c;
  102. if (size == 1) {
  103. return (pSrc[0]);
  104. } else {
  105. det = 0;
  106. for (c = 0; c < size; c++) {
  107. m = 0;
  108. n = 0;
  109. for (i = 0; i < size; i++) {
  110. for (j = 0; j < size; j++) {
  111. temp[i * size + j] = 0;
  112. if (i != 0 && j != c) {
  113. temp[m * (size - 1) + n] = pSrc[i * size + j];
  114. if (n < (size - 2)) {
  115. n++;
  116. } else {
  117. n = 0;
  118. m++;
  119. }
  120. }
  121. }
  122. }
  123. det +=
  124. s * (pSrc[c] * ref_detrm64(temp, temp + size * size, size - 1));
  125. s = -s;
  126. }
  127. }
  128. return (det);
  129. }
  130. void ref_cofact64(float64_t* pSrc, float64_t* pDst, float64_t* temp,
  131. uint32_t size)
  132. {
  133. int p, q, m, n, i, j;
  134. if (size == 1) {
  135. pDst[0] = 1;
  136. return;
  137. }
  138. for (q = 0; q < size; q++) {
  139. for (p = 0; p < size; p++) {
  140. m = 0;
  141. n = 0;
  142. for (i = 0; i < size; i++) {
  143. for (j = 0; j < size; j++) {
  144. temp[i * size + j] = 0;
  145. if (i != q && j != p) {
  146. temp[m * (size - 1) + n] = pSrc[i * size + j];
  147. if (n < (size - 2)) {
  148. n++;
  149. } else {
  150. n = 0;
  151. m++;
  152. }
  153. }
  154. }
  155. }
  156. pDst[q * size + p] =
  157. ref_pow(-1, q + p) *
  158. ref_detrm64(temp, temp + (size - 1) * (size - 1), size - 1);
  159. }
  160. }
  161. }