arm_mult_q15関数 |
2つの配列の各要素を乗算する |
関数のソース(CMSIS 2.0以上をダウンロード・インストールする必要あり) CMSIS_2_00\CMSIS\DSP_Lib\Source\Cortex-M4-M3\BasicMathFunctions\arm_mult_q15.c サンプルソース(DFFSKN40基板付属CD-ROMに収録) IARprojects\src\projects\arm_mult 引数と戻り値 説明(イメージ) 使用例(サンプルソースの一部)
実験 上記のサンプルソースをDFFSKN40基板(デジタルフィルター社)にて実験した。Cortex-M4マイコンはPK40X256VMD100(Kinetis, フリースケール社)搭載。演算結果をLCDに16進数で表示している。 下の写真はn = 0のとき。 a[0] = 10,000, b[0] = 20,000なので、 10進数で: 10,000 * 20,000 = 200,000,000 16進数で: 0x 0BEB C200 (32ビットになる) 2進数で: 0000 1011 1110 1011 1100 0010 0000 0000 15ビット右シフトして: 0001 0111 1101 0111 16進数で: 0x 17D7 10進数で: 6103 = c[0] 下の写真はn = 1のとき。 a[1] = -12,345, b[1] = 22,222なので、 10進数で: -12,345 * 22,222 = -274,330,590 16進数で: 0x EFA6 0C22 2進数で: 1110 1111 1010 0110 0000 1100 0010 0010 15ビット右シフトして: 1101 1111 0100 1100 16進数で: 0x DF4C 10進数で: -8372 (最上位ビットが1なので負の数)= c[1] 下の写真はn = 2のとき。 a[2] = -30,000, b[2] = -13,579なので、 10進数で: -30,000 * -13,579 = 407,370,000 16進数で: 0x 1847 F910 2進数で: 0001 1000 0100 0111 1111 1001 0001 0000 15ビット右シフトして: 0011 0000 1000 1111 16進数で: 0x 308F 10進数で: 12,431 = c[2] 下の写真はn = 3のとき。 a[3] = 100, b[3] = 200なので、 10進数で: 100 * 200 = 20,000 16進数で: 0x 0000 4E20 2進数で: 0000 0000 0000 0000 0100 1110 0010 0000 15ビット右シフトして: 0000 0000 0000 0000 16進数で: 0x 0000 10進数で: 0 = c[3] まめ知識 極値同士の乗算はオーバフローになることがある。 @0x7FFF * 0x7FFF = 0x7FFE A0x7FFF * 0x8000 = 0x8001 B0x8000 * 0x8001 = 0x7FFF C0x8000 * 0x8000 = 0x7FFF @、A、Bは上述の算法に沿った結果と同じであるがCは、 10進数で: -32,768 * -32,768 = 1,073,741,824 16進数で: 0x 4000 0000 2進数で: 0100 0000 0000 0000 0000 0000 0000 0000 15ビット右シフトして: 1000 0000 0000 0000 ←正の数なのにMSBが1になっている。 この場合はオーバフローであり、正の最大値0111 1111 1111 1111 に置き換えられる。 16進数で: 0x 7FFF 10進数で: 32,767 これが乗算結果となる。 |