特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
8 q( I) S6 n! T# c第20章 MatrixFunctions的使用(二)
9 i5 _' |3 v2 L+ Z# A' j+ h2 z 本期教程主要讲解矩阵运算中的放缩,乘法和转置。 20.1 矩阵放缩 MatScale 20.2 矩阵乘法 MatMult 20.3 转置矩阵 MatTrans 20.4 总结 , z8 t5 N# p ]& n
20.1 矩阵放缩 MatScale- V P7 N$ J4 [$ k; }
- ^) G# R% k+ H20.1.1 arm_mat_scale_f32公式描述: 函数定义如下: arm_status arm_mat_scale_f32( const arm_matrix_instance_f32 * pSrc, float32_t scale, arm_matrix_instance_f32 * pDst) 参数定义: [in] *pSrc points to input matrix structure [in] scale scale factor to be applied [out] *pDst points to output matrix structure return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> ) A' g. m: x" v( ?% N: R
20.1.2 arm_mat_scale_q31函数定义如下: arm_status arm_mat_scale_q31( const arm_matrix_instance_q31 * pSrc, q31_t scaleFract, int32_t shift, arm_matrix_instance_q31 * pDst) 参数定义: [in] *pSrc points to input matrix [in] scaleFract fractional portion of the scale factor [in] shift number of bits to shift the result by [out] *pDst points to output matrix structure return The function returns either 注意事项: 1. 两个1.31格式的数据相乘产生2.62格式的数据,最终结果要做偏移和饱和运算产生1.31格式数据。 2. 定点数的最终放缩比例计算是:scale = scaleFract * 2^shift. / |" T0 c3 J5 s4 M0 H
20.1.3 arm_mat_scale_q15函数定义如下: arm_status arm_mat_scale_q15( const arm_matrix_instance_q15 * pSrc, q15_t scaleFract, int32_t shift, arm_matrix_instance_q15 * pDst) 参数定义: [in,out] *S points to an instance of the floating-point matrix structure. [in] nRows number of rows in the matrix. [in] nColumns number of columns in the matrix. [in] *pData points to the matrix data array. 注意事项: 1. 两个1.15格式的数据相乘产生2.30格式的数据,最终结果要做偏移和饱和运算产生1.15格式数据。 2. 定点数的最终放缩比例计算是:scale = scaleFract * 2^shift. # P( b/ I+ s) [
20.1.4 实例讲解实验目的: 1. 学习MatrixFunctions中矩阵的放缩 实验内容: 1. 按下按键K1, 串口打印函数DSP_MatScale的输出结果 实验现象: 通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下: 程序设计: - /*7 G8 _* t3 N: {
- *********************************************************************************************************! C: A: h* a5 i0 H8 ?
- * 函 数 名: DSP_MatScale4 Y8 e, r1 a! P& Z4 x, M% d- T
- * 功能说明: 矩阵放缩% N* F+ o; g5 T8 t! U- O8 o
- * 形 参:无) D! n8 L0 e8 d4 ^% w: g
- * 返 回 值: 无* z$ i: u+ j) y: r) X# N
- *********************************************************************************************************; l. I8 R9 Q9 }) }* j
- */8 q$ Y% x& t) `: {' S# j+ R
- static void DSP_MatScale(void)# t g B2 z: B; r8 e* Y
- {
- ]7 ~6 G0 @1 i3 r- F/ O5 S/ b' d$ n& e" K - uint8_t i;0 k y' ]8 V3 u3 F+ W, B+ Z
- /****浮点数数组******************************************************************/
2 m- e4 d, j9 m6 y) P/ ?6 v - float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};' k0 Y3 W5 P6 y# C2 t7 Q; R
- float32_t scale = 1.1f;
5 N! w% ?7 [- H7 ^5 l - float32_t pDataDst[9];' J- g% ~/ Q; f' c& B: V
- arm_matrix_instance_f32 pSrcA; //3行3列数据
0 f7 v2 `6 g2 I% U9 F8 C - arm_matrix_instance_f32 pDst;
5 ^- X) P! Q# O; ?, ] - /****定点数Q31数组******************************************************************/
% A4 m: y$ a7 G - q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
- [4 D0 n$ U6 c: A* F1 o4 p l. h - q31_t scaleFract = 10;
J' i0 X2 V# H( E2 f( x! a; k0 m - int32_t shift = 0;4 q2 v* n$ T$ X) D
- q31_t pDataDst1[9];* U0 }7 q$ O& v( D
- arm_matrix_instance_q31 pSrcA1; //3行3列数据( S6 U8 C( e1 e3 `. v( e4 i
- arm_matrix_instance_q31 pDst1;" ^- r: S/ U* k e1 r" a; R8 J
- /****定点数Q15数组******************************************************************/
9 b) Z0 R1 p% L6 } - q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
2 M: y; A" r8 g: ~9 U - q15_t scaleFract1 = 10;
6 d3 `) u, ~# N4 v! X - int32_t shift1 = 0;
0 m8 ` M; Q* L( J$ b - q15_t pDataDst2[9]; Q: c- Q1 d. T+ [ q( r
- arm_matrix_instance_q15 pSrcA2; //3行3列数据9 e. A1 B6 O0 r; q
- arm_matrix_instance_q15 pDst2;
8 u, Y; d; u. W N, W, K - /****浮点数***********************************************************************/( p0 G3 T+ b( ?& [' i7 {
- pSrcA.numCols = 3;
0 Q; ?- I2 Y/ V! ` - pSrcA.numRows = 3;# E, n' b! W+ Q( Y3 F; L! {
- pSrcA.pData = pDataA;
5 Q" f4 e% E& ~ _; N - 7 g: b3 a4 q% _: ?% G( {
- pDst.numCols = 3;
3 l- H3 }# F: }$ h - pDst.numRows = 3;; _9 A4 j( |" x1 @3 H
- pDst.pData = pDataDst;
) j; U0 d* `! c! d( B - printf("****浮点数******************************************\r\n");
- u m- L- Q; N - arm_mat_scale_f32(&pSrcA, scale, &pDst);
) a& O: C4 W# K- T2 M# ]( Q* y" o - for(i = 0; i < 9; i++)1 @( t+ Q5 o: V# V
- {
$ G3 W% W" N5 ^. J - printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
- A0 ^ s) k0 T. I# F) P& @ - }+ W4 A7 N' m l' |3 ?5 B; z: `2 w
- /****定点数Q31***********************************************************************/
, s0 N: {7 z' Y2 d5 x5 l - pSrcA1.numCols = 3;/ g+ W) m+ i1 u8 i
- pSrcA1.numRows = 3;! [5 C$ I$ ~3 c
- pSrcA1.pData = pDataA1;
0 z$ q' `0 C/ v; u - pDst1.numCols = 3;
1 l" N+ k" F) e - pDst1.numRows = 3;
, O: I3 h9 K4 \4 c/ O5 R - pDst1.pData = pDataDst1;& \0 e: s) ^ F3 {9 q9 ?/ P- c
- printf("****定点数Q31******************************************\r\n");
) C4 X6 L1 J. L - arm_mat_scale_q31(&pSrcA1, scaleFract, shift, &pDst1);; Q! S* A: q4 c
- for(i = 0; i < 9; i++)
" X1 [- s; F3 |/ S- W, [$ M0 l5 b - {2 {! e( r& s( p5 |/ c+ ]
- printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
! e3 i, [2 ^! @2 P - }3 P' Y8 {) P+ O Z( Z
- /****定点数Q15***********************************************************************/0 W1 I2 n$ y' v! k/ G! z
- pSrcA2.numCols = 3;9 Q! }# j% a" A, p
- pSrcA2.numRows = 3;9 U F- }# V* Q1 Y, J- ~
- pSrcA2.pData = pDataA2;
( {' `. }" M7 l8 t5 J* {2 I1 m0 w - pDst2.numCols = 3;
2 m" D+ q2 S* Z - pDst2.numRows = 3;
7 o5 C4 r$ H. U8 F2 {( v$ v - pDst2.pData = pDataDst2;# m+ R7 S, ^7 D
- printf("****定点数Q15******************************************\r\n");
9 E) ?4 t# ^: T( o7 ~% S% L( z1 k - arm_mat_scale_q15(&pSrcA2, scaleFract1, shift1, &pDst2);
b( b* F) ]" d7 r9 H - for(i = 0; i < 9; i++). L) ?) D$ L: i/ P
- {
2 y ?* m: o6 x E4 t1 { - printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);; D8 H% `5 V8 m5 Z9 L
- }
/ k2 u h) g @, z, ~1 Y+ g - }
复制代码1. 下面通过matlab来实现矩阵的放缩:
" n, J7 j6 Y; k e1 C
% O0 s8 c1 {0 S# o% ? |
20.2.1 arm_mat_mult_f32
20.2.2 arm_mat_mult_q31
20.2.3 arm_mat_mult_q15
20.2.4 arm_mat_mult_fast_q31
20.2.5 arm_mat_mult_fast_q15
20.2.6 实例讲解
20.3.1 arm_mat_trans_f32
20.3.2 arm_mat_trans_q31
20.3.3 arm_mat_trans_q15
20.3.4 实例讲解