ARM에서는 CMSIS라는 공통 라이브러리를 제공한다. ARM을 사용하는 모든 MCU에서 사용가능하다.
CMSIS는 Common Microcontroller Software Interface Standard의 약자다. 여기에는 다양한 라이브러리가 있는데 본 포스팅에서는 DSP 라이브러리에 대해 알아보려고 한다. 분석이라기보다는 사용법에 가깝고, 어떻게 사용하며 어떤 결과가 나타나는지를 기록하는 포스팅이다.
모든 내용은 아래 링크에서 가져온 내용이다.
https://developer.arm.com/tools-and-software/embedded/cmsis
위 링크에 들어가면 CMSIS 다운로드와 매뉴얼을 확인할 수 있다.
DSP 라이브러리를 보면 vector라는 표현이 등장한다. 1차원 배열을 수학적으로 접근했을 때 vector라는 표현을 쓰고, 컴퓨터에서는 배열(array)로 표현한다. 따라서 DSP에서 말하는 vector는 1차원 배열과 같은 의미로 볼 수 있다.
ARM DSP에서 제공하는 함수의 전달인자는 보통 4개다.(아닌 경우도 있다.)
q15_t * pSrcA
q15_t * pSrcB
이렇게 두 포인터는 연산을 수행할 2개의 vector
q15_t * pDst 또는 q15_t * result는 연산 결과를 저장할 vector
마지막으로 blockSize는 연산을 수행할 Size 값에 해당한다.
arm에서 제공하는 DSP 관련함수 이름은 <arm_"함수이름(기능)"_자료형> 이와 같이 구성되어 있다. dsp 라이브러리를 사용하기 위해서는 아래 파일들이 include 되어 있어야 한다.
#include "arm_math.h"
본 포스팅은 새로 접하는 함수가 나올 때마다 수시로 업데이트할 예정이다. (혹시 틀린 부분이 있다면 댓글 부탁드립니다 ~~)
- arm_dot_prod_q15(q7, q15, q31, f32)
void arm_dot_prod_q15(
q15_t * pSrcA,
q15_t * pSrcB,
uint32_t blockSize,
q63_t * result)
pSrcA와 pSrcB의 내적을 구해주는 함수, 데이터를 인덱스별로 곱해서 더한 다음 result를 통해 반환해 준다. res는 285가 된다.
q15_t a[10] = {0, };
q15_t b[10] = {0, };
q63_t res;
int main(void)
{
for(int i = 0; i < 10; i++) {
arm_dot_prod_q15(a, b, 10, &res);
}
}
- arm_add_q15(q7, q15, q31, f32)
void arm_add_q15(
q15_t * pSrcA,
q15_t * pSrcB,
q15_t * pDst,
uint32_t blockSize)
pSrcA와 pSrcB의 각 인덱스끼리 더해서 pDst에 저장한다. 아래 코드로 확인해 보면 res의 모든 인덱스에는 10이 저장된 걸 확인할 수 있다.
int k = 0;
int i = 10;
q15_t a[10], b[10], res[10];
for(k = 0; k < 10; k++) {
a[k] = k;
b[k] = i--;
}
arm_add_q15(a, b, res, 10);