TWD | USD

採用 STM32 進行音訊處理

STMicroelectronics (ST) 的高效能 ARM Cortex-M7 系列推出新品項:STM32H735。新產品發佈前 30 天可獨家透過 Digi-Key 購買。通常我在拿到新推出的產品時,喜歡打造一個小型專案,使用其中涵蓋的各種功能。在此部落格文章中,我決定使用 STM32H735G-DK 探索套件調查一些音訊周邊裝置,並顯示結果。請觀看由我同事錄製的以下影片,概覽此套件和開箱展示。

聲音擷取

STM32H735G 具有兩個專用的序列音訊介面 (SAI),提供許多彈性。每個 SAI 具有兩個子模塊,可以獨立配置為主要或從屬,以及 I2S 類型通訊的發射器或接收器。此外,可以為 PDM 麥克風提供時脈,並且轉換輸出至 PCM。

此裝置的其他周邊裝置也可用於音訊用途。此裝置的四個 SPI 介面可配置用於 I2S。嵌入式三角積分濾波器也可以代替 SAI 處理 PDM 麥克風的轉換。

在探索套件中,上述兩種 SAI 配置皆可見。其中一個 SAI 介面透過 I2S 連接至 Cirrus LogicWM8994 編解碼器。採用此編解碼器,可以透過線路輸入埠接收音訊,並且透過耳機插孔或放大揚聲器輸出回播。第二個 SAI 以 PDM 模式運作,並且直接連接至板載麥克風。

ST 提供 BSP 樣本專案,採用 STM32CubeMX 架構,可以使用這些音訊周邊裝置快速進行開發。此專案提供周邊裝置低階驅動器,以及為探索套件功能 (如音訊編解碼器) 提供高階驅動器。舉例而言,能非常直覺地使用 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 的開發經驗,大概會注意到 Cortex 微控制器軟體介面標準 (CMSIS)。這是一個硬體抽象層,在不同的 ARM Cortex 實作中具有一致的編碼。在此例中,我著重於 CMSIS-DSP 函式庫。此函式庫涵蓋專為 ARM 架構經過最佳化的常用訊號處理函式。

對我而言,納入 CMSIS 函式庫最簡單的方法就是從來源。您可以從 ARM 的 GitHub 複製整個 CMSIS,但只需要在 ST 專案中加入 CMSIS/DSP/IncludeCMSIS/DSP/Include 即可開始。一般來說,應該複製至預設專案架構中的 Drivers/CMSIS

在開始編譯之前,要先對專案進行兩項小調整。首先,在專案已有的路徑中,加入 CMSIS/DSP/Include 目錄。此處的 arm_math.h 標頭需納入應用以存取 DSP 功能。

第二,有兩個 DSP 函式庫使用的 #defines,用於提供硬體架構資訊:__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 是此產品的獨家經銷商至本 (10) 月底,如果看起來很適合您的下一個專案,請立即在我們的網站查看。

關於作者

Image of Taylor Roorda Taylor Roorda 是 Digi-Key Electronics 的應用工程師助理,自 2015 年加入本公司,主要負責的領域涵蓋嵌入式系統、可編程邏輯和訊號處理。他擁有北達科他州立大學的電子工程學士學位,在閒暇之餘會彈吉他並寫歌。
More posts by Taylor Roorda