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

第12章 StatisticsMathFunctions的使用(二)

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

    本期教程主要讲解统计函数中的标准偏差、均方根和方差的计算。

    12.1 标准偏差Standard deviation

    12.2 均方差RMS

    12.3 方差Variance

    12.4 总结


12.1  标准偏差Standard deviation

这部分函数用于计算标准偏差,公式描述如下:

    Result =sqrt((sumOfSquares - sum2 / blockSize) / (blockSize - 1))

其中:

    sumOfSquares= pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] *pSrc[blockSize-1]

    sum = pSrc[0]+ pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]


12.1.1  arm_std_f32

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

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

参数定义:

          [in] *pSrc     points to the inputvector   

          [in] blockSize length of the input vector   

          [out] *pResult  standard deviation value returned here   


12.1.2  arm_std_q31

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

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

参数定义:

          [in] *pSrc     points to the inputvector   

          [in] blockSize length of the input vector   

          [out] *pResult  standard deviation value returned here   

       注意事项:

           输入参数是1.31格式的,相乘后输出就是1.31*1.31 = 2.62格式,这种情况下,函数内部使用的64位累加器很容易溢出,并且这个函数不支持饱和运算,这个函数的使用还有一些问题,有待后面解决


12.1.3  arm_std_q15

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

    void arm_std_q15(q15_t * pSrc, uint32_t blockSize, q15_t* pResult)

参数定义:

          [in] *pSrc     points to the inputvector   

          [in] blockSize length of the input vector   

          [out] *pResult  standard deviation value returned here  

注意事项:

    输入参数是1.15格式,相乘后的的结果就是1.15*1.15 = 2.30格式,这种情况下,内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据,然后通过饱和运算最终输出数据格式1.15。


12.1.4  实例讲解

实验目的:

    1. 学习StatisticsMathFunctions中标准偏差的求解

实验内容:

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

实验现象:

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




程序设计:

  1. <font color="#000000">/*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_Std
  4. *    功能说明: 求标准偏差
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_Std(void)
  10. {
  11.      float32_t pSrc[10] = {0.6557,  0.0357,  0.8491,  0.9340, 0.6787,  0.7577,  0.7431,  0.3922,  0.6555,  0.1712};
  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.    
  22.      arm_std_f32(pSrc, 10, &pResult);                                                               (1)
  23.      printf("arm_std_f32 : pResult = %f\r\n", pResult);

  24.      /*****************************************************************/
  25.      for(pIndex = 0; pIndex < 10; pIndex++)
  26.      {
  27.           pSrc1[pIndex] = rand();
  28.      }
  29.      arm_std_q31(pSrc1, 10, &pResult1);                                                             (2)
  30.      printf("arm_std_q31 : pResult = %d\r\n", pResult1);
  31.    
  32.      /*****************************************************************/
  33.      for(pIndex = 0; pIndex < 10; pIndex++)
  34.      {
  35.           pSrc2[pIndex] = rand()%32768;
  36.      }
  37.      arm_std_q15(pSrc2, 10, &pResult2);                                                             (3)
  38.      printf("arm_std_q15 : pResult = %d\r\n", pResult2);
  39.    
  40.      printf("******************************************************************\r\n");
  41. }</font>

复制代码

1.     这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。

    在matlab的命令窗口输入如下命令:

      rand(1,10)  %1行10列

    然后再通过命令std获得标准偏差:

      std(ans)   




    matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。

2.     这个函数的使用还没有搞懂,有待后面解决。

3.     这个函数的使用还没有搞懂,有待后面解决。


12.2  均方根RMS

这部分函数用于计算标准偏差,公式描述如下:

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


12.2.1  arm_rms_f32

函数定义如下:

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

参数定义:

      [in] *pSrc      points to the input vector   

      [in]blockSize  length of the inputvector   

      [out] *pResult  rms value returned here   


12.2.2  arm_rms_q31

函数定义如下:

    void arm_rms_q31(q31_t * pSrc, uint32_t blockSize, q31_t* pResult)

参数定义:

      [in] *pSrc      points to the input vector   

      [in]blockSize  length of the inputvector   

      [out] *pResult  rms value returned here   

  注意事项:

          输入参数是1.31格式的,相乘后输出就是1.31*1.31 = 2.62格式,这种情况下,函数内部使用的64位累加器很容易溢出,并且这个函数不支持饱和运算


12.2.3  arm_rms_q15

函数定义如下:

    void arm_rms_q15(q15_t * pSrc, uint32_t blockSize, q15_t* pResult)

参数定义:

      [in] *pSrc      points to the input vector   

      [in]blockSize  length of the inputvector   

      [out] *pResult  rms value returned here   

注意事项:

    输入参数是1.15格式,相乘后的的结果就是1.15*1.15 = 2.30格式,这种情况下,内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据,然后通过饱和运算最终输出数据格式1.15。


12.2.4  实例讲解

实验目的:

    1. 学习StatisticsMathFunctions中均方根的求解

实验内容:

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

实验现象:

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




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_RMS
  4. *    功能说明: 求均方值
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_RMS(void)
  10. {
  11.      float32_t pSrc[10] = {0.7060,    0.0318,    0.2769,    0.0462,    0.0971,    0.8235,    0.6948,    0.3171,    0.9502,    0.0344};
  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.    
  22.      arm_rms_f32(pSrc, 10, &pResult);
  23.      printf("arm_rms_f32 : pResult = %f\r\n", pResult);                                              (1)

  24.      /*****************************************************************/
  25.      for(pIndex = 0; pIndex < 10; pIndex++)
  26.      {
  27.           pSrc1[pIndex] = rand();
  28.      }
  29.      arm_rms_q31(pSrc1, 10, &pResult1);                                                              (2)
  30.      printf("arm_rms_q31 : pResult = %d\r\n", pResult1);
  31.    
  32.      /*****************************************************************/
  33.      for(pIndex = 0; pIndex < 10; pIndex++)
  34.      {
  35.           pSrc2[pIndex] = rand()%32768;
  36.      }
  37.      arm_rms_q15(pSrc2, 10, &pResult2);                                                                (3)
  38.      printf("arm_rms_q15 : pResult = %d\r\n", pResult2);
  39.      printf("******************************************************************\r\n");
  40. }

复制代码

1.     这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。

    在matlab的命令窗口输入如下命令:

       a =rand(1,10)  %1行10列

    然后再通过命令std获得标准偏差:

      rms(a)   




2.     这个函数的使用还没有搞懂,有待后面解决。

3.     这个函数的使用还没有搞懂,有待后面解决。


谢谢分享!

12.3  方差Variance

这部分函数用于计算标准偏差,公式描述如下:

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


12.3.1  arm_var_f32

函数定义如下:

    voidarm_var_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   variance value returnedhere   


12.3.2  arm_var_q31

函数定义如下:

    void arm_var_q31(q31_t * pSrc, uint32_t blockSize, q63_t* pResult)

参数定义:

      [in] *pSrc      points to the input vector   

      [in]blockSize  length of the inputvector   

      [out] *pResult  rms value returned here   


12.3.3  arm_var_q15

函数定义如下:

    void arm_var_q15(q15_t * pSrc, uint32_t blockSize, q31_t* pResult)

参数定义:

      [in] *pSrc      points to the input vector   

      [in]blockSize  length of the inputvector   

      [out] *pResult  rms value returned here   

注意事项:

    输入参数是1.15格式,相乘后的的结果就是1.15*1.15 = 2.30格式,这种情况下,内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据,然后通过饱和运算最终输出数据格式1.15。


12.3.4  实例讲解

实验目的:

    1. 学习StatisticsMathFunctions中方差的求解

实验内容:

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

实验现象:

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




程序设计:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSP_RMS
  4. *    功能说明: 求最小值
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void DSP_Var(void)
  10. {
  11.      float32_t pSrc[10] = { 0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898, 0.4456, 0.6463, 0.7094, 0.7547};
  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.      q31_t pResult2;
  20.    
  21.    
  22.      arm_var_f32(pSrc, 10, &pResult);
  23.      printf("arm_var_f32 : pResult = %f\r\n", pResult);

  24.      /*****************************************************************/
  25.      for(pIndex = 0; pIndex < 10; pIndex++)
  26.      {
  27.           pSrc1[pIndex] = rand();
  28.      }
  29.      arm_var_q31(pSrc1, 10, &pResult1);
  30.      printf("arm_var_q31 : pResult = %lld\r\n", pResult1);
  31.    
  32.      /*****************************************************************/
  33.      for(pIndex = 0; pIndex < 10; pIndex++)
  34.      {
  35.           pSrc2[pIndex] = rand()%32768;
  36.      }
  37.      arm_var_q15(pSrc2, 10, &pResult2);
  38.      printf("arm_var_q15 : pResult = %d\r\n", pResult2);
  39.      printf("******************************************************************\r\n");
  40. }

复制代码

1.     这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。

    在matlab的命令窗口输入如下命令:

      a =rand(1,10)  %1行10列

    然后再通过命令var获得标准偏差:

         var(a)

  

2.     这个函数的使用还没有搞懂,有待后面解决。

3.     这个函数的使用还没有搞懂,有待后面解决。


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

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

网站地图

Top