席萌0209 发表于 2015-4-1 10:37:19

【安富莱DSP教程】第20章 MatrixFunctions的使用(二)

特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
第20章 MatrixFunctions的使用(二)

    本期教程主要讲解矩阵运算中的放缩,乘法和转置。
    20.1 矩阵放缩 MatScale
    20.2 矩阵乘法 MatMult
    20.3 转置矩阵 MatTrans
    20.4 总结

20.1 矩阵放缩 MatScale

20.1.1 arm_mat_scale_f32

公式描述:
函数定义如下:
    arm_status arm_mat_scale_f32(
      const arm_matrix_instance_f32 * pSrc,
      float32_t scale,
      arm_matrix_instance_f32 * pDst)
参数定义:
           *pSrc points to input matrix structure      
           scale scale factor to be applied         
          *pDst points to output matrix structure      
    return    The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>   

20.1.2 arm_mat_scale_q31

函数定义如下:
    arm_status arm_mat_scale_q31(
      const arm_matrix_instance_q31 * pSrc,
      q31_t scaleFract,
      int32_t shift,
      arm_matrix_instance_q31 * pDst)
参数定义:
          *pSrc    points to input matrix      
          scaleFract fractional portion of the scale factor      
          shift       number of bits to shift the result by      
        *pDst    points to output matrix structure      
    return   The function returns either
注意事项:
    1. 两个1.31格式的数据相乘产生2.62格式的数据,最终结果要做偏移和饱和运算产生1.31格式数据。
    2. 定点数的最终放缩比例计算是:scale = scaleFract * 2^shift.

20.1.3 arm_mat_scale_q15

函数定义如下:
    arm_status arm_mat_scale_q15(
      const arm_matrix_instance_q15 * pSrc,
      q15_t scaleFract,
      int32_t shift,
      arm_matrix_instance_q15 * pDst)
参数定义:
    *S       points to an instance of the floating-point matrix structure.   
       nRows    number of rows in the matrix.   
       nColumns number of columns in the matrix.   
       *pData       points to the matrix data array.
注意事项:
    1. 两个1.15格式的数据相乘产生2.30格式的数据,最终结果要做偏移和饱和运算产生1.15格式数据。
    2. 定点数的最终放缩比例计算是:scale = scaleFract * 2^shift.

20.1.4 实例讲解

实验目的:
    1. 学习MatrixFunctions中矩阵的放缩
实验内容:
    1. 按下按键K1, 串口打印函数DSP_MatScale的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
程序设计:
/*
*********************************************************************************************************
*    函 数 名: DSP_MatScale
*    功能说明: 矩阵放缩
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void DSP_MatScale(void)
{
uint8_t i;
/****浮点数数组******************************************************************/
float32_t pDataA = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
float32_t scale = 1.1f;
float32_t pDataDst;
arm_matrix_instance_f32 pSrcA; //3行3列数据
arm_matrix_instance_f32 pDst;
/****定点数Q31数组******************************************************************/
q31_t pDataA1 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q31_t scaleFract = 10;
   int32_t shift = 0;
q31_t pDataDst1;
arm_matrix_instance_q31 pSrcA1; //3行3列数据
arm_matrix_instance_q31 pDst1;
/****定点数Q15数组******************************************************************/
q15_t pDataA2 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q15_t scaleFract1 = 10;
   int32_t shift1 = 0;
q15_t pDataDst2;
arm_matrix_instance_q15 pSrcA2; //3行3列数据
arm_matrix_instance_q15 pDst2;
/****浮点数***********************************************************************/
pSrcA.numCols = 3;
pSrcA.numRows = 3;
pSrcA.pData = pDataA;

pDst.numCols = 3;
pDst.numRows = 3;
pDst.pData = pDataDst;
printf("****浮点数******************************************\r\n");
arm_mat_scale_f32(&pSrcA, scale, &pDst);
for(i = 0; i < 9; i++)
{
printf("pDataDst[%d] = %f\r\n", i, pDataDst);
}
/****定点数Q31***********************************************************************/
pSrcA1.numCols = 3;
pSrcA1.numRows = 3;
pSrcA1.pData = pDataA1;
pDst1.numCols = 3;
pDst1.numRows = 3;
pDst1.pData = pDataDst1;
printf("****定点数Q31******************************************\r\n");
arm_mat_scale_q31(&pSrcA1, scaleFract, shift, &pDst1);
for(i = 0; i < 9; i++)
{
printf("pDataDst1[%d] = %d\r\n", i, pDataDst1);
}
/****定点数Q15***********************************************************************/
pSrcA2.numCols = 3;
pSrcA2.numRows = 3;
pSrcA2.pData = pDataA2;
pDst2.numCols = 3;
pDst2.numRows = 3;
pDst2.pData = pDataDst2;
printf("****定点数Q15******************************************\r\n");
arm_mat_scale_q15(&pSrcA2, scaleFract1, shift1, &pDst2);
for(i = 0; i < 9; i++)
{
printf("pDataDst2[%d] = %d\r\n", i, pDataDst2);
}
}
1. 下面通过matlab来实现矩阵的放缩:

席萌0209 发表于 2015-4-1 10:42:37

20.2 矩阵乘法 MatMult

20.2.1 arm_mat_mult_f32

公式描述:

函数定义如下:
    arm_status arm_mat_mult_f32(
      const arm_matrix_instance_f32 * pSrcA,
      const arm_matrix_instance_f32 * pSrcB,
      arm_matrix_instance_f32 * pDst)
参数定义:
           *pSrcA points to the first input matrix structure   
           *pSrcB points to the second input matrix structure   
          *pDst points to output matrix structure   
    return   The function returns either   
注意事项:
    1. 两个矩阵M x N和N x P相乘的结果是M x P.(必须保证一个矩形的列数等于另一个矩阵的行数)。

20.2.2 arm_mat_mult_q31

函数定义如下:
    arm_status arm_mat_mult_q31(
      const arm_matrix_instance_q31 * pSrcA,
      const arm_matrix_instance_q31 * pSrcB,
      arm_matrix_instance_q31 * pDst)
参数定义:
        *pSrcA points to the first input matrix structure   
        *pSrcB points to the second input matrix structure   
    *pDst points to output matrix structure   
    return           The function returns either
注意事项:
    1. 两个1.31格式的数据相乘产生2.62格式的数据,最终结果要做偏移和饱和运算产生1.31格式数据。
    2. 两个矩阵M x N和N x P相乘的结果是M x P.(必须保证一个矩形的列数等于另一个矩阵的行数)。

20.2.3 arm_mat_mult_q15

函数定义如下:
    arm_status arm_mat_mult_q15(
      const arm_matrix_instance_q15 * pSrcA,
      const arm_matrix_instance_q15 * pSrcB,
      arm_matrix_instance_q15 * pDst,
      q15_t * pState CMSIS_UNUSED)
参数定义:
       *pSrcA points to the first input matrix structure   
       *pSrcB points to the second input matrix structure   
       *pDst    points to output matrix structure   
            *pState points to the array for storing intermediate results   
    return           The function returns either   
注意事项:
    1. 两个1.15格式数据相乘是2.30格式,函数的内部使用了64位的累加器,那个就是34.30格式,最终结果将低15位截取掉并作饱和处理为1.15格式。
    2. 两个矩阵M x N和N x P相乘的结果是M x P.(必须保证一个矩形的列数等于另一个矩阵的行数)。

20.2.4 arm_mat_mult_fast_q31

函数定义如下:
    arm_status arm_mat_mult_fast_q31(
      const arm_matrix_instance_q31 * pSrcA,
      const arm_matrix_instance_q31 * pSrcB,
      arm_matrix_instance_q31 * pDst)
参数定义:
        *pSrcA points to the first input matrix structure   
        *pSrcB points to the second input matrix structure   
    *pDst points to output matrix structure   
    return           The function returns either
注意事项:
    1. 两个1.31格式的数据相乘产生2.62格式的数据,最终结果要做偏移和饱和运算产生1.31格式数据。
    2. 两个矩阵M x N和N x P相乘的结果是M x P.(必须保证一个矩形的列数等于另一个矩阵的行数)。
    3. 函数arm_mat_mult_fast_q31是arm_mat_mult_q31的快速算法。

20.2.5 arm_mat_mult_fast_q15

函数定义如下:
    arm_status arm_mat_mult_fast_q15(
      const arm_matrix_instance_q15 * pSrcA,
      const arm_matrix_instance_q15 * pSrcB,
      arm_matrix_instance_q15 * pDst,
      q15_t * pState)
参数定义:
       *pSrcA points to the first input matrix structure   
       *pSrcB points to the second input matrix structure   
       *pDst    points to output matrix structure   
            *pState points to the array for storing intermediate results   
    return           The function returns either   
注意事项:
    1. 两个1.15格式数据相乘是2.30格式,函数的内部使用了64位的累加器,那个就是34.30格式,最终结果将低15位截取掉并作饱和处理为1.15格式。
    2. 两个矩阵M x N和N x P相乘的结果是M x P.(必须保证一个矩形的列数等于另一个矩阵的行数)。
    3. 函数arm_mat_mult_fast_q15是arm_mat_mult_q15的快速算法。

20.2.6 实例讲解

实验目的:
    1. 学习MatrixFunctions中矩阵乘法
实验内容:
    1. 按下按键K2, 串口打印函数DSP_MatMult的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
程序设计:
/*
*********************************************************************************************************
*    函 数 名: DSP_MatMult
*    功能说明: 矩阵乘法
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void DSP_MatMult(void)
{
uint8_t i;
/****浮点数数组******************************************************************/
float32_t pDataA = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
float32_t pDataB = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
float32_t pDataDst;
arm_matrix_instance_f32 pSrcA; //3行3列数据
arm_matrix_instance_f32 pSrcB; //3行3列数据
arm_matrix_instance_f32 pDst;
/****定点数Q31数组******************************************************************/
q31_t pDataA1 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q31_t pDataB1 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q31_t pDataDst1;
arm_matrix_instance_q31 pSrcA1; //3行3列数据
arm_matrix_instance_q31 pSrcB1; //3行3列数据
arm_matrix_instance_q31 pDst1;
/****定点数Q15数组******************************************************************/
q15_t pDataA2 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q15_t pDataB2 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q15_t pDataDst2;
arm_matrix_instance_q15 pSrcA2; //3行3列数据
arm_matrix_instance_q15 pSrcB2; //3行3列数据
arm_matrix_instance_q15 pDst2;
q15_t pState;
/****浮点数***********************************************************************/
pSrcA.numCols = 3;
pSrcA.numRows = 3;
pSrcA.pData = pDataA;
pSrcB.numCols = 3;
pSrcB.numRows = 3;
pSrcB.pData = pDataB;
pDst.numCols = 3;
pDst.numRows = 3;
pDst.pData = pDataDst;
printf("****浮点数******************************************rn");
arm_mat_mult_f32(&pSrcA, &pSrcB, &pDst);
for(i = 0; i < 9; i++)
{
printf("pDataDst[%d] = %frn", i, pDataDst);
}
/****定点数Q31***********************************************************************/
pSrcA1.numCols = 3;
pSrcA1.numRows = 3;
pSrcA1.pData = pDataA1;
pSrcB1.numCols = 3;
pSrcB1.numRows = 3;
pSrcB1.pData = pDataB1;
pDst1.numCols = 3;
pDst1.numRows = 3;
pDst1.pData = pDataDst1;
printf("****定点数Q31******************************************rn");
arm_mat_mult_q31(&pSrcA1, &pSrcB1, &pDst1);
arm_mat_mult_fast_q31(&pSrcA1, &pSrcB1, &pDst1);
for(i = 0; i < 9; i++)
{
printf("pDataDst1[%d] = %drn", i, pDataDst1);
}
/****定点数Q15***********************************************************************/
pSrcA2.numCols = 3;
pSrcA2.numRows = 3;
pSrcA2.pData = pDataA2;
pSrcB2.numCols = 3;
pSrcB2.numRows = 3;
pSrcB2.pData = pDataB2;
pDst2.numCols = 3;
pDst2.numRows = 3;
pDst2.pData = pDataDst2;
printf("****定点数Q15******************************************rn");
arm_mat_mult_q15(&pSrcA2, &pSrcB2, &pDst2, &pState);
arm_mat_mult_fast_q15(&pSrcA2, &pSrcB2, &pDst2, &pState);
for(i = 0; i < 9; i++)
{
printf("pDataDst2[%d] = %drn", i, pDataDst2);
}
}
1. 下面通过matlab实现矩阵的乘法:

席萌0209 发表于 2015-4-1 10:56:43

20.3 转置矩阵 MatTrans

20.3.1 arm_mat_trans_f32

公式描述:

函数定义如下:
    arm_status arm_mat_trans_f32(
      const arm_matrix_instance_f32 * pSrc,
      arm_matrix_instance_f32 * pDst)
参数定义:
    *pSrc points to the input matrix   
    *pDst points to the output matrix   
    return     The function returns either<code>ARM_MATH_SIZE_MISMATCH</code>
注意事项:
    1. 矩阵M x N转置后是N x M。

20.3.2 arm_mat_trans_q31

函数定义如下:
    arm_status arm_mat_trans_q31(
      const arm_matrix_instance_q31 * pSrc,
      arm_matrix_instance_q31 * pDst)
参数定义:
    *pSrc points to the input matrix   
    *pDst points to the output matrix   
   return     The function returns either<code>ARM_MATH_SIZE_MISMATCH</code>
注意事项:
    1. 矩阵M x N转置后是N x M。

20.3.3 arm_mat_trans_q15

函数定义如下:
    arm_status arm_mat_trans_q15(
      const arm_matrix_instance_q15 * pSrc,
      arm_matrix_instance_q15 * pDst)
参数定义:
    *pSrc points to the input matrix   
    *pDst points to the output matrix   
   return     The function returns either<code>ARM_MATH_SIZE_MISMATCH</code>
注意事项:
    1. 矩阵M x N转置后是N x M。

20.3.4 实例讲解

实验目的:
    1. 学习MatrixFunctions中的转置矩阵
实验内容:
    1. 按下按键K3, 串口打印函数DSP_MatTrans的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
程序设计:
/*
*********************************************************************************************************
*    函 数 名: DSP_MatTrans
*    功能说明: 求逆矩阵
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void DSP_MatTrans(void)
{
uint8_t i;
/****浮点数数组******************************************************************/
float32_t pDataA = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
float32_t pDataDst;
arm_matrix_instance_f32 pSrcA; //3行3列数据
arm_matrix_instance_f32 pDst;
/****定点数Q31数组******************************************************************/
q31_t pDataA1 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q31_t pDataDst1;
arm_matrix_instance_q31 pSrcA1; //3行3列数据
arm_matrix_instance_q31 pDst1;
/****定点数Q15数组******************************************************************/
q15_t pDataA2 = {1, 1, 2, 2, 3, 3, 4, 4, 5};
q15_t pDataDst2;
arm_matrix_instance_q15 pSrcA2; //3行3列数据
arm_matrix_instance_q15 pDst2;
/****浮点数***********************************************************************/
pSrcA.numCols = 3;
pSrcA.numRows = 3;
pSrcA.pData = pDataA;

pDst.numCols = 3;
pDst.numRows = 3;
pDst.pData = pDataDst;
printf("****浮点数******************************************rn");
status = arm_mat_trans_f32(&pSrcA, &pDst);
for(i = 0; i < 9; i++)
{
printf("pDataDst[%d] = %frn", i, pDataDst);
}
/****定点数Q31***********************************************************************/
pSrcA1.numCols = 3;
pSrcA1.numRows = 3;
pSrcA1.pData = pDataA1;
pDst1.numCols = 3;
pDst1.numRows = 3;
pDst1.pData = pDataDst1;
printf("****定点数Q31******************************************rn");
status = arm_mat_trans_q31(&pSrcA1, &pDst1);
for(i = 0; i < 9; i++)
{
printf("pDataDst1[%d] = %drn", i, pDataDst1);
}
/****定点数Q15***********************************************************************/
pSrcA2.numCols = 3;
pSrcA2.numRows = 3;
pSrcA2.pData = pDataA2;
pDst2.numCols = 3;
pDst2.numRows = 3;
pDst2.pData = pDataDst2;
printf("****定点数Q15******************************************rn");
status = arm_mat_trans_q15(&pSrcA2, &pDst2);
for(i = 0; i < 9; i++)
{
printf("pDataDst2[%d] = %drn", i, pDataDst2);
}
}
1. 下面通过matlab实现矩阵的转置:


20.4 总结
    本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的具体实现。
页: [1]
查看完整版本: 【安富莱DSP教程】第20章 MatrixFunctions的使用(二)