Subversion Repositories testOled

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "ref.h"
  2.  
  3. arm_status ref_mat_cmplx_mult_f32(
  4.   const arm_matrix_instance_f32 * pSrcA,
  5.   const arm_matrix_instance_f32 * pSrcB,
  6.   arm_matrix_instance_f32 * pDst)
  7. {
  8.         uint32_t r,c,i,outR,outC,innerSize;
  9.         float32_t sumR,sumI;
  10.         float32_t a0,b0,c0,d0;
  11.        
  12.         outR = pSrcA->numRows;
  13.         outC = pSrcB->numCols;
  14.         innerSize = pSrcA->numCols;
  15.        
  16.         for(r=0;r<outR;r++)
  17.         {
  18.                 for(c=0;c<outC;c++)
  19.                 {
  20.                         sumR = 0;
  21.                         sumI = 0;
  22.                        
  23.                         for(i=0;i<innerSize;i++)
  24.                         {
  25.                                 a0 = pSrcA->pData[2*(r*innerSize + i) + 0];
  26.                                 b0 = pSrcA->pData[2*(r*innerSize + i) + 1];
  27.                                 c0 = pSrcB->pData[2*(i*outC + c) + 0];
  28.                                 d0 = pSrcB->pData[2*(i*outC + c) + 1]; 
  29.                                
  30.                                 sumR += a0 * c0 - b0 * d0;
  31.                                 sumI += b0 * c0 + a0 * d0;
  32.                         }
  33.                        
  34.                         pDst->pData[2*(r*outC + c) + 0] = sumR;
  35.                         pDst->pData[2*(r*outC + c) + 1] = sumI;
  36.                 }
  37.         }
  38.        
  39.         return ARM_MATH_SUCCESS;
  40. }
  41.  
  42. arm_status ref_mat_cmplx_mult_q31(
  43.   const arm_matrix_instance_q31 * pSrcA,
  44.   const arm_matrix_instance_q31 * pSrcB,
  45.   arm_matrix_instance_q31 * pDst)
  46. {
  47.         uint32_t r,c,i,outR,outC,innerSize;
  48.         q63_t sumR,sumI;
  49.         q31_t a0,b0,c0,d0;
  50.        
  51.         outR = pSrcA->numRows;
  52.         outC = pSrcB->numCols;
  53.         innerSize = pSrcA->numCols;
  54.        
  55.         for(r=0;r<outR;r++)
  56.         {
  57.                 for(c=0;c<outC;c++)
  58.                 {
  59.                         sumR = 0;
  60.                         sumI = 0;
  61.                        
  62.                         for(i=0;i<innerSize;i++)
  63.                         {
  64.                                 a0 = pSrcA->pData[2*(r*innerSize + i) + 0];
  65.                                 b0 = pSrcA->pData[2*(r*innerSize + i) + 1];
  66.                                 c0 = pSrcB->pData[2*(i*outC + c) + 0];
  67.                                 d0 = pSrcB->pData[2*(i*outC + c) + 1]; 
  68.                                
  69.                                 sumR += (q63_t)a0 * c0 - (q63_t)b0 * d0;
  70.                                 sumI += (q63_t)b0 * c0 + (q63_t)a0 * d0;
  71.                         }
  72.                        
  73.                         pDst->pData[2*(r*outC + c) + 0] = ref_sat_q31(sumR >> 31);
  74.                         pDst->pData[2*(r*outC + c) + 1] = ref_sat_q31(sumI >> 31);
  75.                 }
  76.         }
  77.        
  78.         return ARM_MATH_SUCCESS;
  79. }
  80.  
  81. arm_status ref_mat_cmplx_mult_q15(
  82.   const arm_matrix_instance_q15 * pSrcA,
  83.   const arm_matrix_instance_q15 * pSrcB,
  84.   arm_matrix_instance_q15 * pDst)
  85. {
  86.         uint32_t r,c,i,outR,outC,innerSize;
  87.         q63_t sumR,sumI;
  88.         q15_t a0,b0,c0,d0;
  89.        
  90.         outR = pSrcA->numRows;
  91.         outC = pSrcB->numCols;
  92.         innerSize = pSrcA->numCols;
  93.        
  94.         for(r=0;r<outR;r++)
  95.         {
  96.                 for(c=0;c<outC;c++)
  97.                 {
  98.                         sumR = 0;
  99.                         sumI = 0;
  100.                        
  101.                         for(i=0;i<innerSize;i++)
  102.                         {
  103.                                 a0 = pSrcA->pData[2*(r*innerSize + i) + 0];
  104.                                 b0 = pSrcA->pData[2*(r*innerSize + i) + 1];
  105.                                 c0 = pSrcB->pData[2*(i*outC + c) + 0];
  106.                                 d0 = pSrcB->pData[2*(i*outC + c) + 1]; 
  107.                                
  108.                                 sumR += (q31_t)a0 * c0 - (q31_t)b0 * d0;
  109.                                 sumI += (q31_t)b0 * c0 + (q31_t)a0 * d0;
  110.                         }
  111.                        
  112.                         pDst->pData[2*(r*outC + c) + 0] = ref_sat_q15(sumR >> 15);
  113.                         pDst->pData[2*(r*outC + c) + 1] = ref_sat_q15(sumI >> 15);
  114.                 }
  115.         }
  116.        
  117.         return ARM_MATH_SUCCESS;
  118. }
  119.