STM32/STM8技术论坛
直播中

硬汉Eric2013

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

【安富莱——DSP教程】第12章 StatisticsMathFunctions的使用(二)

第12章  StatisticsMathFunctions的使用(二)
    本期教程主要讲解统计函数中的标准偏差、均方根和方差的计算。
    12.1 标准偏差Standard deviation
    12.2 均方差RMS
    12.3 方差Variance
    12.4 总结

回帖(5)

硬汉Eric2013

2015-6-9 10:54:03
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光盘里面有此软件)查看打印信息现象如下:
12.1.png

程序设计:
  1. /*
  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 = %frn", 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 = %drn", 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 = %drn", pResult2);
  39.    
  40.      printf("******************************************************************rn");
  41. }
1.     这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      rand(1,10)  %1行10列
    然后再通过命令std获得标准偏差:
      std(ans)   

12.2.png
    matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。
2.     这个函数的使用还没有搞懂,有待后面解决。
3.     这个函数的使用还没有搞懂,有待后面解决。

举报

硬汉Eric2013

2015-6-9 10:57:11
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光盘里面有此软件)查看打印信息现象如下:
12.3.png

程序设计:
  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 = %frn", 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 = %drn", 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 = %drn", pResult2);
  39.      printf("******************************************************************rn");
  40. }
1.     这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
       a =rand(1,10)  %1行10列
    然后再通过命令std获得标准偏差:
      rms(a)   
12.4.png

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

举报

mega1702

2015-6-10 10:01:56
谢谢分享!!!!!!!!!!!!!!
举报

硬汉Eric2013

2015-6-10 12:05:57
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光盘里面有此软件)查看打印信息现象如下:
12.5.png

程序设计:
  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 = %frn", 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 = %lldrn", 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 = %drn", pResult2);
  39.      printf("******************************************************************rn");
  40. }
1.     这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a =rand(1,10)  %1行10列
    然后再通过命令var获得标准偏差:
         var(a)
   12.6.png
2.     这个函数的使用还没有搞懂,有待后面解决。
3.     这个函数的使用还没有搞懂,有待后面解决。

举报

硬汉Eric2013

2015-6-10 12:06:09
12.4        总结
本期教程就跟大家讲这么多,有兴趣的可以深入研究这些函数源码的实现。
举报

更多回帖

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