KRW | USD

STM32를 이용한 오디오 처리

STMicroelectronics(ST)에서 막 출시한 고성능 ARM Cortex-M7 라인의 신제품 STM32H735를 출시 후 첫 30일간 Digi-Key에서 독점 판매합니다. 저는 신제품을 입수되면 이를 활용하여 여러 가지 기능이 포함된 작은 프로젝트를 설계해 보는 것을 좋아합니다. 이 블로그에서는 다양한 오디오 주변 장치를 조사하고, STM32H735G-DK 디스커버리 키트를 사용해 그 결과를 공유하기로 결정했습니다. 해당 키트에 대한 간단한 개요 및 독창적인 데모를 살펴보려면 아래에서 제 동료의 동영상을 참조하세요.

사운드 캡쳐

STM32H735G에는 두 개의 전용 직렬 오디오 인터페이스(SAI)가 있어 뛰어난 유연성을 제공합니다. 각 SAI에는 두 개의 서브블록이 있어 마스터 또는 슬레이브로 구성되거나, I2S 유형 커뮤니케이션에서는 송신기 또는 수신기로 독립적인 구성이 가능합니다. 또한 PDM 마이크에 클록을 제공하고 출력을 PCM으로 변환할 수 있습니다.

해당 장치의 기타 주변 장치 또한 오디오를 위한 용도로 재탄생할 수 있습니다. 해당 장치에서 4개의 SPI 인터페이스가 I2S용으로 구성될 수 있습니다. 내장형 시그마-델타 필터(DFSDM)는 SAI 대신 PDM 마이크의 변환도 처리할 수 ​​있습니다.

디스커버리 키트에서 위에 언급한 SAI 구성을 실행할 수 있습니다. SAI 인터페이스 중 하나는 I2S를 통해 Cirrus Logic WM8994 codec에 연결됩니다. 코덱을 이용하면 오디오가 라인인 포트를 통해 수신되고 헤드폰 잭 또는 증폭 스피커 출력을 통해 재생됩니다. 두 번째 SAI는 PDM 모드에서 작동하며 온보드 마이크에 직접 연결됩니다.

ST는 STM32CubeMX 프레임워크에서 BSP 샘플 프로젝트를 제공하여 이러한 오디오 주변 장치 개발을 빠르게 시작할 수 있습니다. 이 프로젝트에는 주변 장치용 낮은 성능의 구동기 및 오디오 코덱과 같은 디스커버리 키트 기능용으로 더 높은 성능의 구동기가 포함됩니다. 예를 들면 BSP 드라이버를 이용하여 라인인 커넥터에서 오디오 입력을 구성하는 것은 매우 간단합니다.

복사
#define BUFFER_SIZE    2048

int16_t audio_buffer[BUFFER_SIZE]
BSP_AUDIO_Init_t  AudioInInit;

/* Initialize audio interface to use line in port for input */
AudioInInit.Device = AUDIO_IN_DEVICE_ANALOG_LINE1;
AudioInInit.ChannelsNbr = 2;
AudioInInit.SampleRate = 44100;
AudioInInit.BitsPerSample = AUDIO_RESOLUTION_16B;
AudioInInit.Volume = 80;

/* Initialize audio in on Instance 0 (SAI I2S) */
BSP_AUDIO_IN_Init(0, &AudioInInit);

/* Start DMA recording into buffer */
BSP_AUDIO_IN_Record(0, (uint8_t *) audio_buffer, 2* BUFFER_SIZE);

ARM CMSIS-DSP 활용

ARM을 개발해 본 적이 있다면 CMSIS(Cotex 마이크로 컨트롤러 소프트웨어 인터페이스 표준)에 대해 잘 알고 있을 것입니다. 잘 모르는 경우를 대비해 설명하자면, 이는 서로 다른 ARM Cortex 구현에 걸쳐 동일한 코드를 포함한 하드웨어 추상화 계층입니다. 여기에서 저는 CMSIS-DSP 라이브러리에 관심이 가는데, 여기에는 ARM 아키텍처용으로 최적화된 일반적인 신호 처리 기능이 포함됩니다.

저에게 있어 CMSIS 라이브러리를 통합하는 가장 간단한 방법은 소스로부터 직접 취하는 것입니다. ARM의 GitHub으로부터 CMSIS 리포지토리 전체를 복사할 수도 있지만, 시작 단계에서는 ST 프로젝트에 CMSIS/DSP/IncludeCMSIS/DSP/Include 디렉토리만 추가하면 됩니다. 일반적으로 기본 프로젝트 구조의 Drivers/CMSIS 디렉토리에 복사해야 합니다.

컴파일링 전 프로젝트에서 처리해야 할 2가지 간단한 수정 사항이 있습니다. 먼저 새로운 CMSIS/DSP/Include 디렉토리를 프로젝트의 include(포함) 경로에 추가합니다. 그 곳의 arm_math.h 헤더는 DSP 함수에 액세스하기 위해 응용 제품에 포함해야 할 부분입니다.

그 다음, DSP 라이브러리에서 하드웨어 아키텍처에 관한 정보를 위해 사용하는 두 개의 #define(__FPU_PRESENT 및 ARM_MATH_CM7)이 있습니다. 이를 확실하게 표시할 수 있는 가장 간편한 방법은 아래 표시된 것처럼 글로벌 프로젝트 기호에 추가하는 것이라는 사실을 알게 되었습니다.

그림 1. 프로젝트 기호 정의.

그 후 FFT 계산을 위해 다음과 같이 몇 줄만 더하면 됩니다.

복사
#include “arm_math.h”

#define FFT_SIZE    256

arm_rfft_fast_instance_f32 fft_inst;
float32_t fft_in[FFT_SIZE], fft_out[FFT_SIZE];
float32_t fft_mag[FFT_SIZE>>1];

/* Initialize ARM FFT instance with num points */
arm_rfft_fast_init_f32(&fft_inst, FFT_SIZE);

/* Fill the fft_in buffer from Line In or Microphone input */

/* Perform forward direction 32-bit FFT */
arm_rfft_fast_f32(&fft_inst, fft_in, fft_out, 0);

/* Calculate magnitude (buffer size is half because real + imag parts are merged) */
arm_cmplx_mag_f32(fft_out, fft_mag, FFT_SIZE >> 1);

모두를 하나로 통합하기

FFT 계산이 끝나면 결과를 그래픽으로 확인할 수 있는 장점이 있습니다. 아래의 함수는 ST BSP 드라이버와 CMSIS-DSP 라이브러리의 기능을 결합하여 디스커버리 키트의 디스플레이에 미니멀한 비주얼라이저 스타일의 그래프를 그립니다.

그림 2. 디스커버리 키트에서 표시되는 비주얼라이저.

복사
static void Display_FFT(float32_t *fft_mag)
{
	uint8_t i;
	float32_t max_val;
	uint32_t max_idx;
	uint32_t box_height;
	uint8_t box_width = 2;

	/* Draw horizontal axis */
	UTIL_LCD_FillRect(10, 135, 460, 2, UTIL_LCD_COLOR_WHITE);

	/* Use max value in the results for scale */
	arm_max_f32(fft_mag, FFT_SIZE >> 1, &max_val, &max_idx);

	/* Draw frequency bins */
	for(i = 0; i < 230; i++)
	{
		box_height = 100 * (fft_mag[i] / max_val);
		UTIL_LCD_FillRect(10 + box_width*i, 135, box_width, box_height, UTIL_LCD_COLOR_WHITE);
	}
}

결론

STM32H735는 특히 멀티미디어 및 신호 처리 응용 제품을 위한 매우 다양한 온보드 기능을 포함한 강력한 마이크로 컨트롤러입니다. 이 제품은 이달 말까지 Digi-Key에서 독점 판매하므로, 귀하의 다음 프로젝트를 위해 꼭 맞는 제품이라고 생각하신다면 Digi-Key 웹사이트를 방문하여 확인하세요.

작성자 정보

Image of Taylor Roorda Digi-Key Electronics의 응용 프로그램 엔지니어인 Taylor Roorda는 2015년에 입사했으며, 주로 내장 시스템, 프로그래밍 가능 논리 및 신호 처리 관련 분야에 관심이 깊습니다. Taylor는 노스 다코타 주립대학교에서 전기 공학 학사 학위를 취득했으며 여가 시간에는 기타 연주와 작곡을 즐깁니다.
More posts by Taylor Roorda