你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
baiyongbin2009 发布时间:2015-3-23 11:24
本帖最后由 baiyongbin2009 于 2015-3-23 11:30 编辑
! C7 D  j/ j8 [6 T
. X' N3 I+ ?. c% c( s7 ~  J/ M& o特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
" v% X, O, @4 b. e4 R! m7 ^
第12章 StatisticsMathFunctions的使用(二)

7 c) k; M. z( G+ s- Z
    本期教程主要讲解统计函数中的标准偏差、均方根和方差的计算。
12.1 标准偏差 Standard deviation
12.2 均方差RMS
12.3 方差 Variance
12.4 总结
, q" s; [! k  Z, e+ W% c# r- o2 G
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   
0 s0 [3 T% H/ m7 F
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位累加器很容易溢出,并且这个函数不支持饱和运算,这个函数的使用还有一些问题,有待后面解决。

2 |3 c4 N( H9 K) M7 m
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光盘里面有此软件)查看打印信息现象如下:
12.1.png
程序设计:
  1. /*; F; \% o$ y+ t3 I
  2. *********************************************************************************************************
    / z: g* }7 V0 F/ _7 F6 O( |8 B
  3. *        函 数 名: DSP_Std6 A1 M9 |6 A8 F, B
  4. *        功能说明: 求标准偏差# o+ q2 j! r* j- }& `( M$ O( K
  5. *        形    参:无
      z; C& ]; w8 c3 q. [
  6. *        返 回 值: 无5 O' `: X5 {# N* P  S
  7. *********************************************************************************************************! W. A$ w7 J( L$ W" E) o2 R
  8. */
    3 W3 f& o4 m! W- l
  9. static void DSP_Std(void)
    2 O" |# I) U/ y& Z9 F& o6 \7 d
  10. {5 t  J  R8 v( d8 Y  ]1 N0 e
  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};4 Z, t; k$ s5 A: h
  12. float32_t pResult;. C  w/ C, P" U2 ]) \; x) I
  13. uint32_t pIndex;
    / L2 M( ]" n6 h* `
  14. q31_t pSrc1[10];
    4 }- }' y5 E1 h0 e+ m% f8 [( y
  15. q31_t pResult1;) z( ]: r, Q/ q* Q- W8 i
  16. q15_t pSrc2[10];
    # ~' e" J: Z) Y- X5 d9 ?" s' k
  17. q15_t pResult2;
    . ^6 E' ^2 y4 y4 k3 r- ~
  18. arm_std_f32(pSrc, 10, &pResult);                                                               (1)* h" J6 u$ z+ S: N* B, U/ J
  19. printf("arm_std_f32 : pResult = %f\r\n", pResult);3 g% K3 v: C+ H7 F

  20. ' s/ u7 M. ^1 `# D
  21. /*****************************************************************/7 O% f) F3 k% `7 O# @+ O3 H
  22. for(pIndex = 0; pIndex < 10; pIndex++)! a. _6 y, c! b1 `: [: d
  23. {
    ; o! C9 T, K+ m; F% C+ r& d2 T, Y
  24. pSrc1[pIndex] = rand();
    7 e8 a/ v4 e) T+ ~# C
  25. }
    # D. Q' D$ x7 F5 _  ?  F% z+ K
  26. arm_std_q31(pSrc1, 10, &pResult1);                                                             (2)
    7 \* b$ O7 p1 n6 }0 l
  27. printf("arm_std_q31 : pResult = %d\r\n", pResult1);
      _. @1 B0 @( B# \, a0 R1 Y
  28. /*****************************************************************/
    . [1 k% R& k& {" k  n+ C! w' ]3 j
  29. for(pIndex = 0; pIndex < 10; pIndex++): q8 K9 r1 @1 N1 O
  30. {, \, V' e. g7 `! k3 M% u+ ?
  31. pSrc2[pIndex] = rand()%32768;, l$ x! @* W# F9 Q# f* Q
  32. }2 z9 Y. F! ?/ }
  33. arm_std_q15(pSrc2, 10, &pResult2);                                                             (3)% C5 p2 d7 f& X8 ^8 P7 {8 W
  34. printf("arm_std_q15 : pResult = %d\r\n", pResult2);
    3 o( F. x5 ]8 U. L2 g# i* ~
  35. printf("******************************************************************\r\n");
    ( j. a) N  W0 m7 m" h+ \% p
  36. }
复制代码
1. 这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      rand(1,10)  %1行10列
    然后再通过命令std获得标准偏差:
      std(ans)   
12.2.png
matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
! b' _. e8 F; D
赞 收藏 评论5 发布时间:2015-3-23 11:24

举报

5个回答
baiyongbin2009 回答时间:2015-3-23 11:27:15
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   

* [; |3 p; n: G  ]7 k' U
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位累加器很容易溢出,并且这个函数不支持饱和运算。

1 I, E& ?* h2 s2 q
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。

6 H0 l- o# r8 d6 a
12.2.4 实例讲解
实验目的:
   1. 学习StatisticsMathFunctions中均方根的求解
实验内容:
    1. 按下按键K2, 串口打印函数DSP_RMS的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
12.3.png
程序设计:
  1. /*: f! A" O: U7 B2 N
  2. *********************************************************************************************************8 V; ?6 X% n3 h: m* h- ~. H7 Y( V; o
  3. *        函 数 名: DSP_RMS
    3 J) J( b. x8 \0 v" |; Q6 J/ h0 x+ o
  4. *        功能说明: 求均方值+ @8 [7 m. L' {, h
  5. *        形    参:无; W% Z+ }# [% T: |  K& E8 L* z
  6. *        返 回 值: 无
    7 ~8 }; m4 t- t6 K& H
  7. *********************************************************************************************************
    & W/ @0 D1 w: z
  8. */6 a) w& ]& p, j
  9. static void DSP_RMS(void)7 G. V$ j: D$ n' F
  10. {' U0 Y7 T/ ^- j! `+ G  [
  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};
    , D" [- a8 p$ @! n3 W9 |* v1 ^3 R
  12. float32_t pResult;$ E4 ]' Z9 f# L# P3 t
  13. uint32_t pIndex;0 a: h; J* \; Z2 r1 y
  14. q31_t pSrc1[10];2 a: c; R& R  A( x
  15. q31_t pResult1;3 `" p$ @1 F) [; ?
  16. q15_t pSrc2[10];0 F9 K; ~, a: e* j) i3 R' }5 [
  17. q15_t pResult2;
    ) _, p7 W0 U) d* v
  18. arm_rms_f32(pSrc, 10, &pResult);! Y8 L1 R1 `8 c  g6 m7 c
  19. printf("arm_rms_f32 : pResult = %f\r\n", pResult);                                              (1)" Y' M# ~1 `4 d# S( p
  20. % J. ?# U% ]! |3 ^% L6 ?
  21. /*****************************************************************/
    ) r0 H5 O9 q' u! K: W
  22. for(pIndex = 0; pIndex < 10; pIndex++)( i) J- {7 b: W9 b" d
  23. {
    0 Y4 N' q- L  J/ U
  24. pSrc1[pIndex] = rand();& b. V. e& E" T* _  d8 R  E2 s. Z
  25. }
    * ?6 K8 F7 h. X6 f' y
  26. arm_rms_q31(pSrc1, 10, &pResult1);                                                              (2)
    3 o/ p# q- k; y# A4 b5 F( `
  27. printf("arm_rms_q31 : pResult = %d\r\n", pResult1);! \2 y2 G2 [6 t' {5 S
  28. /*****************************************************************/
    * L! C( R+ q- [
  29. for(pIndex = 0; pIndex < 10; pIndex++)
    ' }6 w' S8 ?; |( h# V3 n& B4 \) u! Y! h
  30. {
    7 v3 G1 U% z4 j9 {( K# p% J
  31. pSrc2[pIndex] = rand()%32768;7 v1 Q  H% I/ v- B+ A( y
  32. }+ r5 w; W3 l8 w4 D$ m* C9 o2 c4 F
  33. arm_rms_q15(pSrc2, 10, &pResult2);                                                                (3). ~0 D1 R; g, F, E7 H- s
  34. printf("arm_rms_q15 : pResult = %d\r\n", pResult2);
    * H8 _( F; j7 T6 @: w4 _; U, J
  35. printf("******************************************************************\r\n");. t' e& @3 B3 \' I  k& S! h
  36. }
复制代码
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a = rand(1,10)  %1行10列
    然后再通过命令std获得标准偏差:
      rms(a)   
12.4.png
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。

; J8 L# w; z/ k  `  J" ~
baiyongbin2009 回答时间:2015-3-23 11:29:39
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   
. ]5 E0 F" l6 L) _6 t
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   
0 Z9 r, Z! R4 _) U% O% m' b
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。

! A& R; Z/ c6 M1 ^
12.3.4 实例讲解
实验目的:
    1. 学习StatisticsMathFunctions中方差的求解
实验内容:
    1. 按下按键K3, 串口打印函数DSP_Var的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
12.5.png
程序设计:
  1. /*/ n( ?6 q8 N+ a$ n. ~  Q+ h
  2. *********************************************************************************************************
    # a/ b& u' I  ^* ?( b
  3. *        函 数 名: DSP_RMS" d7 M; q. W* Z
  4. *        功能说明: 求最小值# D% Q( K% x" [  D$ e* V0 M9 e
  5. *        形    参:无
    & p% H! {  N# W
  6. *        返 回 值: 无
    : X, l. z7 N! k) y4 e4 |  Z
  7. *********************************************************************************************************4 E' N3 F# A0 q6 j  t; `. Q6 s5 M" F% ]
  8. */4 ?2 S# t- h2 B: H1 f5 {% K
  9. static void DSP_Var(void)5 a2 p6 E& E" i; ^4 [) |8 S0 J
  10. {
    / d6 ^5 ]# \2 B! u! O" G6 @
  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};
    ; k1 [# k$ {+ j! b
  12. float32_t pResult;
    . |0 O6 v4 x  n7 i
  13. uint32_t pIndex;- g4 N& D0 `+ g; K  d. _
  14. q31_t pSrc1[10];
    : q; P: b* F6 ~4 d7 z
  15. q63_t pResult1;
    5 S5 s- g+ Y* \9 t7 J- t6 N
  16. q15_t pSrc2[10];  |" C# Q& X5 M9 T- Z, g
  17. q31_t pResult2;
    9 B. @9 C& G  r6 q# U+ Z. E7 R
  18. arm_var_f32(pSrc, 10, &pResult);8 _! U  H2 D+ c/ C/ b7 R) L; i# Q4 K
  19. printf("arm_var_f32 : pResult = %f\r\n", pResult);
    / v# l- a4 F" @% j- |# `: k
  20. ( _1 D# H7 e6 G; ?
  21. /*****************************************************************/0 v" P; t, H6 [; H1 b/ M
  22. for(pIndex = 0; pIndex < 10; pIndex++)
    5 J6 d+ t/ E3 e& s& j& `  |3 e0 e
  23. {2 k( I6 o  `) R, I. z
  24. pSrc1[pIndex] = rand();1 f' v- Z' `! z) e1 y
  25. }
    : C9 e2 ?( i$ t. P$ [8 u
  26. arm_var_q31(pSrc1, 10, &pResult1);# w. J/ N' `) o! x
  27. printf("arm_var_q31 : pResult = %lld\r\n", pResult1);$ o& E8 J' Z) t- B5 S
  28. /*****************************************************************/
    $ N1 W3 O: R0 u* ^7 J
  29. for(pIndex = 0; pIndex < 10; pIndex++): I6 U  F: v# H6 x& F/ R
  30. {' H, ]/ o) `3 e, O
  31. pSrc2[pIndex] = rand()%32768;5 W( n5 x/ Y* W( W
  32. }
    $ ^% s: Q6 I" Q* v+ \
  33. arm_var_q15(pSrc2, 10, &pResult2);) I: e, Z" u' N
  34. printf("arm_var_q15 : pResult = %d\r\n", pResult2);
    " o* g/ I; N7 O* `0 ?
  35. printf("******************************************************************\r\n");4 O4 O* H0 \" o4 l+ T$ f
  36. }
复制代码
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a = rand(1,10)  %1行10列
    然后再通过命令var获得标准偏差:
         var(a)
    12.6.png
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
7 f0 w# C# F- L% X7 {
stary666 回答时间:2015-3-23 12:35:12
学习一下!
kqh1120 回答时间:2015-3-24 00:08:28
学习了啊 14.gif
nocoyou 回答时间:2015-3-24 01:09:16
学习学习
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版