This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: MSP-DSPLIB

下面是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中的数据参与计算啊?

  • 有知道的专家给讲讲啊
  • #define 	DSPLIB_DATA(var, align)
     	Place data with alignment, when LEA is used data is placed into the shared RAM section. 

    您的理解是正确的,主要是用于对齐放置数据

    2 _q15 inputA[SIGNAL_ROWS][SIGNAL_COLS];是指定义了一个_q15类型的矩阵。_q15的定义如下

    //******************************************************************************
    //
    //! \ingroup dsplib_types
    //!
    //! \brief Signed fixed point data type with 1 integer bit and 15 fractional
    //!        bits.
    //
    //******************************************************************************
    #ifndef __QMATHLIB_H__ // Define _q15 if not defined by QmathLib header.
    typedef int16_t _q15;
    #endif  //__QMATHLIB_H__
    

    3 您可以看一下 initSignals的定义

    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_sinusoid_q15 ,主要是为了生成具有指定幅度和频率的正弦曲线。

    更多信息您可以参考

    http://dev.ti.com/tirex/#/?link=Software%2FMSP430Ware%2FLibraries%2FDSPLib%2FUser&#39;s%20Guide

  • 谢谢您的回复!

    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有问题吗?

    期待您的回复,谢谢!