硬汉嵌入式论坛

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

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

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-3-23 10:59:02 | 显示全部楼层 |阅读模式
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
第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 input vector   
           [in]  blockSize length of the input vector   
       [out] *pResult standard deviation value returned here    

12.1.2 arm_std_q31

此函数的使用比较简单,函数定义如下:
      void arm_std_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 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 input vector   
       [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. /*
  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. q31_t pSrc1[10];
  15. q31_t pResult1;
  16. q15_t pSrc2[10];
  17. q15_t pResult2;
  18. arm_std_f32(pSrc, 10, &pResult);                                                               (1)
  19. printf("arm_std_f32 : pResult = %f\r\n", pResult);
  20. /*****************************************************************/
  21. for(pIndex = 0; pIndex < 10; pIndex++)
  22. {
  23. pSrc1[pIndex] = rand();
  24. }
  25. arm_std_q31(pSrc1, 10, &pResult1);                                                             (2)
  26. printf("arm_std_q31 : pResult = %d\r\n", pResult1);
  27. /*****************************************************************/
  28. for(pIndex = 0; pIndex < 10; pIndex++)
  29. {
  30. pSrc2[pIndex] = rand()%32768;
  31. }
  32. arm_std_q15(pSrc2, 10, &pResult2);                                                             (3)
  33. printf("arm_std_q15 : pResult = %d\r\n", pResult2);
  34. printf("******************************************************************\r\n");
  35. }
复制代码
1. 这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      rand(1,10)  %1行10列
    然后再通过命令std获得标准偏差:
      std(ans)   

    matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
12.1.png
12.2.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-3-23 11:03:27 | 显示全部楼层
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

函数定义如下:
      void arm_rms_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 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 input vector   
       [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 input vector   
       [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. q31_t pSrc1[10];
  15. q31_t pResult1;
  16. q15_t pSrc2[10];
  17. q15_t pResult2;
  18. arm_rms_f32(pSrc, 10, &pResult);
  19. printf("arm_rms_f32 : pResult = %frn", pResult);                                              (1)
  20. /*****************************************************************/
  21. for(pIndex = 0; pIndex < 10; pIndex++)
  22. {
  23. pSrc1[pIndex] = rand();
  24. }
  25. arm_rms_q31(pSrc1, 10, &pResult1);                                                              (2)
  26. printf("arm_rms_q31 : pResult = %drn", pResult1);
  27. /*****************************************************************/
  28. for(pIndex = 0; pIndex < 10; pIndex++)
  29. {
  30. pSrc2[pIndex] = rand()%32768;
  31. }
  32. arm_rms_q15(pSrc2, 10, &pResult2);                                                                (3)
  33. printf("arm_rms_q15 : pResult = %drn", pResult2);
  34. printf("******************************************************************rn");
  35. }
复制代码
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a = rand(1,10)  %1行10列
    然后再通过命令std获得标准偏差:
      rms(a)   
12.4.png
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-3-23 11:15:05 | 显示全部楼层
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

函数定义如下:
     void arm_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 returned here   

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 input vector   
      [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 input vector   
      [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. q31_t pSrc1[10];
  15. q63_t pResult1;
  16. q15_t pSrc2[10];
  17. q31_t pResult2;
  18. arm_var_f32(pSrc, 10, &pResult);
  19. printf("arm_var_f32 : pResult = %frn", pResult);
  20. /*****************************************************************/
  21. for(pIndex = 0; pIndex < 10; pIndex++)
  22. {
  23. pSrc1[pIndex] = rand();
  24. }
  25. arm_var_q31(pSrc1, 10, &pResult1);
  26. printf("arm_var_q31 : pResult = %lldrn", pResult1);
  27. /*****************************************************************/
  28. for(pIndex = 0; pIndex < 10; pIndex++)
  29. {
  30. pSrc2[pIndex] = rand()%32768;
  31. }
  32. arm_var_q15(pSrc2, 10, &pResult2);
  33. printf("arm_var_q15 : pResult = %drn", pResult2);
  34. printf("******************************************************************rn");
  35. }
复制代码
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a = rand(1,10)  %1行10列
    然后再通过命令var获得标准偏差:
         var(a)
    12.6.png
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。

12.4 总结

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 15:25 , Processed in 0.251289 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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