Logo
MSP DSP Library
vector_ex2_complex_add_q15.c

This example demonstrates how to use the msp_cmplx_add_q15 API to perform addition of two complex source vectors.

//******************************************************************************
// Addition of two complex vectors.
//
// Brent Peterson, Jeremy Friesenhahn
// Texas Instruments Inc.
// April 2016
//******************************************************************************
#include "msp430.h"
#include <math.h>
#include <stdint.h>
#include <stdbool.h>
#include "DSPLib.h"
/* Input signal parameters */
#define FS 8192
#define SAMPLES 100
#define SIGNAL_FREQUENCY1 200
#define SIGNAL_AMPLITUDE1 0.6
#define SIGNAL_FREQUENCY2 700
#define SIGNAL_AMPLITUDE2 0.15
/* Constants */
#define PI 3.1415926536
/* Input vector A */
DSPLIB_DATA(inputA,4)
_q15 inputA[SAMPLES*2];
/* Input vector B */
DSPLIB_DATA(inputB,4)
_q15 inputB[SAMPLES*2];
/* Complex real input */
DSPLIB_DATA(cmplxReal,4)
_q15 cmplxReal[SAMPLES];
/* Complex imaginary input */
DSPLIB_DATA(cmplxImag,4)
_q15 cmplxImag[SAMPLES];
/* Result vector */
DSPLIB_DATA(result,4)
_q15 result[SAMPLES*2];
/* Benchmark cycle counts */
volatile uint32_t cycleCount;
/* Function prototypes */
extern void initSignal(void);
void main(void)
{
msp_status status;
/* 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 signal */
initSignal();
/* Initialize the parameter structure. */
addParams.length = SAMPLES;
/* Invoke the msp_cmplx_add_q15 API. */
msp_benchmarkStart(MSP_BENCHMARK_BASE, 1);
status = msp_cmplx_add_q15(&addParams, inputA, inputB, result);
cycleCount = msp_benchmarkStop(MSP_BENCHMARK_BASE);
msp_checkStatus(status);
/* End of program. */
__no_operation();
}
void initSignal(void)
{
msp_status status;
msp_cmplx_q15_params cmplxParams;
/* Generate Q15 input signal 1 real component. */
sinParams.length = SAMPLES;
sinParams.amplitude = _Q15(SIGNAL_AMPLITUDE1);
sinParams.cosOmega = _Q15(cosf(2*PI*SIGNAL_FREQUENCY1/FS));
sinParams.sinOmega = _Q15(sinf(2*PI*SIGNAL_FREQUENCY1/FS));
status = msp_sinusoid_q15(&sinParams, cmplxReal);
msp_checkStatus(status);
/* Generate Q15 input signal 1 imaginary component. */
sinParams.length = SAMPLES;
sinParams.amplitude = _Q15(SIGNAL_AMPLITUDE1);
sinParams.cosOmega = _Q15(cosf(2*PI*1.5*SIGNAL_FREQUENCY1/FS));
sinParams.sinOmega = _Q15(sinf(2*PI*1.5*SIGNAL_FREQUENCY1/FS));
status = msp_sinusoid_q15(&sinParams, cmplxImag);
msp_checkStatus(status);
/* Combine signal 1 real and imaginary components. */
cmplxParams.length = SAMPLES;
msp_cmplx_q15(&cmplxParams, cmplxReal, cmplxImag, inputA);
msp_checkStatus(status);
/* Generate Q15 input signal 1 real component. */
sinParams.length = SAMPLES;
sinParams.amplitude = _Q15(SIGNAL_AMPLITUDE2);
sinParams.cosOmega = _Q15(cosf(2*PI*SIGNAL_FREQUENCY2/FS));
sinParams.sinOmega = _Q15(sinf(2*PI*SIGNAL_FREQUENCY2/FS));
status = msp_sinusoid_q15(&sinParams, cmplxReal);
msp_checkStatus(status);
/* Generate Q15 input signal 1 imaginary component. */
sinParams.length = SAMPLES;
sinParams.amplitude = _Q15(SIGNAL_AMPLITUDE2);
sinParams.cosOmega = _Q15(cosf(2*PI*1.5*SIGNAL_FREQUENCY2/FS));
sinParams.sinOmega = _Q15(sinf(2*PI*1.5*SIGNAL_FREQUENCY2/FS));
status = msp_sinusoid_q15(&sinParams, cmplxImag);
msp_checkStatus(status);
/* Combine signal 2 real and imaginary components. */
cmplxParams.length = SAMPLES;
msp_cmplx_q15(&cmplxParams, cmplxReal, cmplxImag, inputB);
msp_checkStatus(status);
}