硬汉嵌入式论坛

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

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

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

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

11.1.2 arm_max_q31

    函数定义如下:
       void arm_max_q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult, uint32_t * pIndex)
    参数定义:
       [in]  *pSrc      points to the input vector   
       [in]  blockSize  length of the input vector   
           [out] *pResult   maximum value returned here   
       [out] *pIndex    index of maximum value returned here    

11.1.3 arm_max_q15

    函数定义如下:
      void arm_max_q15(q15_t * pSrc, uint32_t blockSize, q15_t * pResult, uint32_t * pIndex)
    参数定义:
           [in]  *pSrc      points to the input vector   
           [in]  blockSize  length of the input vector   
       [out] *pResult   maximum value returned here   
       [out] *pIndex    index of maximum value returned here    

11.1.4 arm_max_q7

    函数定义如下:
      void arm_max_q7(q7_t * pSrc, uint32_t blockSize, q7_t * pResult, uint32_t * pIndex)
    参数定义:
       [in]  *pSrc      points to the input vector   
       [in]  blockSize  length of the input vector   
       [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. q31_t pSrc1[10];
  16. q31_t pResult1;
  17. q15_t pSrc2[10];
  18. q15_t pResult2;
  19. q7_t pSrc3[10];
  20. q7_t pResult3;
  21. arm_max_f32(pSrc, 10, &pResult, &pIndex);
  22. printf("arm_max_f32 : pResult = %f  pIndex = %d\r\n", pResult, pIndex);
  23. /*****************************************************************/
  24. for(pIndex = 0; pIndex < 10; pIndex++)
  25. {
  26. pSrc1[pIndex] = rand();                                                                   (2)
  27. }
  28. arm_max_q31(pSrc1, 10, &pResult1, &pIndex);
  29. printf("arm_max_q31 : pResult = %d  pIndex = %d\r\n", pResult1, pIndex);
  30. /*****************************************************************/
  31. for(pIndex = 0; pIndex < 10; pIndex++)
  32. {
  33. pSrc2[pIndex] = rand()%32768;                                                             (3)
  34. }
  35. arm_max_q15(pSrc2, 10, &pResult2, &pIndex);
  36. printf("arm_max_q15 : pResult = %d  pIndex = %d\r\n", pResult2, pIndex);
  37. /*****************************************************************/
  38. for(pIndex = 0; pIndex < 10; pIndex++)
  39. {
  40. pSrc3[pIndex] = rand()%128;                                                               (4)
  41. }
  42. arm_max_q7(pSrc3, 10, &pResult3, &pIndex);
  43. printf("arm_max_q7 : pResult = %d  pIndex = %d\r\n", pResult3, pIndex);
  44. printf("******************************************************************\r\n");
  45. }
复制代码
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.1.png
11.2.png
11.3.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-3-21 11:13:58 | 显示全部楼层
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 input vector   
       [in]  blockSize  length of the input vector   
       [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 input vector   
       [in]  blockSize  length of the input vector   
       [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 input vector   
       [in]  blockSize  length of the input vector   
            [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 input vector   
           [in]  blockSize  length of the input vector   
       [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光盘里面有此软件)查看打印信息现象如下:
11.4.png

程序设计:
  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. q31_t pSrc1[10];
  15. q31_t pResult1;
  16. q15_t pSrc2[10];
  17. q15_t pResult2;
  18. q7_t pSrc3[10];
  19. q7_t pResult3;
  20. arm_min_f32(pSrc, 10, &pResult, &pIndex);
  21. printf("arm_min_f32 : pResult = %f  pIndex = %drn", pResult, pIndex);
  22. /*****************************************************************/
  23. for(pIndex = 0; pIndex < 10; pIndex++)
  24. {
  25. pSrc1[pIndex] = rand();
  26. }
  27. arm_min_q31(pSrc1, 10, &pResult1, &pIndex);
  28. printf("arm_min_q31 : pResult = %d  pIndex = %drn", pResult1, pIndex);
  29. /*****************************************************************/
  30. for(pIndex = 0; pIndex < 10; pIndex++)
  31. {
  32. pSrc2[pIndex] = rand()%32768;
  33. }
  34. arm_min_q15(pSrc2, 10, &pResult2, &pIndex);
  35. printf("arm_min_q15 : pResult = %d  pIndex = %drn", pResult2, pIndex);
  36. /*****************************************************************/
  37. for(pIndex = 0; pIndex < 10; pIndex++)
  38. {
  39. pSrc3[pIndex] = rand()%128;
  40. }
  41. arm_min_q7(pSrc3, 10, &pResult3, &pIndex);
  42. printf("arm_min_q7 : pResult = %d  pIndex = %drn", pResult3, pIndex);
  43. printf("******************************************************************rn");
  44. }
复制代码
1. 这里求最小值跟上面求最大值基本是一样的。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-3-21 11:17:37 | 显示全部楼层
11.3 平均值Mean

    这部分函数用于计算数组的平均值。公式描述如下:
    Result = (pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]) / blockSize;   

11.3.1 arm_mean_f32

    此函数的使用比较简单,函数定义如下:
      void arm_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

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

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

    函数定义如下:
      void arm_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光盘里面有此软件)查看打印信息现象如下:
11.5.png

程序设计:
  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. q31_t pSrc1[10];
  15. q31_t pResult1;
  16. q15_t pSrc2[10];
  17. q15_t pResult2;
  18. q7_t pSrc3[10];
  19. q7_t pResult3;
  20. arm_mean_f32(pSrc, 10, &pResult);
  21. printf("arm_mean_f32 : pResult = %frn", pResult);
  22. /*****************************************************************/
  23. for(pIndex = 0; pIndex < 10; pIndex++)
  24. {
  25. pSrc1[pIndex] = rand();
  26. }
  27. arm_mean_q31(pSrc1, 10, &pResult1);
  28. printf("arm_mean_q31 : pResult = %drn", pResult1);
  29. /*****************************************************************/
  30. for(pIndex = 0; pIndex < 10; pIndex++)
  31. {
  32. pSrc2[pIndex] = rand()%32768;
  33. }
  34. arm_mean_q15(pSrc2, 10, &pResult2);
  35. printf("arm_mean_q15 : pResult = %drn", pResult2);
  36. /*****************************************************************/
  37. for(pIndex = 0; pIndex < 10; pIndex++)
  38. {
  39. pSrc3[pIndex] = rand()%128;
  40. }
  41. arm_mean_q7(pSrc3, 10, &pResult3);
  42. printf("arm_mean_q7 : pResult = %drn", pResult3);
  43. printf("******************************************************************rn");
  44. }
复制代码
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-3-21 11:21:25 | 显示全部楼层
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 value returned here

11.4.2 arm_power_q31

   函数定义如下:
      void arm_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 value returned here  
     注意事项:
    输入参数是1.31格式,两个数据的乘积就是1.31*1.31 = 2.62格式,这里将此结果右移14位,也就是将低14位数据截取掉,最终的输出做64位饱和运算,结果是16.48格式。

11.4.3 arm_power_q15

    函数定义如下:
        void arm_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 value returned here    
    注意事项:
    输入参数是1.15格式,两个数据的乘积就是1.15*1.15 = 2.30格式,最终的输出做64位饱和运算,结果是34.30格式。

11.4.4 arm_power_q7

    函数定义如下:
      void arm_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 value returned here    
    注意事项:
    输入参数是1.7格式,两个数据的乘积就是1.7*1.7 = 2.14格式,最终的输出做32位饱和运算,结果是18.14格式。

11.4.5 实例讲解

实验目的:
    1. 学习FastMathFunctions中功率的求解
实验内容:
     1. 按下摇杆UP键, 串口打印函数DSP_Power的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
11.6.png

程序设计:
  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. q31_t pSrc1[10];
  15. q63_t pResult1;
  16. q15_t pSrc2[10];
  17. q63_t pResult2;
  18. q7_t pSrc3[10];
  19. q31_t pResult3;
  20. arm_power_f32(pSrc, 10, &pResult);
  21. printf("arm_power_f32 : pResult = %frn", pResult);
  22. /*****************************************************************/
  23. for(pIndex = 0; pIndex < 10; pIndex++)
  24. {
  25. pSrc1[pIndex] = rand();
  26. }
  27. arm_power_q31(pSrc1, 10, &pResult1);
  28. printf("arm_power_q31 : pResult = %lldrn", pResult1);
  29. /*****************************************************************/
  30. for(pIndex = 0; pIndex < 10; pIndex++)
  31. {
  32. pSrc2[pIndex] = rand()%32768;
  33. }
  34. arm_power_q15(pSrc2, 10, &pResult2);
  35. printf("arm_power_q15 : pResult = %lldrn", pResult2);
  36. /*****************************************************************/
  37. for(pIndex = 0; pIndex < 10; pIndex++)
  38. {
  39. pSrc3[pIndex] = rand()%128;
  40. }
  41. arm_power_q7(pSrc3, 10, &pResult3);
  42. printf("arm_power_q7 : pResult = %drn", pResult3);
  43. printf("******************************************************************rn");
  44. }
复制代码

11.5 总结

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 20:26 , Processed in 0.180201 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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