TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP-DSPLIB 矩阵加法运算API求解惑

下面是TI的MSP-DSPLIB里面的一个矩阵运算的文件:matrix_ex1_add_q15.c

#include "msp430.h"

#include <math.h>
#include <stdint.h>
#include <stdbool.h>

#include "DSPLib.h"

/* Input signal parameters */
#define FS 8192
#define SIGNAL_ROWS 10
#define SIGNAL_COLS 12
#define SIGNAL_FREQUENCY1 200
#define SIGNAL_AMPLITUDE1 0.6
#define SIGNAL_FREQUENCY2 2100
#define SIGNAL_AMPLITUDE2 0.15

/* Constants */
#define PI 3.1415926536

/* Input matrix A */
DSPLIB_DATA(inputA,4)
_q15 inputA[SIGNAL_ROWS][SIGNAL_COLS];

/* Input matrix B */
DSPLIB_DATA(inputB,4)
_q15 inputB[SIGNAL_ROWS][SIGNAL_COLS];

/* Result of the matrix add */
DSPLIB_DATA(result,4)
_q15 result[SIGNAL_ROWS][SIGNAL_COLS];

/* Benchmark cycle counts */
volatile uint32_t cycleCount;

/* Function prototypes */
extern void initSignals(void);

void main(void)
{
msp_status status;
msp_matrix_add_q15_params addParams;
/* Disable WDT. */
WDTCTL = WDTPW + WDTHOLD;

#ifdef __MSP430_HAS_PMM__
/* Disable GPIO power-on default high-impedance mode for FRAM devices */
PM5CTL0 &= ~LOCKLPM5;
#endif

/* Initialize input signals */
initSignals();
/* Initialize the parameter structure. */
addParams.rows = SIGNAL_ROWS;
addParams.cols = SIGNAL_COLS;
/* Invoke the msp_matrix_add_q15 API. */
msp_benchmarkStart(MSP_BENCHMARK_BASE, 1);
status = msp_matrix_add_q15(&addParams, *inputA, *inputB, *result);
cycleCount = msp_benchmarkStop(MSP_BENCHMARK_BASE);
msp_checkStatus(status);
/* End of program. */
__no_operation();
}

void initSignals(void)
{
uint16_t i;
msp_status status;
msp_sinusoid_q15_params sinParams;

/*
* Generate a set of linearly increasing in frequency sine waves for each
* row of matrices in Q15 format.
*/
for (i = 0; i < SIGNAL_ROWS; i++) {
/* Generate Q15 input signal 1 */
sinParams.length = SIGNAL_COLS;
sinParams.amplitude = _Q15(SIGNAL_AMPLITUDE1);
sinParams.cosOmega = _Q15(cosf((float)i*2*PI*SIGNAL_FREQUENCY1/FS/(float)SIGNAL_ROWS));
sinParams.sinOmega = _Q15(sinf((float)i*2*PI*SIGNAL_FREQUENCY1/FS/(float)SIGNAL_ROWS));
status = msp_sinusoid_q15(&sinParams, inputA[i]);
msp_checkStatus(status);

/* Generate Q15 input signal 2 */
sinParams.length = SIGNAL_COLS;
sinParams.amplitude = _Q15(SIGNAL_AMPLITUDE2);
sinParams.cosOmega = _Q15(cosf((float)i*2*PI*SIGNAL_FREQUENCY2/FS/(float)SIGNAL_ROWS));
sinParams.sinOmega = _Q15(sinf((float)i*2*PI*SIGNAL_FREQUENCY2/FS/(float)SIGNAL_ROWS));
status = msp_sinusoid_q15(&sinParams, inputB[i]);
msp_checkStatus(status);
}
}

初次接触MSP_DSPLIB,现在有以下几个问题需要请教一下:

1.DSPLIB_DATA(inputA,4),是什么意思?我的理解是定义变量inputA的位置在“LEARAM”区域,4字节对齐。但是不理解的是inputA的数据类型是什么,没看见在哪定义了,也没有赋初值。只知道是一个10*12的矩阵。

2._q15 inputA[SIGNAL_ROWS][SIGNAL_COLS];是将SIGNAL_ROWS*SIGNAL_COLS的矩阵inputA类型转换为_q15 吗?

3.void initSignals(void)函数在矩阵加法的API中起什么作用,在main函数中计算矩阵加法的函数是status = msp_matrix_add_q15(&addParams, *inputA, *inputB, *result);而在msp_matrix_add_q15中又调用的是return msp_add_q15(&paramsTemp, srcA, srcB, dst);没有看出来initSignals中的数据参与计算啊?

user4461879:

有知道的专家给讲讲啊

user4461879:

回复 Susan Yang:

谢谢您的回复!

1.上面两个问题理解了,第三个问题void initSignals(void)可以理解为是对矩阵inputA和inputB的初始化赋值吗?赋值后再调用 msp_matrix_add_q15进行矩阵加法运算,在实际使用中我们可以根据具体情况赋值而不必照搬i这个nitSignals?

2.我现在正在移植矩阵加法的API到我的工程,现在有一个新问题,我在IAR的环境中options – c/c++ compiler – preprocessor的Additional include directories下面把DAPLIB的头文件路径加载进去了,如E:\program files(x86)\IAR Systems\Embedded Workbench8.0\DSPLib_1_30_00_02\include.同时把DSPlib下的用到了的c文件也加载到了我的工程,编译后发现只有msp_add_q15.c文件中报错了。说结构体MSP_LEA_ADDMATRIX_PARAMS 没有定义等等,我找了一下MSP_LEA_ADDMATRIX_PARAMS ,在DSPLib_lea.h中有定义啊,而DSPLib.h中已经把DSPLib_lea.h包含进去了,为什么编译器会找不到呢?是我哪弄错了吗?我加载的其他c文件并没有报错。例如msp_matrix_add_q15.c,msp_lea_init.c等等都没报错。

下面是msp_add_q15.c文件的片段:

#include "DSPLib.h"

#if defined(MSP_USE_LEA)

msp_status msp_add_q15(const msp_add_q15_params *params, const _q15 *srcA, const _q15 *srcB, _q15 *dst)

{

   uint16_t length;

   msp_status status;

   MSP_LEA_ADDMATRIX_PARAMS *leaParams;

   /* Initialize the vector length. */

   length = params->length;

另外一个问题,还是在msp_add_q15.c文件中,如果没有defined MSP_USE_LEA,程序执行下面的代码。

#else //MSP_USE_LEA

msp_status msp_add_q15(const msp_add_q15_params *params, const _q15 *srcA, const _q15 *srcB, _q15 *dst)

{

   uint16_t length;

   /* Initialize the vector length. */

   length = params->length;

#ifndef MSP_DISABLE_DIAGNOSTICS

   /* Check that length parameter is a multiple of two. */

   if (length & 1) {

       return MSP_SIZE_ERROR;

   }

#endif //MSP_DISABLE_DIAGNOSTICS

   /* Loop through all vector elements. */

   while (length–) {

       /* Add srcA and srcB with saturation and store result. */

       *dst++ = __saturated_add_q15(*srcA++, *srcB++);

   }

   return MSP_SUCCESS;

}

#endif //MSP_USE_LEA

编译后报错说没有定义__saturated_add_signed_short,在DSPLib_support.h中有这样一个定义

#if (defined(__TI_COMPILER_VERSION__) && (__TI_COMPILER_VERSION__ >= 15012001)) || \

   (defined(__IAR_SYSTEMS_ICC__) && (__VER__ >= 650))

#define __saturated_add_q15     __saturated_add_signed_short

#else

static inline _q15 __saturated_add_q15(_q15 x, _q15 y)

{

   return (_q15)__saturate((int32_t)x + (int32_t)y, INT16_MIN, INT16_MAX);

}

#endif

也就是说用 __saturated_add_signed_short替换了__saturated_add_q15,但是在安装的DSPlib目录下我根本找不到__saturated_add_signed_short在哪有定义。是我安装的DSPLib有问题吗?

期待您的回复,谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » MSP-DSPLIB 矩阵加法运算API求解惑
分享到: 更多 (0)