【新手基礎教程】傳統演算法之音訊處理

語言: CN / TW / HK

FFT 訊號處理

FFT 即快速傅立葉變換(Fast Fourier Transform),將時域訊號轉化為頻域訊號,應用範圍非常廣,例如消除音訊影象噪聲。

1. 使用方法

k210 帶有硬體 FFT 模組,支援 64 點、 128 點、 256 點以及 512 點的 FFT。

  • 匯入 FFT 模組
import FFT

  • 輸入時域資料(例如音訊資料)並進行 FFT 運算
res = FFT.run(data, points, shift)

相關 API 解釋請參考FFT-API

2. 例程

採集聲音並進行 FFT 運算,將運算後的資料在螢幕上顯示為柱狀圖: demo_fft_spectrum

效果:https://www.bilibili.com/video/BV1wb41187X8?from=search&seid=9574029909950554976

FFT 瀑布圖(雨圖)

FFT 瀑布圖即為資料隨時間變化的頻率分佈圖,下面將介紹如何使用 MaixPy 繪製瀑布圖。

1. 繪製方法

  • 準備時域訊號(例如音訊資料)
rx = I2S(I2S.DEVICE_0)
rx.channel_config(rx.CHANNEL_0, rx.RECEIVER, align_mode = I2S.STANDARD_MODE)
rx.set_sample_rate(sample_rate)
audio = rx.record(sample_points)

  • 進行FFT運算(將資料進行 FFT 運算並獲取其頻率分佈情況)
fft_points = 512
fft_res = FFT.run(audio.to_bytes(),fft_points)
fft_amp = FFT.amplitude(fft_res)

  • 繪製在 image (由於 FFT 結果的對稱性,只需要繪製其中一部分即可)
hist_x_num = 128
img = image.Image(size=(128,128))
for i in range(hist_x_num):
        img[i] = fft_amp[i]

詳細API參考I2S-API, FFT-API

2. 例程

以下例程在韌體v0.5.1 MaixDock 測試通過

實時採集音訊資料並繪製為 FFT 瀑布圖

demo_fft_waterfall.py

效果: