ARM CMSIS DSP Library 분석

728x90
반응형

ARM에서는 CMSIS라는 공통 라이브러리를 제공한다. ARM을 사용하는 모든 MCU에서 사용가능하다. 

 

CMSIS는 Common Microcontroller Software Interface Standard의 약자다. 여기에는 다양한 라이브러리가 있는데 본 포스팅에서는 DSP 라이브러리에 대해 알아보려고 한다. 분석이라기보다는 사용법에 가깝고, 어떻게 사용하며 어떤 결과가 나타나는지를 기록하는 포스팅이다. 

모든 내용은 아래 링크에서 가져온 내용이다. 

 

https://developer.arm.com/tools-and-software/embedded/cmsis

 

CMSIS – Arm Developer

Simplify software reuse, and speed-up project build and debug with APIs, frameworks, and workflows for Cortex-M devices.

developer.arm.com

 

위 링크에 들어가면 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);

 

728x90
반응형