特别说明:完整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 C22.1.1 函数目录 在文件math_help文件中主要有以下函数: - float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize);
5 l4 K0 @0 A( {: x - void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples);1 c3 A: X I: U- s
- void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits);
( J: b# N* W* a$ N - void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits);) {+ B, L' U5 F: h7 y5 P
- void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples);
% s1 I5 Q7 e) B9 }+ ^ - void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples);
' Y5 z- p. O7 C! A - void arm_clip_f32(float *pIn, uint32_t numSamples);- `4 A2 }: r0 L
- uint32_t arm_calc_guard_bits(uint32_t num_adds);
. x. L) q) f' ] - void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits);- e, i; f' k: S9 J, ?, h; ?- a
- 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
- uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples);: g; J9 A5 u: A7 p; q) J6 c
- uint32_t arm_calc_2pow(uint32_t guard_bits);
复制代码
+ @ ]# L, A+ F22.1.2 arm_snr_f32 这个函数用于求信噪比: - /** (1)+ ^ \0 i& S; |5 s& b0 J, o9 d5 u- Y
- * @brief Caluclation of SNR( d/ r; C" Q1 z H+ Y8 X8 x
- * @param float* Pointer to the reference buffer
" |$ @/ R5 h, }4 ` - * @param float* Pointer to the test buffer! e! Y# s/ _8 j# l9 {5 K( X. `: {7 d
- * @param uint32_t total number of samples! p8 W& b9 h9 {( b: d; ~2 m! Z
- * @return float SNR
1 t# f% n+ Y3 @# m - * The function Caluclates signal to noise ratio for the reference output
$ I7 ]. h( f. X, w0 D- C - * and test output
w- s6 j* p% i6 E% B - */
/ ?9 f$ K% D; F* Z - 1 p* Y$ g+ Y/ i
- float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize)* H/ l, j1 }: x. A! G7 O
- {9 F4 W6 \# {' _0 {! g6 ~2 x
- float EnergySignal = 0.0, EnergyError = 0.0;6 E7 b( M' N( v
- uint32_t i;1 R; p# S% K8 T8 G
- float SNR;
( X7 z' Q O! J! t+ J9 X - int temp;
: U9 S" R1 L8 P6 g: c$ B8 j - int *test;# U! C, E# s; ~ a- B, E
-
$ s m* T7 i+ r! a2 J: ^8 P8 B, J - for (i = 0; i < buffSize; i++)" ~ }7 }7 O' w9 X8 P, B
- {2 L, `$ L# [3 e! f. F* s* E
- /* Checking for a NAN value in pRef array */
* Z' p& n+ f& d3 q) |. a - test = (int *)(&pRef[i]);+ S( |+ ?* F& `
- temp = *test;
2 a* F& C6 w: U. i* p/ f - % J/ V$ w0 v8 k' w, r2 _. R q
- if(temp == 0x7FC00000)
; k5 L. e! q9 ]# p - {& |/ S4 Z8 Z: h5 n7 l3 g* _
- return(0);# }0 @ u( ]% ~) m
- }
2 Y6 U6 F/ I" s! K1 b0 u -
, C" w4 }/ J8 x5 U( g1 d% l1 f4 t - /* Checking for a NAN value in pTest array */
. Z* ^9 ^! }8 [ - test = (int *)(&pTest[i]);' k2 w6 B; B2 }/ |
- temp = *test;
s) U' z# c T9 f3 r/ l - 1 u# H2 L6 r5 t3 B& C9 Q( o, b
- if(temp == 0x7FC00000)
& z# M3 r3 g9 n' e: r0 V - {
8 F* N! P( I6 S0 {5 C - return(0);
1 p' N; S4 h: t# v4 ~- j; j - }* E! ~' q5 A0 r' L2 t
- EnergySignal += pRef[i] * pRef[i];
# d) u$ B) n$ f+ o/ W- l/ U9 W - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); 8 S8 B* h' Q/ s
- }
4 v1 G& k% H0 o - 3 _( ^% j: r! X! G
- /* Checking for a NAN value in EnergyError */
3 T. V; v. x/ O$ A. { - test = (int *)(&EnergyError);
; M0 b5 k1 _, d% ]6 Q - temp = *test;9 n5 q4 r( L2 T
-
3 I d- A/ ?4 _% J! m, \: V9 t$ [ - if(temp == 0x7FC00000)
2 u9 G7 d3 V: M3 H) U( [+ i - {
# O/ T. z u0 y6 H; Z; O5 g5 a R - return(0);! h+ D, N1 _2 n# |
- }
; G; ]" m/ _+ ^+ ~7 r - e; f: v \6 ?+ f1 }$ s9 d
- SNR = 10 * log10 (EnergySignal / EnergyError); (2)
$ H7 H3 D6 d# ~- k - 4 L$ R. ~7 ^3 |; B0 q7 {
- return (SNR);
$ P: a5 U' N$ S" b -
8 H! t4 i/ N# E) I* T7 J - }
复制代码1. 这里先补充一些信噪比方面的基础知识: 信噪比,即SNR(Signal to Noise Ratio),又称为讯噪比。反映摄像机成像的抗干扰能力,反应在画质上就是画面是否干净无噪点;狭义来讲是指 放大器的输出 信号的功率与同时输出的 噪声功率的比,常常用分贝数表示,设备的信噪比越高表明它产生的杂音越少。一般来说,信噪比越大,说明混在 信号里的噪声越小,声音回放的音质量越高,否则相反。信噪比一般不应该低于70dB,高保真 音箱的信噪比应达到110dB以上。公式如下:
3 i+ K; ~ o! v0 {! s4 k 关于信噪比更详细的知识,大家可以查阅相关资料进行了解。 2. 这里实现的就是上面所说的信噪比公式。 ; j+ N- N, }) D
22.1.3 arm_float_to_q12_20- /**
( d+ G) i! }6 M0 |" C1 n }/ ^ - * @brief Converts float to fixed in q12.20 format (1)7 w) m, \5 P5 y
- * @param uint32_t number of samples in the buffer
5 V% c; E) J0 E3 Y - * @return none4 F4 L, m [! x/ j9 g
- * The function converts floating point values to fixed point(q12.20) values
& X. G# ^* Y6 y$ |& u# x/ a - */
* Z" {9 X, y: H - ( V9 ]0 g7 }! k, m( m
- void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples)) |. r: g8 R5 F- J
- {
. Z$ q* x# ~" @9 J- M s7 M - uint32_t i;
9 C* O7 A# i5 B q - / t0 I" T0 Z( O
- for (i = 0; i < numSamples; i++)3 ~# {4 N7 l8 Y" F; G& O9 _) K
- {
( b* {" `2 Q8 |' I5 q - /* 1048576.0f corresponds to pow(2, 20) */
; ]. |' o& Y9 U7 L) \# i - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); (2)
' a2 H* D% `8 C - 3 |+ ^( d" @7 J& x0 q
- pOut[i] += pIn[i] > 0 ? 0.5 : -0.5;
, p+ u9 j) N2 \" h -
2 D: R# J* g }' W ? - if (pIn[i] == (float) 1.0); _+ K0 p0 R7 S* M' O+ d8 p
- {
) m2 R# m* }* e% o - pOut[i] = 0x000FFFFF;
8 Z9 l" G& {' `- v e1 ? - }
" b% Z% y% m) u. d( ` - }9 ~! d2 ?/ @- E9 y
- }
复制代码1. 这个函数用于将浮点数转换成Q12.20格式的数据。 2. 浮点数转换成Q12.20格式需要乘以2^20,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。
' D& M4 u. h v* H! H1 X22.1.4 arm_provide_guard_bits_q15- /**
6 a+ W& Q3 m7 H8 V/ M - * @brief Provide guard bits for Input buffer
+ B) t8 X8 }/ ]9 b) R - * @param q15_t* Pointer to input buffer
* p9 |4 r% X8 p - * @param uint32_t blockSize V3 f4 P3 d9 s _
- * @param uint32_t guard_bits! v( G* L: P# u7 H2 S) A7 w- Y
- * @return none8 P1 o3 d; w y! R1 p
- * The function Provides the guard bits for the buffer
& [& Q: u# o+ q - * to avoid overflow
1 d# g k% ?* t - */
+ e% A, I F T" H. Y - ! h* `, k$ C% E: q
- void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize,4 o8 {# I5 M& r$ W, B, J# _
- uint32_t guard_bits)
: y; J' T; \, X& K - {! e6 ~- j y+ T: ^
- uint32_t i;1 @( J; o/ @# u, t7 q9 E
- / x; A( {/ x7 m/ N* y4 B& M6 x5 |- X
- for (i = 0; i < blockSize; i++)
. q$ b$ t& o) g7 L+ U3 M - {/ L5 J" I+ Z7 q/ G' t& o, a
- input_buf[i] = input_buf[i] >> guard_bits;4 C2 L6 {- a$ ^; z. \" z
- }
$ ^2 p) F; O, V& X0 f' }, g - }
复制代码1. 这个函数用于给q15_t类型的数据提供保护位,防止溢出。从函数的实现上看,保护位的实现是通过右移数据实现的。 " ~5 Y. L6 e+ |. V+ ~. B- d
22.1.5 arm_provide_guard_bits_q31- /**
7 ]- W3 |* o8 D4 Y) ]' Q5 i - * @brief Provide guard bits for Input buffer& i5 F2 c7 g+ v5 l' w+ S' s0 v
- * @param q31_t* Pointer to input buffer
( g% _" R7 G% N' f! q% k7 B) R - * @param uint32_t blockSize
7 w, F# u' ~( u - * @param uint32_t guard_bits
9 a) ^) k/ u. B* `; y5 f1 v$ H - * @return none( h" [9 e- j5 n/ w
- * The function Provides the guard bits for the buffer
$ s! L ]* T7 e2 ~ - * to avoid overflow , W* ^8 U1 E/ B
- */
: v0 ]: f9 e, m! O2 D - . J' P4 m( h7 [8 p, k
- void arm_provide_guard_bits_q31 (q31_t * input_buf, 3 ?: m6 p& k8 q. w9 a D) P- j
- uint32_t blockSize,% N( g% E* e: W& i2 S0 S( B
- uint32_t guard_bits)& a2 m8 G% V; U& n$ I+ h
- {) u' r$ z4 L$ }) M' a1 T' f
- uint32_t i;; J1 {4 U4 Z9 I0 p/ T1 W/ Z' ^
-
P. S; d5 f# D, v( ^ - for (i = 0; i < blockSize; i++)
; D9 m- j5 e; S) v( N g T - {+ p: f" r5 R, O. `
- input_buf[i] = input_buf[i] >> guard_bits;
' _, ^+ C) |. Y- r8 M - }4 G: p. _8 L6 ^2 C- e$ d
- }
复制代码1. 这个函数用于给q31_t类型的数据提供保护位,防止溢出。从函数的实现上看,保护位的实现是通过右移数据实现的。 : h" [6 l; ?6 f- k) `
22.1.6 arm_float_to_q14- /** ; O+ @! g. {) D$ d9 {7 e
- * @brief Converts float to fixed q14 ' ^4 Q3 O# O5 n7 u g0 z J- x
- * @param uint32_t number of samples in the buffer# w3 h; r! r! _+ C3 Y3 @- Q
- * @return none
4 u- {) V3 A9 k. g1 H% k% [5 I; Q' Q - * The function converts floating point values to fixed point values
2 C% \, b) D I$ A3 @ - */* N0 \1 `% r5 b1 b I, [1 p1 i
- 4 x1 a6 ~! B, Y/ w5 z; R$ T
- void arm_float_to_q14 (float *pIn, q15_t * pOut,
- q' P6 H, n. a3 W# g1 B3 u- D - uint32_t numSamples)
% U9 I, z2 t1 A7 K5 E& Q8 M - {: O1 `3 _2 h' F2 v; s% }9 @5 T
- uint32_t i;1 s! G" `% S# Y2 X% o% c6 D1 h
-
0 a( Z5 f7 p9 O$ a& U1 Y - for (i = 0; i < numSamples; i++)
& T0 G) \% k7 s) l - {) Q. G! ?* M5 m* I8 c: v
- /* 16384.0f corresponds to pow(2, 14) */& Y3 L) c9 a) ^7 b7 e
- pOut[i] = (q15_t) (pIn[i] * 16384.0f);/ c) w' N- B, N2 o. ]8 q1 L
- 7 R K& H+ ^. K' Z& A
- pOut[i] += pIn[i] > 0 ? 0.5 : -0.5;9 c. W# n f* ~3 ~! X6 B, d Q
-
$ h9 W$ g/ l' h - if (pIn[i] == (float) 2.0)
& P& H4 w4 h6 {5 U/ V - {* C6 t( G. x% C0 c6 X9 k- b- a1 H
- pOut[i] = 0x7FFF;
" F; i4 Y1 h \# M; B" L - }
1 {; X, T. ^$ w+ S -
! ^+ a# P4 e$ M! H - }
3 v% H9 E. n9 o a1 N -
- f8 u& M* t( F, R - }
复制代码1. 这个函数用于将浮点数转换成Q14格式的数据。 2. 浮点数转换成Q14格式需要乘以2^14,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。 ) \ ^8 }# e" w9 X; ?
|
22.1.8 arm_calc_guard_bits
22.1.9 arm_apply_guard_bits
22.1.10 arm_calc_2pow
22.1.11 arm_compare_fixed_q15
22.1.12 arm_compare_fixed_q15
22.2 总结