STM32/STM8技术论坛
直播中

硬汉Eric2013

9年用户 1035经验值
擅长:嵌入式技术
私信 关注
[经验]

【安富莱——DSP教程】第19章 MatrixFunctions的使用(一)

第19章  MatrixFunctions的使用(一)
    本期教程主要讲解矩阵运算中的初始化,加法,逆矩阵和减法。
    19.1 矩阵初始化MatInit
    19.2 矩阵加法MatAdd
    19.3 逆矩阵MatInverse
    19.4 矩阵减法MatSub
    19.5 总结
19.1  矩阵初始化MatInit
19.1.1  arm_mat_init_f32
函数定义如下:
void arm_mat_init_f32(
  arm_matrix_instance_f32 * S,
  uint16_t nRows,
  uint16_t nColumns,
  float32_t * pData)
参数定义:
[in,out] *S         pointsto an instance of the floating-point matrix structure.   
[in]     nRows   number of rows in the matrix.   
[in]     nColumns number of columns in thematrix.   
[in]     *pData     points to the matrix data array.  
注意事项:
1.    arm_matrix_instance_f32的结构体定义如下(在文件arm_math.h文件里面):
typedefstruct
      {
        uint16_t numRows;     // number of rows of the matrix.
        uint16_t numCols;      //number of columns of the matrix.
        float32_t *pData;       // points to the data of the matrix.
      } arm_matrix_instance_f32;

19.1.2  arm_mat_init_q31
函数定义如下:
void arm_mat_init_q31(
  arm_matrix_instance_q31 * S,
  uint16_t nRows,
  uint16_t nColumns,
  q31_t * pData)
参数定义:
[in,out] *S         pointsto an instance of the floating-point matrix structure.   
[in]     nRows   number of rows in the matrix.   
[in]     nColumns number of columns in thematrix.   
[in]     *pData     points to the matrix data array.  
注意事项:
1.    arm_matrix_instance_q31的结构体定义如下(在文件arm_math.h文件里面):
typedefstruct
      {
        uint16_t numRows;     // number of rows of the matrix.
        uint16_t numCols;      //number of columns of the matrix.
        q31_t  *pData;       //points to the data of the matrix.
      } arm_matrix_instance_q31;

19.1.3  arm_mat_init_q15
函数定义如下:
void arm_mat_init_q15(
  arm_matrix_instance_q15 * S,
  uint16_t nRows,
  uint16_t nColumns,
  q15_t * pData)
参数定义:
[in,out] *S         pointsto an instance of the floating-point matrix structure.   
[in]     nRows   number of rows in the matrix.   
[in]     nColumns number of columns in thematrix.   
[in]     *pData     points to the matrix data array.  
注意事项:
1.    arm_matrix_instance_q15的结构体定义如下(在文件arm_math.h文件里面):
typedefstruct
      {
        uint16_t numRows;     // number of rows of the matrix.
        uint16_t numCols;      //number of columns of the matrix.
        q15_t  *pData;       //points to the data of the matrix.
      } arm_matrix_instance_q15;

19.1.4  实例讲解
实验目的:
    1. 学习MatrixFunctions中矩阵的初始化
实验内容:
           1. 按下按键K1, 串口打印函数DSP_MatInit的输出结果
实验现象:
           通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
19.1.jpg
                              
程序设计:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatInit
  4. *    功能说明: 矩阵数据初始化
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatInit(void)
  10. {
  11.      uint8_t i;

  12.      /****浮点数数组******************************************************************/
  13.      float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  14.    
  15.      arm_matrix_instance_f32 pSrcA; //3行3列数据
  16.      arm_matrix_instance_f32 pDst;
  17.    
  18.      /****定点数Q31数组******************************************************************/
  19.      q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  20.    
  21.      arm_matrix_instance_q31 pSrcA1; //3行3列数据
  22.      arm_matrix_instance_q31 pDst1;
  23.    
  24.      /****定点数Q15数组******************************************************************/
  25.      q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  26.    
  27.      arm_matrix_instance_q15 pSrcA2; //3行3列数据
  28.      arm_matrix_instance_q15 pDst2;
  29.    
  30.      /****浮点数***********************************************************************/
  31.      printf("****浮点数******************************************rn");
  32.      arm_mat_init_f32(&pSrcA, 3,3, pDataA);
  33.      for(i = 0; i < 9; i++)
  34.      {
  35.          printf("pDataA[%d] = %frn", i, pDataA[i]);
  36.      }
  37.    
  38.      /****定点数Q31***********************************************************************/
  39.      printf("****浮点数******************************************rn");
  40.      arm_mat_init_q31(&pSrcA1, 3,3, pDataA1);
  41.      for(i = 0; i < 9; i++)
  42.      {
  43.          printf("pDataA1[%d] = %drn", i, pDataA1[i]);
  44.      }
  45.    
  46.      /****定点数Q15***********************************************************************/
  47.      printf("****浮点数******************************************rn");
  48.      arm_mat_init_q15(&pSrcA2, 3,3, pDataA2);
  49.      for(i = 0; i < 9; i++)
  50.      {
  51.          printf("pDataA2[%d] = %drn", i, pDataA2[i]);
  52.      }
  53.    
  54. }

回帖(4)

硬汉Eric2013

2015-6-19 11:00:52
19.2   矩阵加法 MatAdd
19.2.1  arm_mat_add_f32
公式描述(以3*3矩阵为例进行说明):
19.2.png
                              
函数定义如下:
arm_statusarm_mat_add_f32(
  const arm_matrix_instance_f32 * pSrcA,
  const arm_matrix_instance_f32 * pSrcB,
  arm_matrix_instance_f32 * pDst)
参数定义:
[in]    *pSrcA   points to the first input matrixstructure        
[in]    *pSrcB  points to the second input matrixstructure        
[out]   *pDst   points to output matrix structure        
return              Thefunction returns either     
注意事项:
1.    pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2.    矩阵在数组中的存储是从左到右,再从上到下。

19.2.2  arm_mat_add_q31
函数定义如下:
arm_statusarm_mat_add_q31(
  const arm_matrix_instance_q31 * pSrcA,
  const arm_matrix_instance_q31 * pSrcB,
  arm_matrix_instance_q31 * pDst)
参数定义:
[in]    *pSrcA   points to the first input matrixstructure        
[in]    *pSrcB  points to the second input matrixstructure        
[out]   *pDst   points to output matrix structure        
return              Thefunction returns either     
注意事项:
1.    pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2.    矩阵在数组中的存储是从左到右,再从上到下。

19.2.3  arm_mat_add_q15
函数定义如下:
arm_statusarm_mat_add_q15(
  const arm_matrix_instance_q15 * pSrcA,
  const arm_matrix_instance_q15 * pSrcB,
  arm_matrix_instance_q15 * pDst)
参数定义:
[in]    *pSrcA   points to the first input matrixstructure        
[in]    *pSrcB  points to the second input matrixstructure        
[out]   *pDst   points to output matrix structure        
return              Thefunction returns either     
注意事项:
1.    pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2.    矩阵在数组中的存储是从左到右,再从上到下。

19.2.4  实例讲解
实验目的:
    1. 学习MatrixFunctions中矩阵的加法
实验内容:
       1. 按下按键K2, 串口打印函数DSP_MatAdd的输出结果
实验现象:
       通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
19.3.jpg
程序设计:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatAdd
  4. *    功能说明: 矩阵求和
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatAdd(void)
  10. {
  11.      uint8_t i;
  12.    
  13.      /****浮点数数组******************************************************************/
  14.      float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  15.      float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  16.      float32_t pDataDst[9];
  17.    
  18.      arm_matrix_instance_f32 pSrcA; //3行3列数据
  19.      arm_matrix_instance_f32 pSrcB; //3行3列数据
  20.      arm_matrix_instance_f32 pDst;
  21.    
  22.      /****定点数Q31数组******************************************************************/
  23.      q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  24.      q31_t pDataB1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  25.      q31_t pDataDst1[9];
  26.    
  27.      arm_matrix_instance_q31 pSrcA1; //3行3列数据
  28.      arm_matrix_instance_q31 pSrcB1; //3行3列数据
  29.      arm_matrix_instance_q31 pDst1;
  30.    
  31.      /****定点数Q15数组******************************************************************/
  32.      q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  33.      q15_t pDataB2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  34.      q15_t pDataDst2[9];
  35.    
  36.      arm_matrix_instance_q15 pSrcA2; //3行3列数据
  37.      arm_matrix_instance_q15 pSrcB2; //3行3列数据
  38.      arm_matrix_instance_q15 pDst2;
  39.    
  40.      /****浮点数***********************************************************************/
  41.      pSrcA.numCols = 3;
  42.      pSrcA.numRows = 3;
  43.      pSrcA.pData = pDataA;
  44.    
  45.      pSrcB.numCols = 3;
  46.      pSrcB.numRows = 3;
  47.      pSrcB.pData = pDataB;
  48.    
  49.      pDst.numCols = 3;
  50.      pDst.numRows = 3;
  51.      pDst.pData = pDataDst;
  52.    
  53.      printf("****浮点数******************************************rn");
  54.      arm_mat_add_f32(&pSrcA, &pSrcB, &pDst);
  55.      for(i = 0; i < 9; i++)
  56.      {
  57.          printf("pDataDst[%d] = %frn", i, pDataDst[i]);
  58.      }
  59.    
  60.    
  61.      /****定点数Q31***********************************************************************/
  62.      pSrcA1.numCols = 3;
  63.      pSrcA1.numRows = 3;
  64.      pSrcA1.pData = pDataA1;
  65.    
  66.      pSrcB1.numCols = 3;
  67.      pSrcB1.numRows = 3;
  68.      pSrcB1.pData = pDataB1;
  69.    
  70.      pDst1.numCols = 3;
  71.      pDst1.numRows = 3;
  72.      pDst1.pData = pDataDst1;
  73.    
  74.      printf("****定点数Q31******************************************rn");
  75.      arm_mat_add_q31(&pSrcA1, &pSrcB1, &pDst1);
  76.      for(i = 0; i < 9; i++)
  77.      {
  78.          printf("pDataDst1[%d] = %drn", i, pDataDst1[i]);
  79.      }
  80.    
  81.    
  82.      /****定点数Q15***********************************************************************/
  83.      pSrcA2.numCols = 3;
  84.      pSrcA2.numRows = 3;
  85.      pSrcA2.pData = pDataA2;
  86.    
  87.      pSrcB2.numCols = 3;
  88.      pSrcB2.numRows = 3;
  89.      pSrcB2.pData = pDataB2;
  90.    
  91.      pDst2.numCols = 3;
  92.      pDst2.numRows = 3;
  93.      pDst2.pData = pDataDst2;
  94.    
  95.      printf("****定点数Q15******************************************rn");
  96.      arm_mat_add_q15(&pSrcA2, &pSrcB2, &pDst2);
  97.      for(i = 0; i < 9; i++)
  98.      {
  99.          printf("pDataDst2[%d] = %drn", i, pDataDst2[i]);
  100.      }
  101.    
  102. }
1.    矩阵的加法从C语言的实现上来看,比较的容易,下面通过Matlab来求解矩阵和(在命令窗口输入)。
19.4.png

举报

硬汉Eric2013

2015-6-19 14:53:23
19.4  矩阵减法 MatSub
19.4.1  arm_mat_sub_f32
公式描述(以3*3矩阵为例进行说明):
19.8.png

函数定义如下:
arm_status arm_mat_sub_f32(
  const arm_matrix_instance_f32 * pSrcA,
  const arm_matrix_instance_f32 * pSrcB,
  arm_matrix_instance_f32 * pDst)
参数定义:
[in]    *pSrcA   points to the first input matrixstructure        
[in]    *pSrcB  points to the second input matrixstructure        
[out]   *pDst   points to output matrix structure        
return              Thefunction returns either     
注意事项:
1.    pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2.    矩阵在数组中的存储是从左到右,再从上到下。
19.4.2  arm_mat_add_q31
函数定义如下:
arm_statusarm_mat_add_q31(
  const arm_matrix_instance_q31 * pSrcA,
  const arm_matrix_instance_q31 * pSrcB,
  arm_matrix_instance_q31 * pDst)
参数定义:
[in]    *pSrcA   points to the first input matrixstructure        
[in]    *pSrcB  points to the second input matrixstructure        
[out]   *pDst   points to output matrix structure        
return              Thefunction returns either     
注意事项:
1.    pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2.    矩阵在数组中的存储是从左到右,再从上到下。
19.4.3  arm_mat_add_q15
函数定义如下:
arm_statusarm_mat_add_q15(
  const arm_matrix_instance_q15 * pSrcA,
  const arm_matrix_instance_q15 * pSrcB,
  arm_matrix_instance_q15 * pDst)
参数定义:
[in]    *pSrcA   points to the first input matrixstructure        
[in]    *pSrcB  points to the second input matrixstructure        
[out]   *pDst   points to output matrix structure        
return              Thefunction returns either     
注意事项:
1.    pSrcA,pSrcB,pDst的行数和列数必须是相同的,要不没有办法使用加法运行。
2.    矩阵在数组中的存储是从左到右,再从上到下。
19.4.4  实例讲解
实验目的:
1. 学习MatrixFunctions中矩阵的加法
实验内容:
       1. 按下按键K2, 串口打印函数DSP_MatAdd的输出结果
实验现象:
       通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
19.9.jpg

程序设计:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatSub
  4. *    功能说明: 矩阵减法
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatSub(void)
  10. {
  11.      uint8_t i;
  12.    
  13.      /****浮点数数组******************************************************************/
  14.      float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  15.      float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  16.      float32_t pDataDst[9];
  17.    
  18.      arm_matrix_instance_f32 pSrcA; //3行3列数据
  19.      arm_matrix_instance_f32 pSrcB; //3行3列数据
  20.      arm_matrix_instance_f32 pDst;
  21.    
  22.      /****定点数Q31数组******************************************************************/
  23.      q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  24.      q31_t pDataB1[9] = {2, 2, 2, 2, 2, 2, 2, 2, 2};
  25.      q31_t pDataDst1[9];
  26.    
  27.      arm_matrix_instance_q31 pSrcA1; //3行3列数据
  28.      arm_matrix_instance_q31 pSrcB1; //3行3列数据
  29.      arm_matrix_instance_q31 pDst1;
  30.    
  31.      /****定点数Q15数组******************************************************************/
  32.      q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  33.      q15_t pDataB2[9] = {2, 2, 2, 2, 23, 2, 2, 2, 2};
  34.      q15_t pDataDst2[9];
  35.    
  36.      arm_matrix_instance_q15 pSrcA2; //3行3列数据
  37.      arm_matrix_instance_q15 pSrcB2; //3行3列数据
  38.      arm_matrix_instance_q15 pDst2;
  39.    
  40.      /****浮点数***********************************************************************/
  41.      pSrcA.numCols = 3;
  42.      pSrcA.numRows = 3;
  43.      pSrcA.pData = pDataA;
  44.    
  45.      pSrcB.numCols = 3;
  46.      pSrcB.numRows = 3;
  47.      pSrcB.pData = pDataB;
  48.    
  49.      pDst.numCols = 3;
  50.      pDst.numRows = 3;
  51.      pDst.pData = pDataDst;
  52.    
  53.      printf("****浮点数******************************************rn");
  54.      arm_mat_sub_f32(&pSrcA, &pSrcB, &pDst);
  55.      for(i = 0; i < 9; i++)
  56.      {
  57.          printf("pDataDst[%d] = %frn", i, pDataDst[i]);
  58.      }
  59.    
  60.    
  61.      /****定点数Q31***********************************************************************/
  62.      pSrcA1.numCols = 3;
  63.      pSrcA1.numRows = 3;
  64.      pSrcA1.pData = pDataA1;
  65.    
  66.      pSrcB1.numCols = 3;
  67.      pSrcB1.numRows = 3;
  68.      pSrcB1.pData = pDataB1;
  69.    
  70.      pDst1.numCols = 3;
  71.      pDst1.numRows = 3;
  72.      pDst1.pData = pDataDst1;
  73.    
  74.      printf("****定点数Q31******************************************rn");
  75.      arm_mat_sub_q31(&pSrcA1, &pSrcB1, &pDst1);
  76.      for(i = 0; i < 9; i++)
  77.      {
  78.          printf("pDataDst1[%d] = %drn", i, pDataDst1[i]);
  79.      }
  80.    
  81.    
  82.      /****定点数Q15***********************************************************************/
  83.      pSrcA2.numCols = 3;
  84.      pSrcA2.numRows = 3;
  85.      pSrcA2.pData = pDataA2;
  86.    
  87.      pSrcB2.numCols = 3;
  88.      pSrcB2.numRows = 3;
  89.      pSrcB2.pData = pDataB2;
  90.    
  91.      pDst2.numCols = 3;
  92.      pDst2.numRows = 3;
  93.      pDst2.pData = pDataDst2;
  94.    
  95.      printf("****定点数Q15******************************************rn");
  96.      arm_mat_sub_q15(&pSrcA2, &pSrcB2, &pDst2);
  97.      for(i = 0; i < 9; i++)
  98.      {
  99.          printf("pDataDst2[%d] = %drn", i, pDataDst2[i]);
  100.      }
  101.    
  102. }
1.    矩阵的减法从C语言的实现上来看,比较的容易,下面通过Matlab来求解矩阵和(在命令窗口输入)。
19.10.png


举报

硬汉Eric2013

2015-6-19 14:54:26
19.5        总结
本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的具体实现。
举报

王五

2016-7-28 15:25:19
举报

更多回帖

发帖
×
20
完善资料,
赚取积分