Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

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

$
0
0

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


Viewing all articles
Browse latest Browse all 3634

Trending Articles