採用 STM32 進行音訊處理
STMicroelectronics (ST) 的高效能 ARM Cortex-M7 系列推出新品項:STM32H735。新產品發佈前 30 天可獨家透過 DigiKey 購買。通常我在拿到新推出的產品時,喜歡打造一個小型專案,使用其中涵蓋的各種功能。在此部落格文章中,我決定使用 STM32H735G-DK 探索套件調查一些音訊周邊裝置,並顯示結果。請觀看由我同事錄製的以下影片,概覽此套件和開箱展示。
聲音擷取
STM32H735G 具有兩個專用的序列音訊介面 (SAI),提供許多彈性。每個 SAI 具有兩個子模塊,可以獨立配置為主要或從屬,以及 I2S 類型通訊的發射器或接收器。此外,可以為 PDM 麥克風提供時脈,並且轉換輸出至 PCM。
此裝置的其他周邊裝置也可用於音訊用途。此裝置的四個 SPI 介面可配置用於 I2S。嵌入式三角積分濾波器也可以代替 SAI 處理 PDM 麥克風的轉換。
在探索套件中,上述兩種 SAI 配置皆可見。其中一個 SAI 介面透過 I2S 連接至 Cirrus Logic 的 WM8994 編解碼器。採用此編解碼器,可以透過線路輸入埠接收音訊,並且透過耳機插孔或放大揚聲器輸出回播。第二個 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/Include 和 CMSIS/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 是功能強大的微控制器,具有眾多板載功能,專用於多媒體和訊號處理應用。DigiKey 是此產品的獨家經銷商至本 (10) 月底,如果看起來很適合您的下一個專案,請立即在我們的網站查看。

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum