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

【安富莱——DSP教程】第22章 math_help中函数的使用

[复制链接]
baiyongbin2009 发布时间:2015-4-3 11:30
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接4 O# J0 t2 a5 b. ~
第22章 math_help中函数的使用
, p: j( y) |6 |1 y5 a" p
    本期教程主要讲解math_help文件中函数的使用,这个文件也是ARM官方提供的,这些函数相对都比较容易,同时使用频率也很高。希望初学的同学学习并掌握。
    22.1 函数讲解
    22.3 总结
: N9 s0 P: K7 K# o0 s
22.1 函数讲解
/ H' z8 c2 j: G5 C
22.1.1 函数目录
    在文件math_help文件中主要有以下函数:
  1. float arm_snr_f32(float *pRef, float *pTest,  uint32_t buffSize);  
    5 l4 K0 @0 A( {: x
  2. void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples);1 c3 A: X  I: U- s
  3. void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits);
    ( J: b# N* W* a$ N
  4. void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits);) {+ B, L' U5 F: h7 y5 P
  5. void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples);
    % s1 I5 Q7 e) B9 }+ ^
  6. void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples);
    ' Y5 z- p. O7 C! A
  7. void arm_clip_f32(float *pIn, uint32_t numSamples);- `4 A2 }: r0 L
  8. uint32_t arm_calc_guard_bits(uint32_t num_adds);
    . x. L) q) f' ]
  9. void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits);- e, i; f' k: S9 J, ?, h; ?- a
  10. uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples);4 F' W5 y3 I, h4 u+ y) o* j
  11. uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples);: g; J9 A5 u: A7 p; q) J6 c
  12. uint32_t arm_calc_2pow(uint32_t guard_bits);
复制代码

+ @  ]# L, A+ F
22.1.2 arm_snr_f32
    这个函数用于求信噪比:
  1. /**                                                                                                   (1)+ ^  \0 i& S; |5 s& b0 J, o9 d5 u- Y
  2. * @brief  Caluclation of SNR( d/ r; C" Q1 z  H+ Y8 X8 x
  3. * @param  float*         Pointer to the reference buffer
    " |$ @/ R5 h, }4 `
  4. * @param  float*        Pointer to the test buffer! e! Y# s/ _8 j# l9 {5 K( X. `: {7 d
  5. * @param  uint32_t        total number of samples! p8 W& b9 h9 {( b: d; ~2 m! Z
  6. * @return float        SNR
    1 t# f% n+ Y3 @# m
  7. * The function Caluclates signal to noise ratio for the reference output
    $ I7 ]. h( f. X, w0 D- C
  8. * and test output
      w- s6 j* p% i6 E% B
  9. */
    / ?9 f$ K% D; F* Z
  10. 1 p* Y$ g+ Y/ i
  11. float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize)* H/ l, j1 }: x. A! G7 O
  12. {9 F4 W6 \# {' _0 {! g6 ~2 x
  13.   float EnergySignal = 0.0, EnergyError = 0.0;6 E7 b( M' N( v
  14.   uint32_t i;1 R; p# S% K8 T8 G
  15.   float SNR;
    ( X7 z' Q  O! J! t+ J9 X
  16.   int temp;
    : U9 S" R1 L8 P6 g: c$ B8 j
  17.   int *test;# U! C, E# s; ~  a- B, E

  18. $ s  m* T7 i+ r! a2 J: ^8 P8 B, J
  19.   for (i = 0; i < buffSize; i++)" ~  }7 }7 O' w9 X8 P, B
  20.     {2 L, `$ L# [3 e! f. F* s* E
  21.            /* Checking for a NAN value in pRef array */
    * Z' p& n+ f& d3 q) |. a
  22.   test =   (int *)(&pRef[i]);+ S( |+ ?* F& `
  23.       temp =  *test;
    2 a* F& C6 w: U. i* p/ f
  24. % J/ V$ w0 v8 k' w, r2 _. R  q
  25.   if(temp == 0x7FC00000)
    ; k5 L. e! q9 ]# p
  26.   {& |/ S4 Z8 Z: h5 n7 l3 g* _
  27.            return(0);# }0 @  u( ]% ~) m
  28.   }
    2 Y6 U6 F/ I" s! K1 b0 u

  29. , C" w4 }/ J8 x5 U( g1 d% l1 f4 t
  30.   /* Checking for a NAN value in pTest array */
    . Z* ^9 ^! }8 [
  31.   test =   (int *)(&pTest[i]);' k2 w6 B; B2 }/ |
  32.       temp =  *test;
      s) U' z# c  T9 f3 r/ l
  33. 1 u# H2 L6 r5 t3 B& C9 Q( o, b
  34.   if(temp == 0x7FC00000)
    & z# M3 r3 g9 n' e: r0 V
  35.   {
    8 F* N! P( I6 S0 {5 C
  36.            return(0);
    1 p' N; S4 h: t# v4 ~- j; j
  37.   }* E! ~' q5 A0 r' L2 t
  38.       EnergySignal += pRef[i] * pRef[i];
    # d) u$ B) n$ f+ o/ W- l/ U9 W
  39.       EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); 8 S8 B* h' Q/ s
  40.     }
    4 v1 G& k% H0 o
  41. 3 _( ^% j: r! X! G
  42. /* Checking for a NAN value in EnergyError */
    3 T. V; v. x/ O$ A. {
  43. test =   (int *)(&EnergyError);
    ; M0 b5 k1 _, d% ]6 Q
  44.     temp =  *test;9 n5 q4 r( L2 T

  45. 3 I  d- A/ ?4 _% J! m, \: V9 t$ [
  46.     if(temp == 0x7FC00000)
    2 u9 G7 d3 V: M3 H) U( [+ i
  47.     {
    # O/ T. z  u0 y6 H; Z; O5 g5 a  R
  48.            return(0);! h+ D, N1 _2 n# |
  49.     }
    ; G; ]" m/ _+ ^+ ~7 r
  50.   e; f: v  \6 ?+ f1 }$ s9 d
  51.   SNR = 10 * log10 (EnergySignal / EnergyError);                                                       (2)
    $ H7 H3 D6 d# ~- k
  52. 4 L$ R. ~7 ^3 |; B0 q7 {
  53.   return (SNR);
    $ P: a5 U' N$ S" b

  54. 8 H! t4 i/ N# E) I* T7 J
  55. }
复制代码
1. 这里先补充一些信噪比方面的基础知识:
    信噪比,即SNR(Signal to Noise Ratio),又称为讯噪比。反映摄像机成像的抗干扰能力,反应在画质上就是画面是否干净无噪点;狭义来讲是指放大器的输出信号的功率与同时输出的噪声功率的比,常常用分贝数表示,设备的信噪比越高表明它产生的杂音越少。一般来说,信噪比越大,说明混在信号里的噪声越小,声音回放的音质量越高,否则相反。信噪比一般不应该低于70dB,高保真音箱的信噪比应达到110dB以上。公式如下:
22.1.png
3 i+ K; ~  o! v0 {! s4 k
    关于信噪比更详细的知识,大家可以查阅相关资料进行了解。
2. 这里实现的就是上面所说的信噪比公式。
; j+ N- N, }) D
22.1.3 arm_float_to_q12_20
  1. /**
    ( d+ G) i! }6 M0 |" C1 n  }/ ^
  2. * @brief  Converts float to fixed in q12.20 format                                                    (1)7 w) m, \5 P5 y
  3. * @param  uint32_t         number of samples in the buffer
    5 V% c; E) J0 E3 Y
  4. * @return none4 F4 L, m  [! x/ j9 g
  5. * The function converts floating point values to fixed point(q12.20) values
    & X. G# ^* Y6 y$ |& u# x/ a
  6. */
    * Z" {9 X, y: H
  7. ( V9 ]0 g7 }! k, m( m
  8. void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples)) |. r: g8 R5 F- J
  9. {
    . Z$ q* x# ~" @9 J- M  s7 M
  10.   uint32_t i;
    9 C* O7 A# i5 B  q
  11. / t0 I" T0 Z( O
  12.   for (i = 0; i < numSamples; i++)3 ~# {4 N7 l8 Y" F; G& O9 _) K
  13.     {
    ( b* {" `2 Q8 |' I5 q
  14.   /* 1048576.0f corresponds to pow(2, 20) */
    ; ]. |' o& Y9 U7 L) \# i
  15.       pOut[i] = (q31_t) (pIn[i] * 1048576.0f);                                                        (2)
    ' a2 H* D% `8 C
  16. 3 |+ ^( d" @7 J& x0 q
  17.       pOut[i] += pIn[i] > 0 ? 0.5 : -0.5;
    , p+ u9 j) N2 \" h

  18. 2 D: R# J* g  }' W  ?
  19.       if (pIn[i] == (float) 1.0); _+ K0 p0 R7 S* M' O+ d8 p
  20.         {
    ) m2 R# m* }* e% o
  21.           pOut[i] = 0x000FFFFF;
    8 Z9 l" G& {' `- v  e1 ?
  22.         }
    " b% Z% y% m) u. d( `
  23.     }9 ~! d2 ?/ @- E9 y
  24. }
复制代码
1. 这个函数用于将浮点数转换成Q12.20格式的数据。
2. 浮点数转换成Q12.20格式需要乘以2^20,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。

' D& M4 u. h  v* H! H1 X
22.1.4 arm_provide_guard_bits_q15
  1. /**
    6 a+ W& Q3 m7 H8 V/ M
  2. * @brief  Provide guard bits for Input buffer
    + B) t8 X8 }/ ]9 b) R
  3. * @param  q15_t*             Pointer to input buffer
    * p9 |4 r% X8 p
  4. * @param  uint32_t         blockSize  V3 f4 P3 d9 s  _
  5. * @param  uint32_t         guard_bits! v( G* L: P# u7 H2 S) A7 w- Y
  6. * @return none8 P1 o3 d; w  y! R1 p
  7. * The function Provides the guard bits for the buffer
    & [& Q: u# o+ q
  8. * to avoid overflow
    1 d# g  k% ?* t
  9. */
    + e% A, I  F  T" H. Y
  10. ! h* `, k$ C% E: q
  11. void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize,4 o8 {# I5 M& r$ W, B, J# _
  12.                             uint32_t guard_bits)
    : y; J' T; \, X& K
  13. {! e6 ~- j  y+ T: ^
  14.   uint32_t i;1 @( J; o/ @# u, t7 q9 E
  15. / x; A( {/ x7 m/ N* y4 B& M6 x5 |- X
  16.   for (i = 0; i < blockSize; i++)
    . q$ b$ t& o) g7 L+ U3 M
  17.     {/ L5 J" I+ Z7 q/ G' t& o, a
  18.       input_buf[i] = input_buf[i] >> guard_bits;4 C2 L6 {- a$ ^; z. \" z
  19.     }
    $ ^2 p) F; O, V& X0 f' }, g
  20. }
复制代码
1. 这个函数用于给q15_t类型的数据提供保护位,防止溢出。从函数的实现上看,保护位的实现是通过右移数据实现的。
" ~5 Y. L6 e+ |. V+ ~. B- d
22.1.5 arm_provide_guard_bits_q31
  1. /**
    7 ]- W3 |* o8 D4 Y) ]' Q5 i
  2. * @brief  Provide guard bits for Input buffer& i5 F2 c7 g+ v5 l' w+ S' s0 v
  3. * @param  q31_t*         Pointer to input buffer
    ( g% _" R7 G% N' f! q% k7 B) R
  4. * @param  uint32_t         blockSize
    7 w, F# u' ~( u
  5. * @param  uint32_t         guard_bits
    9 a) ^) k/ u. B* `; y5 f1 v$ H
  6. * @return none( h" [9 e- j5 n/ w
  7. * The function Provides the guard bits for the buffer
    $ s! L  ]* T7 e2 ~
  8. * to avoid overflow , W* ^8 U1 E/ B
  9. */
    : v0 ]: f9 e, m! O2 D
  10. . J' P4 m( h7 [8 p, k
  11. void arm_provide_guard_bits_q31 (q31_t * input_buf, 3 ?: m6 p& k8 q. w9 a  D) P- j
  12. uint32_t blockSize,% N( g% E* e: W& i2 S0 S( B
  13.                                  uint32_t guard_bits)& a2 m8 G% V; U& n$ I+ h
  14. {) u' r$ z4 L$ }) M' a1 T' f
  15.   uint32_t i;; J1 {4 U4 Z9 I0 p/ T1 W/ Z' ^

  16.   P. S; d5 f# D, v( ^
  17.   for (i = 0; i < blockSize; i++)
    ; D9 m- j5 e; S) v( N  g  T
  18.     {+ p: f" r5 R, O. `
  19.       input_buf[i] = input_buf[i] >> guard_bits;
    ' _, ^+ C) |. Y- r8 M
  20.     }4 G: p. _8 L6 ^2 C- e$ d
  21. }
复制代码
1. 这个函数用于给q31_t类型的数据提供保护位,防止溢出。从函数的实现上看,保护位的实现是通过右移数据实现的。
: h" [6 l; ?6 f- k) `
22.1.6 arm_float_to_q14
  1. /** ; O+ @! g. {) D$ d9 {7 e
  2. * @brief  Converts float to fixed q14 ' ^4 Q3 O# O5 n7 u  g0 z  J- x
  3. * @param  uint32_t         number of samples in the buffer# w3 h; r! r! _+ C3 Y3 @- Q
  4. * @return none
    4 u- {) V3 A9 k. g1 H% k% [5 I; Q' Q
  5. * The function converts floating point values to fixed point values
    2 C% \, b) D  I$ A3 @
  6. */* N0 \1 `% r5 b1 b  I, [1 p1 i
  7. 4 x1 a6 ~! B, Y/ w5 z; R$ T
  8. void arm_float_to_q14 (float *pIn, q15_t * pOut,
    - q' P6 H, n. a3 W# g1 B3 u- D
  9.                        uint32_t numSamples)
    % U9 I, z2 t1 A7 K5 E& Q8 M
  10. {: O1 `3 _2 h' F2 v; s% }9 @5 T
  11.   uint32_t i;1 s! G" `% S# Y2 X% o% c6 D1 h

  12. 0 a( Z5 f7 p9 O$ a& U1 Y
  13.   for (i = 0; i < numSamples; i++)
    & T0 G) \% k7 s) l
  14.     {) Q. G! ?* M5 m* I8 c: v
  15.   /* 16384.0f corresponds to pow(2, 14) */& Y3 L) c9 a) ^7 b7 e
  16.       pOut[i] = (q15_t) (pIn[i] * 16384.0f);/ c) w' N- B, N2 o. ]8 q1 L
  17. 7 R  K& H+ ^. K' Z& A
  18.       pOut[i] += pIn[i] > 0 ? 0.5 : -0.5;9 c. W# n  f* ~3 ~! X6 B, d  Q

  19. $ h9 W$ g/ l' h
  20.       if (pIn[i] == (float) 2.0)
    & P& H4 w4 h6 {5 U/ V
  21.         {* C6 t( G. x% C0 c6 X9 k- b- a1 H
  22.           pOut[i] = 0x7FFF;
    " F; i4 Y1 h  \# M; B" L
  23.         }
    1 {; X, T. ^$ w+ S

  24. ! ^+ a# P4 e$ M! H
  25.     }
    3 v% H9 E. n9 o  a1 N

  26. - f8 u& M* t( F, R
  27. }
复制代码
1. 这个函数用于将浮点数转换成Q14格式的数据。
2. 浮点数转换成Q14格式需要乘以2^14,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。
) \  ^8 }# e" w9 X; ?
赞 收藏 评论2 发布时间:2015-4-3 11:30

举报

2个回答
baiyongbin2009 回答时间:2015-4-3 11:31:10
22.1.7 arm_float_to_q30
  1. /** + k7 p) n% \- q) K3 E* x$ q
  2. * @brief Converts float to fixed q30 format
    + ^  w" v6 j& z
  3. * @param uint32_t number of samples in the buffer
    6 L% {& L% S. a: A+ ~* p/ H, i
  4. * @return none$ ^% p& a1 s6 C; R
  5. * The function converts floating point values to fixed point values
    ; n- P/ p9 Q* g& E; a
  6. */
    , u, g0 S* K8 {' v% J" A

  7. 0 x5 J9 ~$ y$ |' C9 U6 j- k8 }
  8. void arm_float_to_q29 (float *pIn, q31_t * pOut, : ]9 b+ \4 \( V1 J9 Z
  9. uint32_t numSamples)6 \6 C4 w/ o6 z; l1 S
  10. {
    ; R: L/ C3 o6 F8 A0 _% c: h8 j
  11. uint32_t i;
    + {5 n9 @, f, Q( O& u5 \$ }; ~

  12. % }1 {, B+ N2 r  W
  13. for (i = 0; i < numSamples; i++)
    7 B5 H1 U/ B+ L( {: |' [! n% z
  14. {
    2 C' t* t1 T, j# E
  15. /* 1073741824.0f corresponds to pow(2, 30) */
    # _2 m" \1 x( G2 E( y) o0 c6 b
  16. pOut[i] = (q31_t) (pIn[i] * 536870912.0f);) P3 N6 k9 L3 `  H( ~. ]+ `$ q/ i

  17. 3 a4 K% F2 C+ f7 ^' r3 o4 ]
  18. pOut[i] += pIn[i] > 0 ? 0.5 : -0.5;
    % E, e9 F! r5 a' T) b; ^: ]! g
  19. 4 b# o. [" l  J% ^, \. X
  20. if (pIn[i] == (float) 4.0)0 Y0 i1 n$ \. q' S: L
  21. {2 Y' J1 L, n2 t3 i  B3 A
  22. pOut[i] = 0x7FFFFFFF;
    9 D: M* {3 P6 O  B: n
  23. }8 I& [" I# [$ j  L! t. [& b6 ]) s
  24. }: }# V$ r: Y) W
  25. }
复制代码
1. 这个函数用于将浮点数转换成Q30格式的数据。
2. 浮点数转换成Q30格式需要乘以2^30,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。

# g9 ^) ~- Z' G( O- K) T
22.1.8 arm_calc_guard_bits
  1. /**
    ' l9 u9 k7 L/ g
  2. * @brief Caluclates number of guard bits 6 E; L% C  K+ [# Z  A
  3. * @param uint32_t number of additions$ X6 N1 X3 u( R) P8 K& ^
  4. * @return none
    % c* ^' A- L5 \
  5. * The function Caluclates the number of guard bits
    & c( e- |* P& X* {1 W
  6. * depending on the numtaps % i- t4 |! z4 y  P" C. i! L! C
  7. */
    * k0 f( P/ i1 S# ^2 k' m6 c
  8. - b0 L. W) Y; k. x5 d1 ~+ U* H
  9. uint32_t arm_calc_guard_bits (uint32_t num_adds)# i! c2 \' u1 k6 T& V. g  R$ ]
  10. {" H7 g, z% q" D' b: R; |1 l
  11. uint32_t i = 1, j = 0;
    $ M- C8 ?' l$ I# ?4 i
  12. & F# e7 d* D; t( h
  13. if (num_adds == 1)
      a0 z  K7 g+ G2 _/ G+ u1 y  E* h
  14. {
    8 p% }0 H$ S1 c6 f: i
  15. return (0);
    ! F1 a& N6 U' q
  16. }% \8 b+ m# Q6 z

  17. : _& ^% m/ l* p7 q3 O7 p3 o
  18. while (i < num_adds)
    & K0 X* C+ S6 K4 G
  19. {
    6 ]# y$ Z. H4 K% P
  20. i = i * 2;3 W/ t; Y! `: C  C) Q" s" h
  21. j++;! H" q, [$ W* G# q: L) n% h0 K
  22. }! N; {- f3 X  S
  23. ) k% \* t" o% l; e! x2 i7 k5 n
  24. return (j);
    " f9 k8 {( I2 V8 _; k3 N* K
  25. }
复制代码
1. 这个函数是根据加数的个数来计算最终结果需要的保护位格式,从而防止溢出。

7 R/ x* ?! x6 ^' N6 u: ^
22.1.9 arm_apply_guard_bits
  1. /**   z5 g5 ]* f+ K+ u6 i
  2. * @brief Converts Q15 to floating-point2 [- Q5 a: E$ E: Q
  3. * @param uint32_t number of samples in the buffer
    ) s5 f1 |4 g% c0 p4 V- j6 G
  4. * @return none. L, t& n$ L5 m; M
  5. */
    9 Y3 [1 q% A7 ?; |

  6. / a  ^4 J4 l" i3 e" H* W
  7. void arm_apply_guard_bits (float32_t * pIn, + E6 F5 ~, s# _6 u5 u, F
  8. uint32_t numSamples,
    3 Y4 j9 X4 `* R; x2 b) N, g& X
  9. uint32_t guard_bits)$ }) H+ H9 w" C& X; @+ S9 |
  10. {+ I7 d( ]6 u. U# d/ t
  11. uint32_t i;
    ; y# Z4 ?' N4 {" z4 B0 n
  12. $ i3 U% ?4 \3 i& E
  13. for (i = 0; i < numSamples; i++)
    * o5 k, g$ @4 f( R- a3 o6 [
  14. {
    " }0 t$ G$ Y. T9 N, }
  15. pIn[i] = pIn[i] * arm_calc_2pow(guard_bits);/ {2 P8 [9 K1 r6 R% {, e0 X
  16. }
    # v, M( J" ]; x- O. z) m, B0 y
  17. }
复制代码
1. 这个函数不是很理解在实际应用中的作用。
! @/ t% A6 J2 v6 {
22.1.10 arm_calc_2pow
  1. /** % ?5 A; U: t, n! k. c. ^% U- P
  2. * @brief Calculates pow(2, numShifts)
    5 n, d% F1 O. ?+ {5 i- o6 |' x- s
  3. * @param uint32_t number of shifts
      @' L! \& R2 }
  4. * @return pow(2, numShifts)4 `9 V4 a' I4 R0 q/ f& }
  5. */. r) a/ _# C2 T9 \
  6. uint32_t arm_calc_2pow(uint32_t numShifts)
    6 m3 L" f. {9 M0 w8 R  X
  7. {
    $ B0 q6 x3 a# P) E0 U
  8. % `( c: }. j1 M4 E' b* W4 l8 y, b
  9. uint32_t i, val = 1;4 R1 K; R: {( d9 I9 k

  10. ( c6 i& p: e$ r5 w
  11. for (i = 0; i < numShifts; i++)0 q: v$ o' c$ j& A
  12. {
    ' K- p$ o+ T9 X% \. [! [
  13. val = val * 2;
    / a* r  T! q9 a( g
  14. }1 z* I, e$ P3 [

  15. 1 ]  h6 X) F2 \; r" d8 b  j  e- f; A( w
  16. return(val);2 z6 j$ L+ R4 z! T# \
  17. }
复制代码
1. 这个函数用于求解2的n次方。
- a$ r/ ?9 e1 C+ t$ a
22.1.11 arm_compare_fixed_q15
  1. /**
    1 I2 P3 G8 j6 Y& T, S
  2. * @brief Compare MATLAB Reference Output and ARM Test output
      \! o2 j$ H$ E9 [. V
  3. * @param q15_t* Pointer to Ref buffer
    4 J8 L7 I; Z$ z. z3 ^
  4. * @param q15_t* Pointer to Test buffer; h% o  d3 y" K( n
  5. * @param uint32_t number of samples in the buffer
    % v- a. ?3 m  A1 l- l/ ?
  6. * @return none 1 y. k0 o0 m! Q: O$ q+ ?" u
  7. */2 t' f" T7 T- f. _
  8. 8 x8 V7 h  i0 ^8 v4 Q4 N
  9. uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples). Z& i% B( t+ r7 K  C3 D: Z
  10. {" b3 \/ G7 i; w5 Z0 w; V
  11. uint32_t i;
    + p* {' a" ]' @) p& p  X& t
  12. int32_t diff, diffCrnt = 0;/ n/ O! x9 {# i/ f- Q2 Z$ O
  13. uint32_t maxDiff = 0;
    6 a+ }7 \8 C' f/ U8 c3 P
  14. 9 v/ {9 q' c' v7 _2 ^2 L# z
  15. for (i = 0; i < numSamples; i++)- o$ B* i1 _) `2 h8 {) I6 ]5 l
  16. {6 |& L1 V- s0 l4 `) q
  17. diff = pIn[i] - pOut[i];
      o* l% }7 \5 r, I. O! ~2 K  D7 R
  18. diffCrnt = (diff > 0) ? diff : -diff;
    5 `: d2 n9 H- G- D% r6 _+ y/ v. e5 O
  19. ( E) f: I  e: l: L# T0 G& l* S
  20. if(diffCrnt > maxDiff)3 p6 R- m9 }" O( Z( c6 B+ P1 p. w
  21. {3 V3 g0 i/ z+ g8 B' k
  22. maxDiff = diffCrnt;
    $ r  E% T& Y/ ]
  23. }
    ! z( E$ M  b0 N. ]1 @0 ]# E
  24. }4 m8 k9 D; x: I+ B6 A

  25. 4 M3 l% V: Z+ _3 r  S
  26. return(maxDiff);  K% g) K$ E- o
  27. }
复制代码
1. 这个函数用于对比matlab和ARM实际计算的输出,并返回最大的差值(Q15)。

" j) f( L; C# K8 _+ d) `0 ~# T
22.1.12 arm_compare_fixed_q15
  1. /**
    % f; n$ a, s# E; ^. i0 T" o  j
  2. * @brief Compare MATLAB Reference Output and ARM Test output# i: {. ~( D# _
  3. * @param q31_t* Pointer to Ref buffer% V4 i. c9 I% s9 _( H4 w' s
  4. * @param q31_t* Pointer to Test buffer2 A" }2 `! b! @8 i6 [- m/ r
  5. * @param uint32_t number of samples in the buffer
    0 Q* S6 [) a3 w8 S
  6. * @return none
    & W9 g# Q0 i; K8 e' ~
  7. */6 y2 z9 T. u6 o1 m, {. \( K
  8. " x6 b* i# g) Z8 X; _7 E% e8 M, n9 t
  9. uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples)
    ' }! e' l- L! m, K" I" K
  10. {
    & u& J2 b) A# ^: Q1 X  C9 z
  11. uint32_t i; 7 ^& v, n9 I- a, d" l$ ^
  12. int32_t diff, diffCrnt = 0;( p* z; f4 N7 w5 @' Y7 W
  13. uint32_t maxDiff = 0;6 v6 a( O- S+ j. F3 Z* W

  14. ! ~/ j9 X  k2 K' T0 U
  15. for (i = 0; i < numSamples; i++)
    ' ~' C5 }, K/ m/ j# r
  16. {4 `1 p& f2 i% j: g- i
  17. diff = pIn[i] - pOut[i];
    ' M' ^3 }0 H  s1 {+ h5 s0 p
  18. diffCrnt = (diff > 0) ? diff : -diff;
    " ^3 J( Z3 s/ i0 o3 c% k

  19. - b! e1 n5 ]. Y# B7 q( F9 V
  20. if(diffCrnt > maxDiff)/ h0 e5 D; V- a6 G$ T
  21. {1 N3 f' ^0 G! A0 C
  22. maxDiff = diffCrnt;, P+ {1 |. k" ]" z+ C0 l3 Q
  23. }% d$ {$ K* O) p: w( a
  24. }
    8 e0 ?( S- K& z* [

  25. & z0 ^" ]( M4 P! v) p0 [' _
  26. return(maxDiff);
    1 A' r$ {: }- k1 S: T: A% f
  27. }
复制代码
1. 这个函数用于对比matlab和ARM实际计算的输出,并返回最大的差值(Q31)。

" C2 a/ I3 G  j* J22.2
总结
    本期教程就跟大家讲这么多,本期教程就不配套例子了,这些函数会在后面的应用中都用到。

/ Y, ]* D" [' c5 N8 m9 V
nocoyou 回答时间:2015-4-3 13:47:42
纯粹路过
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版