特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
, M; \1 s7 v: Q$ @& \4 _第20章 MatrixFunctions的使用(二) / U. H0 b8 c5 z% u5 D
本期教程主要讲解矩阵运算中的放缩,乘法和转置。 20.1 矩阵放缩 MatScale 20.2 矩阵乘法 MatMult 20.3 转置矩阵 MatTrans 20.4 总结
; M2 D ] i1 W- V0 A20.1 矩阵放缩 MatScale
2 o1 ]+ Y% _& F1 g
5 _ p* h+ k- o1 {1 i+ @* x20.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> * q* W0 E) m, a
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.
/ J3 L( M G) f5 z! L" w' M20.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. ( Q' a/ B* K% Q6 G
20.1.4 实例讲解实验目的: 1. 学习MatrixFunctions中矩阵的放缩 实验内容: 1. 按下按键K1, 串口打印函数DSP_MatScale的输出结果 实验现象: 通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下: 程序设计: - /*$ K3 y7 q& ~$ D3 L( J: Q$ X' r
- *********************************************************************************************************7 R) H. n/ X' m7 C/ A
- * 函 数 名: DSP_MatScale
- g6 k; b( O+ u. J - * 功能说明: 矩阵放缩# o3 N8 f5 V: s2 `
- * 形 参:无
/ R. r) g6 c; ?% v - * 返 回 值: 无
7 G$ T& G9 J" `" i9 W \ - *********************************************************************************************************
# K( k8 c: A3 o* [8 t/ I - */; Y' ^# c" I/ P0 e5 a1 O% P# S! e$ {
- static void DSP_MatScale(void)
# A: y+ R+ s( e4 ~% f9 k - {) h+ P9 i& N% y. U
- uint8_t i;
, ]4 K! |: ]/ q - /****浮点数数组******************************************************************/& A2 b* S. Q# T: q0 y8 `
- float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};/ T# M4 r3 }- J- @# S* O% L7 K
- float32_t scale = 1.1f;
p: }) o8 {- i2 X y) a - float32_t pDataDst[9];8 i. m, z' {4 c+ \2 ?
- arm_matrix_instance_f32 pSrcA; //3行3列数据. W# m _8 D8 y# Q. j% `( O
- arm_matrix_instance_f32 pDst;
5 s, x( Y u& ^7 {$ W# ]6 r5 s - /****定点数Q31数组******************************************************************/( I3 P. n, T* ]! A
- q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};; x9 q9 E/ p/ e
- q31_t scaleFract = 10;" ]" e# n' c# b1 b$ ^) g
- int32_t shift = 0;
: U y) v7 H M: Z - q31_t pDataDst1[9];
( M( Y }9 R) G* S - arm_matrix_instance_q31 pSrcA1; //3行3列数据, b p' Y' r! I$ S
- arm_matrix_instance_q31 pDst1;- r, q! }, e8 M) f z
- /****定点数Q15数组******************************************************************/5 a/ w9 ^( K1 I8 D
- q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};, x$ F$ S, l" }% }9 h
- q15_t scaleFract1 = 10;
' H2 O/ h8 E3 K( g" K- } - int32_t shift1 = 0;
6 y6 K' s. Y/ W& m - q15_t pDataDst2[9];) r" B3 f0 H. h6 T
- arm_matrix_instance_q15 pSrcA2; //3行3列数据9 { B! n% }" q
- arm_matrix_instance_q15 pDst2;
2 L- |- D8 G+ G& c% T/ Q( U - /****浮点数***********************************************************************/( R& O0 U. ^6 t* W3 T' [: }7 s" A
- pSrcA.numCols = 3;% N0 G, p, M0 g! w/ p4 K
- pSrcA.numRows = 3;( ]1 S. B" g6 A0 J
- pSrcA.pData = pDataA;2 @' P" g) v5 @9 \/ X5 L+ L1 }
- . g* n! F7 v) _8 `& k# P# w% T, b7 Z3 P
- pDst.numCols = 3;
* ~3 i: t- Z5 H0 l6 ~ - pDst.numRows = 3;
& L" m, a7 P, [ - pDst.pData = pDataDst;
. h$ ]9 a X) I+ y8 |* H+ D - printf("****浮点数******************************************\r\n");
9 M5 j* e# T6 Y" x! O4 u8 Z7 ~+ | - arm_mat_scale_f32(&pSrcA, scale, &pDst);
- S- x$ k1 I# [! A( B t - for(i = 0; i < 9; i++)7 `: G) ^, u( y+ @- I- N, Y
- {
: U! T" x- O$ i7 C8 D+ t - printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);
+ p3 c) C, j" r, N6 `, | - }
. S3 f. E0 ]- L* f8 z. `' g - /****定点数Q31***********************************************************************/
( g7 ]& P- t) Q1 Z# \; Q ?5 T - pSrcA1.numCols = 3;
* s8 T( b# I5 m0 } - pSrcA1.numRows = 3;
' v( [/ ~$ R& J: o$ b - pSrcA1.pData = pDataA1;
/ H% T' P) ^$ {$ I" {4 U, ]: T - pDst1.numCols = 3;
# _- d/ _4 g% z3 R8 x6 U3 p - pDst1.numRows = 3;) a. p* {, c" A" N/ v
- pDst1.pData = pDataDst1;
1 [2 w5 e6 X; T - printf("****定点数Q31******************************************\r\n");, z& I- \: R" `6 v, }, e$ M v" c
- arm_mat_scale_q31(&pSrcA1, scaleFract, shift, &pDst1);
2 l7 {4 T2 X9 c - for(i = 0; i < 9; i++)& r# d9 N' W: ]7 m* d
- {1 C4 O; m( Q: B
- printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);
4 f/ P+ O! v" c p - } K6 p- i1 B4 i0 E) q/ D( u ~: H
- /****定点数Q15***********************************************************************/& g% D, a, Q( r$ n$ b' u- q1 s
- pSrcA2.numCols = 3;
; f8 q; u( K2 K/ Q3 { - pSrcA2.numRows = 3;* T! m. J% n4 U, p
- pSrcA2.pData = pDataA2;# M( b4 F/ [( x m
- pDst2.numCols = 3;; k+ U8 o, _# o {' \
- pDst2.numRows = 3;
) `7 s2 e1 V9 d: I - pDst2.pData = pDataDst2;! F) ~3 d2 u9 |3 l Q U/ q! ~4 ]/ A
- printf("****定点数Q15******************************************\r\n");3 c0 `1 x& N- ?9 A4 Y+ ?
- arm_mat_scale_q15(&pSrcA2, scaleFract1, shift1, &pDst2);( V6 r G9 H$ m
- for(i = 0; i < 9; i++)
) S0 F5 ^! W- U8 j; {; j, I - {% k6 i' Y2 P* @0 ^2 ]
- printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
' Y$ d; Y, u) g- T - }, `. }, \" w# F3 |& d4 B$ H
- }
复制代码1. 下面通过matlab来实现矩阵的放缩: 0 k: i2 {1 o, o9 D# Q* T9 R7 s
" B5 \' P4 d: m8 Z5 r! i4 l
|
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 实例讲解