微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第11章 StatisticsMathFunctions的使用(一)

第11章 StatisticsMathFunctions的使用(一)

时间:10-02 整理:3721RD 点击:
第11章  StatisticsMathFunctions的使用(一)

    本期教程主要讲解统计函数中的最大值,最小值,平均值和功率的计算。

    11.1 最大值Maximum

    11.2 最小值Minimum

    11.3 平均值Mean

    11.4 功率Power

    11.5 总结


11.1  最大值Maximum

    这部分函数用于计算数组中的最大值,并返回数组中的最大值和最大值在数组中的位置。


11.1.1  arm_max_f32

    此函数的使用比较简单,函数定义如下:

      void arm_max_f32(float32_t * pSrc, uint32_t blockSize, float32_t* pResult, uint32_t * pIndex)

    参数定义:

            [in] *pSrc      points to the inputvector   

            [in] blockSize  length of the inputvector   

            [out] *pResult   maximum value returned here   

            [out] *pIndex    index of maximum value returned here   


11.1.2  arm_max_q31

函数定义如下:

      voidarm_max_q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult, uint32_t *pIndex)

参数定义:

            [in] *pSrc      points to the inputvector   

            [in] blockSize  length of the inputvector   

            [out] *pResult   maximum value returned here   

            [out] *pIndex    index of maximum value returned here   


11.1.3  arm_max_q15

函数定义如下:

      voidarm_max_q15(q15_t * pSrc, uint32_t blockSize, q15_t * pResult, uint32_t *pIndex)

参数定义:

             [in] *pSrc      points to the inputvector   

            [in] blockSize  length of the inputvector   

            [out] *pResult   maximum value returned here   

            [out] *pIndex    index of maximum value returned here   


11.1.4  arm_max_q7

函数定义如下:

      voidarm_max_q7(q7_t * pSrc, uint32_t blockSize, q7_t * pResult, uint32_t * pIndex)

参数定义:

            [in] *pSrc      points to the inputvector   

            [in] blockSize  length of the inputvector   

            [out] *pResult   maximum value returned here   

             [out] *pIndex    index of maximum value returned here   


11.1.5  实例讲解

实验目的:

    1. 学习FastMathFunctions中最大值的求解

实验内容:

           1. 按下按键K1, 串口打印函数DSP_Max的输出结果

实验现象:

           通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_Max
  4. *    功能说明: 求最大值
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_Max(void)
  10. {                                                                                             
  11.      float32_t pSrc[10] = {0.6948, 0.3171, 0.9502, 0.0344, 0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898};
  12.                                                                                                        (1)
  13.      float32_t pResult;
  14.      uint32_t pIndex;
  15.    
  16.      q31_t pSrc1[10];
  17.      q31_t pResult1;
  18.    
  19.      q15_t pSrc2[10];
  20.      q15_t pResult2;
  21.    
  22.      q7_t pSrc3[10];
  23.      q7_t pResult3;
  24.    
  25.      arm_max_f32(pSrc, 10, &pResult, &pIndex);
  26.      printf("arm_max_f32 : pResult = %f  pIndex = %d\r\n", pResult, pIndex);
  27.    
  28.      /*****************************************************************/
  29.      for(pIndex = 0; pIndex < 10; pIndex++)
  30.      {
  31.           pSrc1[pIndex] = rand();                                                                   (2)
  32.      }
  33.      arm_max_q31(pSrc1, 10, &pResult1, &pIndex);
  34.      printf("arm_max_q31 : pResult = %d  pIndex = %d\r\n", pResult1, pIndex);
  35.    
  36.      /*****************************************************************/
  37.      for(pIndex = 0; pIndex < 10; pIndex++)
  38.      {
  39.           pSrc2[pIndex] = rand()%32768;                                                             (3)
  40.      }
  41.      arm_max_q15(pSrc2, 10, &pResult2, &pIndex);
  42.      printf("arm_max_q15 : pResult = %d  pIndex = %d\r\n", pResult2, pIndex);
  43.    
  44.      /*****************************************************************/
  45.      for(pIndex = 0; pIndex < 10; pIndex++)
  46.      {
  47.           pSrc3[pIndex] = rand()%128;                                                               (4)
  48.      }
  49.      arm_max_q7(pSrc3, 10, &pResult3, &pIndex);
  50.      printf("arm_max_q7 : pResult = %d  pIndex = %d\r\n", pResult3, pIndex);
  51.      printf("******************************************************************\r\n");
  52. }

复制代码

1.    这里10个浮点随机数是通过matlab生成的,生成方法很简单,在命令窗口输入命令:

    rand(1, 10)  %1行10列

    获取结果如下:




    如果想获取整形随机数,可以使用函数:

    randi(32768,  1,10)  %生成的随机数不超过32768, 1行10列。




2.    使用stdlib.h中的rand生成伪随机数。

3.    通过对32768求余获得可以用于函数arm_max_q15的数据。

4.    通过对128求余获得可以用于函数arm_max_q7的数据。


11.2  最小值Minimum

    这部分函数用于计算数组中的最小值,并返回数组中的最小值和最小值在数组中的位置。


11.2.1  arm_min_f32

此函数的使用比较简单,函数定义如下:

    void arm_min _f32(float32_t * pSrc, uint32_t blockSize, float32_t *pResult, uint32_t * pIndex)

参数定义:

          [in] *pSrc      points to the inputvector   

          [in] blockSize  length of the inputvector   

          [out] *pResult   maximum value returned here   

           [out] *pIndex    index of maximum value returned here   


11.2.2  arm_ min _q31

函数定义如下:

    void arm_ min _q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult, uint32_t* pIndex)

参数定义:

          [in] *pSrc      points to the inputvector   

          [in] blockSize  length of the inputvector   

          [out] *pResult   maximum value returned here   

    [out] *pIndex   index of maximum value returned here


11.2.3  arm_ min _q15

函数定义如下:

    void arm_ min _q15(q15_t * pSrc, uint32_t blockSize, q15_t * pResult, uint32_t* pIndex)

参数定义:

          [in] *pSrc      points to the inputvector   

          [in] blockSize  length of the inputvector   

          [out] *pResult   maximum value returned here   

    [out] *pIndex   index of maximum value returned here


11.2.4  arm_ min _q7

函数定义如下:

    void arm_ min _q7(q7_t * pSrc, uint32_t blockSize, q7_t * pResult, uint32_t* pIndex)

参数定义:

          [in] *pSrc      points to the inputvector   

          [in] blockSize  length of the inputvector   

          [out] *pResult   maximum value returned here   

    [out] *pIndex   index of maximum value returned here


11.2.5  实例讲解

实验目的:

    1. 学习FastMathFunctions中最小值的求解

实验内容:

           1. 按下按键K2, 串口打印函数DSP_Min的输出结果

实验现象:

           通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_Min
  4. *    功能说明: 求最小值
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_Min(void)                                                                              (1)
  10. {
  11.      float32_t pSrc[10] = {0.6948, 0.3171, 0.9502, 0.0344, 0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898};
  12.      float32_t pResult;
  13.      uint32_t pIndex;
  14.    
  15.      q31_t pSrc1[10];
  16.      q31_t pResult1;
  17.    
  18.      q15_t pSrc2[10];
  19.      q15_t pResult2;
  20.    
  21.      q7_t pSrc3[10];
  22.      q7_t pResult3;
  23.    
  24.      arm_min_f32(pSrc, 10, &pResult, &pIndex);
  25.      printf("arm_min_f32 : pResult = %f  pIndex = %d\r\n", pResult, pIndex);
  26.    
  27.      /*****************************************************************/
  28.      for(pIndex = 0; pIndex < 10; pIndex++)
  29.      {
  30.           pSrc1[pIndex] = rand();
  31.      }
  32.      arm_min_q31(pSrc1, 10, &pResult1, &pIndex);
  33.      printf("arm_min_q31 : pResult = %d  pIndex = %d\r\n", pResult1, pIndex);
  34.    
  35.      /*****************************************************************/
  36.      for(pIndex = 0; pIndex < 10; pIndex++)
  37.      {
  38.           pSrc2[pIndex] = rand()%32768;
  39.      }
  40.      arm_min_q15(pSrc2, 10, &pResult2, &pIndex);
  41.      printf("arm_min_q15 : pResult = %d  pIndex = %d\r\n", pResult2, pIndex);
  42.    
  43.      /*****************************************************************/
  44.      for(pIndex = 0; pIndex < 10; pIndex++)
  45.      {
  46.           pSrc3[pIndex] = rand()%128;
  47.      }
  48.      arm_min_q7(pSrc3, 10, &pResult3, &pIndex);
  49.      printf("arm_min_q7 : pResult = %d  pIndex = %d\r\n", pResult3, pIndex);
  50.      printf("******************************************************************\r\n");
  51. }

复制代码

1.    这里求最小值跟上面求最大值基本是一样的。


11.3  平均值Mean

这部分函数用于计算数组的平均值。公式描述如下:

    Result =(pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]) / blockSize;   


11.3.1  arm_mean_f32

此函数的使用比较简单,函数定义如下:

    voidarm_mean_f32(float32_t * pSrc, uint32_t blockSize, float32_t * pResult)

参数定义:

    [in]*pSrc      points to the input vector

    [in] blockSize  length of the input vector

    [out]*pResult  mean value returned here


11.3.2  arm_ mean _q31

函数定义如下:

    voidarm_mean_q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult)

参数定义:

    [in]*pSrc      points to the input vector

    [in] blockSize  length of the input vector

    [out]*pResult  mean value returned here

注意事项:

    求平均前的数据之和是赋值给了64位累加器,然后再求平均。


11.3.3  arm_ mean _q15

函数定义如下:

    voidarm_mean_q15(q15_t * pSrc, uint32_t blockSize, q15_t * pResult)

参数定义:

    [in]*pSrc      points to the input vector

    [in] blockSize  length of the input vector

    [out]*pResult  mean value returned here

注意事项:

      求平均前的数据之和是赋值给了32位累加器,然后再求平均。


11.3.4  arm_ mean _q7

函数定义如下:

    voidarm_mean_q7(q7_t * pSrc, uint32_t blockSize, q7_t * pResult)

参数定义:

    [in]*pSrc      points to the input vector

    [in] blockSize  length of the input vector

    [out]*pResult  mean value returned here

注意事项:

     求平均前的数据之和是赋值给了32位累加器,然后再求平均。


11.3.5  实例讲解

实验目的:

    1. 学习FastMathFunctions中平均值的求解

实验内容:

           1. 按下按键K3, 串口打印函数DSP_Mean的输出结果

实验现象:

            通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_Mean
  4. *    功能说明: 求平均
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_Mean(void)
  10. {
  11.      float32_t pSrc[10] = {0.6948, 0.3171, 0.9502, 0.0344, 0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898};
  12.      float32_t pResult;
  13.      uint32_t pIndex;
  14.    
  15.      q31_t pSrc1[10];
  16.      q31_t pResult1;
  17.    
  18.      q15_t pSrc2[10];
  19.      q15_t pResult2;
  20.    
  21.      q7_t pSrc3[10];
  22.      q7_t pResult3;
  23.    
  24.      arm_mean_f32(pSrc, 10, &pResult);
  25.      printf("arm_mean_f32 : pResult = %f\r\n", pResult);
  26.    
  27.      /*****************************************************************/
  28.      for(pIndex = 0; pIndex < 10; pIndex++)
  29.      {
  30.           pSrc1[pIndex] = rand();
  31.      }
  32.      arm_mean_q31(pSrc1, 10, &pResult1);
  33.      printf("arm_mean_q31 : pResult = %d\r\n", pResult1);
  34.    
  35.      /*****************************************************************/
  36.      for(pIndex = 0; pIndex < 10; pIndex++)
  37.      {
  38.           pSrc2[pIndex] = rand()%32768;
  39.      }
  40.      arm_mean_q15(pSrc2, 10, &pResult2);
  41.      printf("arm_mean_q15 : pResult = %d\r\n", pResult2);
  42.    
  43.      /*****************************************************************/
  44.      for(pIndex = 0; pIndex < 10; pIndex++)
  45.      {
  46.           pSrc3[pIndex] = rand()%128;
  47.      }
  48.      arm_mean_q7(pSrc3, 10, &pResult3);
  49.      printf("arm_mean_q7 : pResult = %d\r\n", pResult3);
  50.      printf("******************************************************************\r\n");
  51. }

复制代码


11.4  功率Power

这部分函数用于计算数组的功率。公式描述如下:

    Result =pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + pSrc[2] * pSrc[2] + ... +pSrc[blockSize-1] * pSrc[blockSize-1];   


11.4.1  arm_power_f32

函数定义如下:

    void arm_power_f32(float32_t* pSrc, uint32_t blockSize, float32_t * pResult)

参数定义:

    [in]  *pSrc     points to the input vector   

    [in]  blockSize  length of the input vector   

    [out]*pResult  sum of the squares valuereturned here


11.4.2  arm_power_q31

函数定义如下:

    voidarm_power_q31(q31_t * pSrc, uint32_t blockSize, q63_t * pResult)

参数定义:

    [in]  *pSrc     points to the input vector   

     [in]  blockSize  length of the input vector   

     [out]*pResult  sum of the squares valuereturned here   

注意事项:

    输入参数是1.31格式,两个数据的乘积就是1.31*1.31 = 2.62格式,这里将此结果右移14位,也就是将低14位数据截取掉,最终的输出做64位饱和运算,结果是16.48格式。


11.4.3  arm_power_q15

函数定义如下:

    voidarm_power_q15(q15_t * pSrc, uint32_t blockSize, q63_t * pResult)

参数定义:

     [in]  *pSrc     points to the input vector   

     [in]  blockSize  length of the input vector   

     [out]*pResult  sum of the squares valuereturned here   

注意事项:

    输入参数是1.15格式,两个数据的乘积就是1.15*1.15 = 2.30格式,最终的输出做64位饱和运算,结果是34.30格式。


11.4.4  arm_power_q7

函数定义如下:

    voidarm_power_q7(q7_t * pSrc, uint32_t blockSize, q31_t * pResult)

参数定义:

    [in]  *pSrc     points to the input vector   

    [in]  blockSize  length of the input vector   

     [out]*pResult  sum of the squares valuereturned here   

注意事项:

     输入参数是1.7格式,两个数据的乘积就是1.7*1.7 = 2.14格式,最终的输出做32位饱和运算,结果是18.14格式。


11.4.5  实例讲解

实验目的:

    1. 学习FastMathFunctions中功率的求解

实验内容:

           1. 按下摇杆UP键, 串口打印函数DSP_Power的输出结果

实验现象:

            通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_Power
  4. *    功能说明: 求功率
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_Power(void)
  10. {
  11.      float32_t pSrc[10] = {0.6948, 0.3171, 0.9502, 0.0344, 0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898};
  12.      float32_t pResult;
  13.      uint32_t pIndex;
  14.    
  15.      q31_t pSrc1[10];
  16.      q63_t pResult1;
  17.    
  18.      q15_t pSrc2[10];
  19.      q63_t pResult2;
  20.    
  21.      q7_t pSrc3[10];
  22.      q31_t pResult3;
  23.    
  24.      arm_power_f32(pSrc, 10, &pResult);
  25.      printf("arm_power_f32 : pResult = %f\r\n", pResult);
  26.    
  27.      /*****************************************************************/
  28.      for(pIndex = 0; pIndex < 10; pIndex++)
  29.      {
  30.           pSrc1[pIndex] = rand();
  31.      }
  32.      arm_power_q31(pSrc1, 10, &pResult1);
  33.      printf("arm_power_q31 : pResult = %lld\r\n", pResult1);
  34.    
  35.      /*****************************************************************/
  36.      for(pIndex = 0; pIndex < 10; pIndex++)
  37.      {
  38.           pSrc2[pIndex] = rand()%32768;
  39.      }
  40.      arm_power_q15(pSrc2, 10, &pResult2);
  41.      printf("arm_power_q15 : pResult = %lld\r\n", pResult2);
  42.    
  43.      /*****************************************************************/
  44.      for(pIndex = 0; pIndex < 10; pIndex++)
  45.      {
  46.           pSrc3[pIndex] = rand()%128;
  47.      }
  48.      arm_power_q7(pSrc3, 10, &pResult3);
  49.      printf("arm_power_q7 : pResult = %d\r\n", pResult3);
  50.      printf("******************************************************************\r\n");
  51. }

复制代码


11.5  总结

    本期教程就跟大家讲这么多,有兴趣的可以深入研究这些函数源码的实现。


学习学习,谢谢分享!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top