IAR Embedded Workbench for ARM 과 CMSIS-DSP 라이브러리 사용

Arm Cortex-M3/-M4 프로세서는 SIMD(단일 명령 다중 데이터)와 같은 신호 처리 지침을 제공합니다. 특히 Cortex-M4는 DSP 프로그램용으로 설계되었으며 고급 SIMD, MAC(배수 및 축적)를 지원합니다. 명령어들 또한 Cortex-M4F 장치에는 부동 소수점 계산을 처리하기 위한 FPU(부동 소수점 장치)가 있습니다.

이러한 지침을 사용하는 방법에는 어셈블리 루틴 또는 고유 기능을 사용하는 등 여러 가지가 있지만 가장 실용적인 방법 중 하나는 CMSIS(Am Cortex Microcontroller Software Interface Standard) DSP 라이브러리를 사용하는 것입니다. CMSIS-DSP 라이브러리는 Cortex-M 프로세서를 위해 설계되었으며 매트릭스 함수, 통계 함수, 고급 산술 함수 등 디지털 신호 처리에 최적화된 함수를 제공합니다.

사전 빌드된 CMSIS-DSP 라이브러리와 해당 소스 코드는 IAR Embedded Workbench for Arm에서 제공되며, 이 문서에서는 IAR Embedded Workbench for Arm과 함께 CMSIS-DSP 라이브러리를 사용하는 방법과 이를 통해 성능을 개선할 수 있는 방법을 살펴보겠습니다.

CMSIS-DSP 라이브러리를 설정

IAR Embedded Workbench for Arm에서는 먼저 Arm Cortex-M4F 장치 STM32F407ZG와 같은 CMSIS-DSP 장치를 선택하여 CMSIS-DSP 라이브러리를 사용할 수 있습니다.

11.png

둘째, General Options> Library Configuration 페이지에서 CMSIS-DSP 라이브러리 옵션을 설정합니다. 그러면 C 사전 프로세서에 대한 PATH가 설정되고 사전 빌드 CMSIS 라이브러리를 가져옵니다.

22.png

이러한 설정은 IAR Embedded Workbench for Arm의 CMSIS-DSP를 사용하는 데 필요한 모든 것입니다.

CMSIS-DSP 라이브러리에 대한 간단한 테스트

CMSIS-DSP 기능을 호출하는 방법과 그 성능을 살펴보겠습니다. 여기서는 sqrt(제곱근) 함수를 사용하여 표준 산술 함수와 비교하겠습니다.

#include <arm_math.h>
#include <math.h>
#include <stdio.h>
int main()
{
  float32_t f_input_cmsis_dsp = 2;
  float32_t f_result_cmsis_dsp;
  
  float f_input = 2;
  float f_result;
  
  /* Using CMSIS-DSP library */
  arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);
  printf("f1: %f\n",f_result_cmsis_dsp);
  
  /* Standard math function */
  f_result = sqrt(f_input);
  printf("f2: %f\n",f_result);
  
  return 0;
}

The results are identical and correct.

f1: 1.414214
f2: 1.414214

 

다음으로, 성능을 살펴보겠습니다.

IAR Embedded Workbench의 CYCLECOUNTER 레지스터는 실행 중인 코드에 대해 소비되는 사이클 수를 확인하는 데 유용합니다. CCSTEP 레지스터는 마지막으로 수행된 C/C++ 소스 또는 어셈블리 단계에서 사이클 수를 확인할 때 유용합니다.

33.png

중단점을 설정하고 sqrt 기능의 CCSTEP 값을 기록합니다.

digital_signal_processing-4.png

이 경우 CMSIS-DSP sqrt 함수는 표준 산술 함수보다 10배 이상 빠릅니다.

arm_sqrt_f32 :    52 cycles
sqrt :                 752 cycles

이 간단한 예를 통해 CMSIS-DSP는 매우 사용하기 쉽고 성능이 크게 향상된다는 것을 알 수 있습니다.

FFT 를 위한 실용적인 예제

이제 CMSIS-DSP 라이브러리의 실제 예를 하나 더 살펴보겠습니다. FFT(Fast Fourier Transform)는 파형 데이터에서 주파수 요소를 분석할 수 있는 디지털 신호 처리의 가장 인기 있는 기능 중 하나입니다. IAR Embedded Workbench for Arm에는 일부 CMSIS-DSP 데모 프로젝트가 포함되어 있으며 다음 예에서는 ST the를 열어 STM32 예제 프로젝트를 사용합니다.STM32F4xx>CMSIS 및 STM32CMSIS와 STM32F4xx stperiph lib 1.2.0입니다.RC2>DSP Lib 데모 프로젝트입니다.

digital_signal_processing.png

This workspace includes 11 demo projects.

digital_signal_processing-6.png

Select arm_fft_bin_example.

digital_signal_processing-7.png

This project includes arm_fft_bin_data.c which contains an array describing a 10 KHz signal disturbed with white noise.

digital_signal_processing-8.png

As the input data to the FFT algorithm should be complex numbers, odd numbers are the actual data and even numbers are the imaginary data and should be set to 0.

digital_signal_processing-9.png

입력 신호가 백색 노이즈로 인해 교란됩니다.

digital_signal_processing-10.png

FFT 결과 데이터는 항상 대칭이며 FFT 데모의 출력에는 특정 주파수 성분뿐만 아니라 백색 노이즈도 포함됩니다.

다시 메인 소스 코드로 돌아가서 4가지 CMSIS-DSP 기능을 사용하고 있습니다.

  arm_status status; 
  arm_cfft_radix4_instance_f32 S; 
  float32_t maxValue;      
  status = ARM_MATH_SUCCESS; 
     
  /* Initialize the CFFT/CIFFT module */  
  status = arm_cfft_radix4_init_f32(&S, fftSize,ifftFlag, doBitReverse);

  /* Process the data through the CFFT/CIFFT module */ 
  arm_cfft_radix4_f32(&S, testInput_f32_10khz); 
     
  /* Process the data through the Complex Magnitude Module for  
  calculating the magnitude at each bin */ 
  arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);  
     
  /* Calculates maxValue and returns corresponding BIN value */ 
  arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);

설명에서 알 수 있듯이 첫 번째 기능은 FFT 모듈을 초기화하고, 두 번째 기능은 실제 FFT 계산이며, 세 번째 기능은 복잡한 숫자에서 FFT 결과의 각 빈 크기를 계산하고, 네 번째 기능은 출력 어레이에서 최대값과 색인을 찾습니다.

결과는 이전에 표시된 스프레드시트 차트와 정확히 동일합니다.

digital_signal_processing-11.png

이제 CCSTEP으로 각 기능의 성능을 살펴보겠습니다.

arm_cfft_radix4_init_f32 54
arm_cfft_radix4_f32 100256
arm_cmplx_mag_f32 26913
arm_max_f32 8744

총 주기는 135,967주기입니다. CPU가 100MHz에서 실행되는 경우 총 시간은 1,359us가 됩니다. 오디오 샘플링 속도가 44kHz일 경우 2048 샘플링에 약 45,056us가 소요됩니다. 이 숫자에 비해 DSP 성능이 상당히 빠르다는 것을 알 수 있습니다.

코텍스를 Cortex-M3로 바꿔서 성능이 어떻게 변하는지 보겠습니다.

arm_cfft_radix4_init_f32 54
arm_cfft_radix4_f32 1852707
arm_cmplx_mag_f32 377358
arm_max_f32

23844

If CPU runs at 100MHz, the total time will be 22,539 us. We can see how Cortex-M4 is optimized for DSP applications.

digital_signal_processing-12.png

결론

Cortex-M 프로세서는 고성능 지침을 제공하며, 특히 Cortex-M4는 DSP 애플리케이션을 위한 지침을 지원합니다. 성능을 높이려면 IAR Embedded Workbench for Arm을 CMSIS-DSP 라이브러리와 함께 사용하는 것을 고려해 보십시오. 라이브러리에서 기능을 찾을 수 없는 경우 \arm\의 소스 코드도 참조할 수 있습니다.CMSIS\DSP_Lib\입니다.IAR Embedded Workbench for Arm에서 소스를 생성하고 고유한 라이브러리를 생성합니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.