硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3917|回复: 2
收起左侧

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

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-4-1 10:37:19 | 显示全部楼层 |阅读模式
特别说明:完整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)
参数定义:
    [in]       *pSrc   points to input matrix structure        
    [in]       scale   scale factor to be applied         
    [out]      *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)
参数定义:
    [in]      *pSrc      points to input matrix        
    [in]      scaleFract fractional portion of the scale factor        
    [in]      shift       number of bits to shift the result by        
    [out]    *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)
参数定义:
    [in,out] *S         points to an instance of the floating-point matrix structure.   
    [in]     nRows    number of rows in the matrix.   
    [in]     nColumns number of columns in the matrix.   
    [in]     *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光盘里面有此软件)查看打印信息现象如下:

程序设计:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatScale
  4. *    功能说明: 矩阵放缩
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatScale(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. float32_t scale = 1.1f;
  15. float32_t pDataDst[9];
  16. arm_matrix_instance_f32 pSrcA; //3行3列数据
  17. arm_matrix_instance_f32 pDst;
  18. /****定点数Q31数组******************************************************************/
  19. q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  20. q31_t scaleFract = 10;
  21.      int32_t shift = 0;
  22. q31_t pDataDst1[9];
  23. arm_matrix_instance_q31 pSrcA1; //3行3列数据
  24. arm_matrix_instance_q31 pDst1;
  25. /****定点数Q15数组******************************************************************/
  26. q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  27. q15_t scaleFract1 = 10;
  28.      int32_t shift1 = 0;
  29. q15_t pDataDst2[9];
  30. arm_matrix_instance_q15 pSrcA2; //3行3列数据
  31. arm_matrix_instance_q15 pDst2;
  32. /****浮点数***********************************************************************/
  33. pSrcA.numCols = 3;
  34. pSrcA.numRows = 3;
  35. pSrcA.pData = pDataA;
  36. pDst.numCols = 3;
  37. pDst.numRows = 3;
  38. pDst.pData = pDataDst;
  39. printf("****浮点数******************************************\r\n");
  40. arm_mat_scale_f32(&pSrcA, scale, &pDst);
  41. for(i = 0; i < 9; i++)
  42. {
  43. printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
  44. }
  45. /****定点数Q31***********************************************************************/
  46. pSrcA1.numCols = 3;
  47. pSrcA1.numRows = 3;
  48. pSrcA1.pData = pDataA1;
  49. pDst1.numCols = 3;
  50. pDst1.numRows = 3;
  51. pDst1.pData = pDataDst1;
  52. printf("****定点数Q31******************************************\r\n");
  53. arm_mat_scale_q31(&pSrcA1, scaleFract, shift, &pDst1);
  54. for(i = 0; i < 9; i++)
  55. {
  56. printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
  57. }
  58. /****定点数Q15***********************************************************************/
  59. pSrcA2.numCols = 3;
  60. pSrcA2.numRows = 3;
  61. pSrcA2.pData = pDataA2;
  62. pDst2.numCols = 3;
  63. pDst2.numRows = 3;
  64. pDst2.pData = pDataDst2;
  65. printf("****定点数Q15******************************************\r\n");
  66. arm_mat_scale_q15(&pSrcA2, scaleFract1, shift1, &pDst2);
  67. for(i = 0; i < 9; i++)
  68. {
  69. printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
  70. }
  71. }
复制代码
1. 下面通过matlab来实现矩阵的放缩:

20.1.png
20.2.png
20.3.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-4-1 10:42:37 | 显示全部楼层
20.2 矩阵乘法 MatMult

20.2.1 arm_mat_mult_f32

公式描述:
20.4.png
函数定义如下:
    arm_status arm_mat_mult_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 matrix structure   
    [in]       *pSrcB points to the second input matrix structure   
    [out]      *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)
参数定义:
    [in]    *pSrcA points to the first input matrix structure   
    [in]    *pSrcB points to the second input matrix structure   
    [out]  *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)
参数定义:
    [in]     *pSrcA   points to the first input matrix structure   
    [in]     *pSrcB   points to the second input matrix structure   
    [out]   *pDst    points to output matrix structure   
    [in]        *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)
参数定义:
    [in]    *pSrcA points to the first input matrix structure   
    [in]    *pSrcB points to the second input matrix structure   
    [out]  *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)
参数定义:
    [in]     *pSrcA   points to the first input matrix structure   
    [in]     *pSrcB   points to the second input matrix structure   
    [out]   *pDst    points to output matrix structure   
    [in]        *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光盘里面有此软件)查看打印信息现象如下:
20.5.png

程序设计:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatMult
  4. *    功能说明: 矩阵乘法
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatMult(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. float32_t pDataB[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};
  15. float32_t pDataDst[9];
  16. arm_matrix_instance_f32 pSrcA; //3行3列数据
  17. arm_matrix_instance_f32 pSrcB; //3行3列数据
  18. arm_matrix_instance_f32 pDst;
  19. /****定点数Q31数组******************************************************************/
  20. q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  21. q31_t pDataB1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  22. q31_t pDataDst1[9];
  23. arm_matrix_instance_q31 pSrcA1; //3行3列数据
  24. arm_matrix_instance_q31 pSrcB1; //3行3列数据
  25. arm_matrix_instance_q31 pDst1;
  26. /****定点数Q15数组******************************************************************/
  27. q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  28. q15_t pDataB2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  29. q15_t pDataDst2[9];
  30. arm_matrix_instance_q15 pSrcA2; //3行3列数据
  31. arm_matrix_instance_q15 pSrcB2; //3行3列数据
  32. arm_matrix_instance_q15 pDst2;
  33. q15_t pState;
  34. /****浮点数***********************************************************************/
  35. pSrcA.numCols = 3;
  36. pSrcA.numRows = 3;
  37. pSrcA.pData = pDataA;
  38. pSrcB.numCols = 3;
  39. pSrcB.numRows = 3;
  40. pSrcB.pData = pDataB;
  41. pDst.numCols = 3;
  42. pDst.numRows = 3;
  43. pDst.pData = pDataDst;
  44. printf("****浮点数******************************************rn");
  45. arm_mat_mult_f32(&pSrcA, &pSrcB, &pDst);
  46. for(i = 0; i < 9; i++)
  47. {
  48. printf("pDataDst[%d] = %frn", i, pDataDst[i]);
  49. }
  50. /****定点数Q31***********************************************************************/
  51. pSrcA1.numCols = 3;
  52. pSrcA1.numRows = 3;
  53. pSrcA1.pData = pDataA1;
  54. pSrcB1.numCols = 3;
  55. pSrcB1.numRows = 3;
  56. pSrcB1.pData = pDataB1;
  57. pDst1.numCols = 3;
  58. pDst1.numRows = 3;
  59. pDst1.pData = pDataDst1;
  60. printf("****定点数Q31******************************************rn");
  61. arm_mat_mult_q31(&pSrcA1, &pSrcB1, &pDst1);
  62. arm_mat_mult_fast_q31(&pSrcA1, &pSrcB1, &pDst1);
  63. for(i = 0; i < 9; i++)
  64. {
  65. printf("pDataDst1[%d] = %drn", i, pDataDst1[i]);
  66. }
  67. /****定点数Q15***********************************************************************/
  68. pSrcA2.numCols = 3;
  69. pSrcA2.numRows = 3;
  70. pSrcA2.pData = pDataA2;
  71. pSrcB2.numCols = 3;
  72. pSrcB2.numRows = 3;
  73. pSrcB2.pData = pDataB2;
  74. pDst2.numCols = 3;
  75. pDst2.numRows = 3;
  76. pDst2.pData = pDataDst2;
  77. printf("****定点数Q15******************************************rn");
  78. arm_mat_mult_q15(&pSrcA2, &pSrcB2, &pDst2, &pState);
  79. arm_mat_mult_fast_q15(&pSrcA2, &pSrcB2, &pDst2, &pState);
  80. for(i = 0; i < 9; i++)
  81. {
  82. printf("pDataDst2[%d] = %drn", i, pDataDst2[i]);
  83. }
  84. }
复制代码
1. 下面通过matlab实现矩阵的乘法:
20.6.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-4-1 10:56:43 | 显示全部楼层
20.3 转置矩阵 MatTrans

20.3.1 arm_mat_trans_f32

公式描述:
20.7.png
函数定义如下:
    arm_status arm_mat_trans_f32(
        const arm_matrix_instance_f32 * pSrc,
        arm_matrix_instance_f32 * pDst)
参数定义:
    [in]   *pSrc points to the input matrix   
    [out] *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)
参数定义:
    [in]  *pSrc points to the input matrix   
     [out] *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)
参数定义:
    [in]  *pSrc points to the input matrix   
     [out] *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光盘里面有此软件)查看打印信息现象如下:
20.8.png

程序设计:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_MatTrans
  4. *    功能说明: 求逆矩阵
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_MatTrans(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. float32_t pDataDst[9];
  15. arm_matrix_instance_f32 pSrcA; //3行3列数据
  16. arm_matrix_instance_f32 pDst;
  17. /****定点数Q31数组******************************************************************/
  18. q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  19. q31_t pDataDst1[9];
  20. arm_matrix_instance_q31 pSrcA1; //3行3列数据
  21. arm_matrix_instance_q31 pDst1;
  22. /****定点数Q15数组******************************************************************/
  23. q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
  24. q15_t pDataDst2[9];
  25. arm_matrix_instance_q15 pSrcA2; //3行3列数据
  26. arm_matrix_instance_q15 pDst2;
  27. /****浮点数***********************************************************************/
  28. pSrcA.numCols = 3;
  29. pSrcA.numRows = 3;
  30. pSrcA.pData = pDataA;
  31. pDst.numCols = 3;
  32. pDst.numRows = 3;
  33. pDst.pData = pDataDst;
  34. printf("****浮点数******************************************rn");
  35. status = arm_mat_trans_f32(&pSrcA, &pDst);
  36. for(i = 0; i < 9; i++)
  37. {
  38. printf("pDataDst[%d] = %frn", i, pDataDst[i]);
  39. }
  40. /****定点数Q31***********************************************************************/
  41. pSrcA1.numCols = 3;
  42. pSrcA1.numRows = 3;
  43. pSrcA1.pData = pDataA1;
  44. pDst1.numCols = 3;
  45. pDst1.numRows = 3;
  46. pDst1.pData = pDataDst1;
  47. printf("****定点数Q31******************************************rn");
  48. status = arm_mat_trans_q31(&pSrcA1, &pDst1);
  49. for(i = 0; i < 9; i++)
  50. {
  51. printf("pDataDst1[%d] = %drn", i, pDataDst1[i]);
  52. }
  53. /****定点数Q15***********************************************************************/
  54. pSrcA2.numCols = 3;
  55. pSrcA2.numRows = 3;
  56. pSrcA2.pData = pDataA2;
  57. pDst2.numCols = 3;
  58. pDst2.numRows = 3;
  59. pDst2.pData = pDataDst2;
  60. printf("****定点数Q15******************************************rn");
  61. status = arm_mat_trans_q15(&pSrcA2, &pDst2);
  62. for(i = 0; i < 9; i++)
  63. {
  64. printf("pDataDst2[%d] = %drn", i, pDataDst2[i]);
  65. }
  66. }
复制代码
1. 下面通过matlab实现矩阵的转置:
20.9.png

20.4 总结
    本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的具体实现。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 03:39 , Processed in 0.184386 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表