特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
, z7 s2 |3 S6 O9 r, w) T# f第20章 MatrixFunctions的使用(二)
5 B( C" k; ]: y8 I6 N 本期教程主要讲解矩阵运算中的放缩,乘法和转置。 20.1 矩阵放缩 MatScale 20.2 矩阵乘法 MatMult 20.3 转置矩阵 MatTrans 20.4 总结 ; L9 V8 O2 ~0 Y2 n1 ]- f$ W
20.1 矩阵放缩 MatScale; A0 {! }6 j6 P
$ q% C2 U. W8 @6 y% I
20.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>
; I, x" h4 }! j* d* G* o20.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.
& J i3 B: \( Q+ _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. ; F5 ^5 [- ?: O$ Y
20.1.4 实例讲解实验目的: 1. 学习MatrixFunctions中矩阵的放缩 实验内容: 1. 按下按键K1, 串口打印函数DSP_MatScale的输出结果 实验现象: 通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下: 程序设计: - /*% ~ I' ?9 t/ c2 e. N/ X
- *********************************************************************************************************
F- _' N" x) A D7 K5 k9 g - * 函 数 名: DSP_MatScale7 m- u2 [( X# L
- * 功能说明: 矩阵放缩9 _. H2 _" C+ P% ~4 j* _# m0 Z3 i
- * 形 参:无- k6 h4 c& T) N. z4 F
- * 返 回 值: 无
; v, F8 E5 B- A/ t - *********************************************************************************************************. P0 D0 B! q4 D2 l
- */: b; L% h1 P D: s) t0 R& p
- static void DSP_MatScale(void)
0 {, w3 F/ @: \9 |' F - {
* l0 x7 Z8 d$ o- q, F7 E$ P2 Z - uint8_t i;
" q8 a1 R' Y- h7 j9 {7 i - /****浮点数数组******************************************************************/
" o- \ j) s& c- z- r i - float32_t pDataA[9] = {1.1f, 1.1f, 2.1f, 2.1f, 3.1f, 3.1f, 4.1f, 4.1f, 5.1f};1 U( v" r9 [& H. {: U
- float32_t scale = 1.1f;5 S! P8 ^( z# O
- float32_t pDataDst[9];2 }7 Y0 v9 n4 ?7 w/ Z! U5 I) p' v
- arm_matrix_instance_f32 pSrcA; //3行3列数据
x7 F9 E4 c, H2 K - arm_matrix_instance_f32 pDst;7 e1 H6 z% O& ]) }
- /****定点数Q31数组******************************************************************/# s+ ?4 `+ W+ i2 S# O8 b! `
- q31_t pDataA1[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};3 [( }: ?. ~7 |/ T$ X1 _
- q31_t scaleFract = 10;
" F2 F6 v0 i& |* V1 ~/ v - int32_t shift = 0;
" l* e" z4 h( s4 \7 X* H1 g - q31_t pDataDst1[9];
" l0 q8 R* O5 s( ^2 V - arm_matrix_instance_q31 pSrcA1; //3行3列数据/ E, z4 u( h$ x& W5 S
- arm_matrix_instance_q31 pDst1;' ~8 g6 x- ]1 \; O3 _+ ]) ^
- /****定点数Q15数组******************************************************************/
! R: Q+ _; @2 g3 ]) ?9 G/ v0 b1 G# n - q15_t pDataA2[9] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
! y5 y+ @$ f' B w4 }5 J - q15_t scaleFract1 = 10;
: J( Q2 e. F9 S- s( F - int32_t shift1 = 0;4 r3 ~- S9 y5 |' y8 Z9 U
- q15_t pDataDst2[9];
8 f5 @: E# C9 B - arm_matrix_instance_q15 pSrcA2; //3行3列数据% K3 r& m. M) j* L5 y$ y
- arm_matrix_instance_q15 pDst2;& a0 L: N5 n" }, \
- /****浮点数***********************************************************************/& w |1 v3 G7 R8 h0 z& H
- pSrcA.numCols = 3;
7 `( G! R) ~6 i. X7 G - pSrcA.numRows = 3;
+ u; |& F r1 P0 F7 N! U% a; B+ j - pSrcA.pData = pDataA;
f$ y9 T6 c8 M - 2 P. w( H$ [* i; @/ C' n$ H
- pDst.numCols = 3;
# Q1 u# x$ }2 }( W1 i; |" [* e - pDst.numRows = 3;/ o: w2 p# J$ `) G. p- p) w
- pDst.pData = pDataDst;
( @$ ^1 n, |" D: g7 z - printf("****浮点数******************************************\r\n");3 \( y5 E2 p3 o' _, Z' p1 ~
- arm_mat_scale_f32(&pSrcA, scale, &pDst);6 g, m& }: P9 r+ _& B
- for(i = 0; i < 9; i++) Y3 t* w( ]( }" R/ A8 {
- {
) c" O# a/ ~% p9 v8 u+ R7 D6 U. n - printf("pDataDst[%d] = %f\r\n", i, pDataDst[i]);4 c8 ~3 g: D5 U, B5 |
- }
: [( [8 K* y$ s - /****定点数Q31***********************************************************************/" n" I. ]3 a. G0 ]
- pSrcA1.numCols = 3;1 s1 a4 j6 P: X( T9 }/ w
- pSrcA1.numRows = 3;* W' D! f' [( c/ `3 G* ~2 u \ O
- pSrcA1.pData = pDataA1;( y9 ^0 A) L; U# g/ S8 a% {
- pDst1.numCols = 3;
2 A: I: f/ U; n$ @& m - pDst1.numRows = 3;4 G4 i/ k# b [5 F( G1 [
- pDst1.pData = pDataDst1;
4 m% E; b- s8 l6 F( S! c' S. E$ Y - printf("****定点数Q31******************************************\r\n"); p- f4 G6 s- a# H
- arm_mat_scale_q31(&pSrcA1, scaleFract, shift, &pDst1);. N( B8 Z5 j F9 D
- for(i = 0; i < 9; i++)
! a( S6 \( X- | - {; J+ b: ]: w% P# h$ J
- printf("pDataDst1[%d] = %d\r\n", i, pDataDst1[i]);- `' j4 y, F8 O9 v7 w' v+ ]
- }
) `6 I8 I4 b/ `+ {# m! X! A/ U - /****定点数Q15***********************************************************************/% [& w6 `* z. P" g# V2 r) Y
- pSrcA2.numCols = 3;
: b0 A2 L! v8 Z - pSrcA2.numRows = 3;( |) `6 y3 x$ O+ P. ^. R9 y
- pSrcA2.pData = pDataA2;/ q3 ]9 k" O" h- q6 \* l
- pDst2.numCols = 3;, l8 i8 S4 j+ w. E5 _& S
- pDst2.numRows = 3;
9 U! Z* o- l0 s/ n( g - pDst2.pData = pDataDst2;& l7 Q* U- a v5 _, d% W
- printf("****定点数Q15******************************************\r\n");
2 D0 m' E$ D' d- U1 m' v - arm_mat_scale_q15(&pSrcA2, scaleFract1, shift1, &pDst2);, ^4 ? n* k) `& o, W
- for(i = 0; i < 9; i++)2 G9 c7 s6 C( w3 S& t, {) L. w- ]' j
- {
6 t# O6 j# Q- U7 z3 c; R - printf("pDataDst2[%d] = %d\r\n", i, pDataDst2[i]);
2 ^8 C3 T4 ~4 F7 }6 j6 x - }
7 q- y. |0 s& ?8 t- D. e - }
复制代码1. 下面通过matlab来实现矩阵的放缩:
8 _4 ^. p) x9 G; h- I
, e& E' v- [! j% P$ y! p% o5 g |
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 实例讲解