
FFT把時間序列轉換為頻率分量適合識別周期、諧波和頻帶能量變化。MFCC在頻譜基礎上壓縮出更接近聽覺尺度的表示常用于關鍵詞和設備聲音。頻域方法依賴窗口長度、采樣率、窗函數和幅值標定。頻譜圖清晰并不自動帶來更好模型仍要用獨立數據和目標MCU驗證。FFT提供頻率結構頻帶能量進一步壓縮MFCC面向聲音譜包絡三者保留的信息不同。完成本篇后你應該能夠解釋FFT頻點、頻率分辨率、窗函數、頻帶能量和MFCC處理鏈。根據任務是機械周期還是聲音譜包絡選擇合適的頻域表示。運行DFT實驗定位雙頻信號峰值并計算頻帶能量。FFT是一種快速計算離散傅里葉變換的方法。它把時間序列換成各個頻率分量的幅度和相位。圖1FFT、頻帶能量與MFCC位于同一頻域處理鏈的不同階段一、FFT適合周期與諧波結構旋轉機械、風扇和電機常在特定頻率及其諧波上產生能量。FFT能夠把這些周期成分從復雜時域波形中分離。頻率分辨率由窗口物理時長決定零填充只增加頻譜采樣點不提高真正分辨能力。實信號頻譜具有共軛對稱性實際分析通常只使用0到奈奎斯特頻率的一半。幅值歸一化和單邊譜系數需要在PC與MCU保持一致。頻率分辨率 Δf f? / N 1 / Twindow第k個頻點對應 f? k × f? / N二、窗函數控制頻譜泄漏有限窗口相當于截斷連續信號。窗口內不是整數周期時能量會擴散到鄰近頻點。Hann等窗函數能夠降低旁瓣泄漏但會改變主瓣寬度和幅值需要配套標定。訓練端使用Hann窗、部署端使用矩形窗時模型輸入分布會發生系統性變化。窗函數系數、FFT長度和縮放方式都應納入模型版本。表1三種頻域表示的適用范圍表示適合任務主要代價完整FFT譜頻率位置與諧波重要輸入維度和頻點敏感性較高頻帶能量關注若干穩定頻段需要設計頻帶邊界MFCC關鍵詞、語音和設備聲音處理鏈與臨時緩沖更復雜三、頻帶能量用更小輸入表達頻域結構當任務只關心幾個頻段可以把多個FFT頻點求和或求均方形成頻帶能量。這樣降低輸入維度也減弱單個頻點受轉速微小漂移的影響。頻帶邊界應基于物理機理和數據分布確定。邊界過窄會對轉速變化敏感過寬會把不同故障成分混在一起。C/CMSIS-DSP計算實數FFT的核心調用#include arm_math.h#define FFT_LEN 256static arm_rfft_fast_instance_f32 rfft;static float time_data[FFT_LEN];static float spectrum[FFT_LEN];void spectrum_init(void){arm_rfft_fast_init_f32(rfft, FFT_LEN);}void spectrum_run(void){arm_rfft_fast_f32(rfft, time_data, spectrum, 0);// 后續按項目約定計算單邊幅值或頻帶能量。}四、MFCC強調聲音的譜包絡MFCC通常包含預加重或濾波、分幀、窗函數、FFT、Mel濾波器組、對數和DCT。它把高維頻譜壓縮為少量系數適合關鍵詞和設備聲音分類。板端需要評估FFT、濾波器組和臨時緩沖。CMSIS-DSP提供FFT及部分MFCC相關函數但具體API和緩沖要求應按項目鎖定版本檢查。頻率分辨率來自窗口時長不單由采樣率決定N點FFT的頻點間隔為Fs/N也等于1/窗口秒數。Fs1000 Hz、N1000時分辨率1 Hz若N200分辨率5 Hz。提高采樣率但保持窗口秒數不變時N同步增大頻率分辨率不變只是可觀察的最高頻率提高。真實頻率不一定正好落在頻點上有限窗口會產生頻譜泄漏。Hann窗讓窗口兩端平滑接近零降低旁瓣泄漏但會改變幅度和等效噪聲帶寬。訓練與MCU必須使用相同窗函數和幅值標定。實數輸入的頻譜具有共軛對稱通常只使用0到Fs/2。CMSIS-DSP實數FFT輸出采用特定打包格式讀取幅值時要按文檔處理DC、Nyquist和復數對不能把數組直接當普通實數幅度。頻點k對應頻率 f? k×Fs/N頻率分辨率 Δf Fs/N 1/Twindow頻帶能量和MFCC分別壓縮什么信息頻帶能量把多個FFT頻點求和例如050 Hz、50100 Hz和100200 Hz。它減少輸入維度并容忍峰值輕微漂移適合轉速變化范圍已知的機械信號。頻帶邊界應來自任務頻率與采樣率不應隨意等寬。MFCC面向聲音感知預加重可選分幀加窗后求功率譜再經過Mel濾波器組、取對數和DCT得到譜包絡系數。它弱化精確諧波位置突出人耳頻率尺度上的形狀常用于關鍵詞與環境聲音。MFCC包含大量參數幀長、幀移、FFT點數、Mel濾波器數量、頻率上下限、對數底和保留系數數。任何一項不同都會改變張量。部署前用固定音頻幀逐階段比較窗后波形、功率譜、Mel能量和最終系數。三類頻域輸入的選擇線索表示適合證據主要配置FFT幅度明確頻率和諧波Fs/N/窗函數/幅值頻帶能量頻率范圍與總能量頻帶邊界與歸一化MFCC聲音譜包絡幀、Mel、log、DCT五、落地檢查由任務頻段確定采樣率和窗口時長。固定FFT長度、窗函數、幅值縮放和單邊譜規則。比較完整頻譜與頻帶能量的模型效果和資源。聲音任務記錄Mel濾波器組、對數下限和DCT系數數目。使用黃金窗口核對PC與MCU每一級輸出。動手從雙頻波形得到FFT峰值和頻帶能量腳本生成10 Hz與27 Hz兩種正弦疊加的信號使用Hann窗并直接計算單邊DFT功率。隨后列出最強頻點和三個頻帶能量比例。N100計算量足夠小代碼便于理解。實驗環境與輸入Python 3標準庫。保存為 spectrum_bands.py 并運行。DFT為教學實現MCU實際項目可使用CMSIS-DSP FFT內核。按順序完成實驗運行腳本確認最強頻點接近10 Hz和27 Hz。觀察015 Hz與1535 Hz頻帶包含主要能量。把27 Hz改成27.5 Hz比較頻譜泄漏和相鄰頻點。把N從100改成200并保持Fs100說明窗口加倍后頻率分辨率從1 Hz變成0.5 Hz。可直接運行Hann窗、單邊DFT和頻帶能量import mathFS 100N 100signal [0.8*math.sin(2*math.pi*10*n/FS) 0.4*math.sin(2*math.pi*27*n/FS) for n in range(N)]hann [0.5-0.5*math.cos(2*math.pi*n/(N-1)) for n in range(N)]windowed [x*w for x, w in zip(signal, hann)]power []for k in range(N//2 1):real sum(x*math.cos(2*math.pi*k*n/N)for n, x in enumerate(windowed))imag -sum(x*math.sin(2*math.pi*k*n/N)for n, x in enumerate(windowed))power.append(real*real imag*imag)peaks sorted(range(1, len(power)), keypower.__getitem__, reverseTrue)[:4]print(strong bins:, [(round(k*FS/N, 2), round(power[k], 1)) for k in peaks])bands [(0, 15), (15, 35), (35, 50.1)]total sum(power[1:])for low, high in bands:energy sum(p for k, p in enumerate(power)if low k*FS/N high and k 0)print(fband {low:4.1f}-{high:4.1f} Hz: {energy/total:.1%})先讀懂代碼中的關鍵路徑Hann窗逐點乘輸入降低窗口邊界突變造成的遠端泄漏。DFT輸出功率使用real2imag2頻帶能量在相同定義下求和。忽略DC頻點能避免基線占據總能量是否去DC取決于任務。頻帶使用左閉右開區間邊界頻點只進入一個頻帶。你應該觀察到什么最強頻點列表包含10 Hz和27 Hz附近10 Hz能量更大。前兩個頻帶占據絕大多數能量35 Hz以上頻帶接近零但受窗和數值影響不會嚴格為零。非整數頻率會把能量分散到相鄰頻點Hann窗降低遠處泄漏。成功標準你能從Fs、N和k計算頻率并明確單邊譜范圍。頻帶邊界與任務頻率相關PC與MCU使用相同窗函數和歸一化。FFT或MFCC的預處理時間與工作區進入板端資源預算。失敗時從哪里查起頻域實現常見錯誤現象原因處理峰值頻率翻倍或減半Fs或FFT長度寫錯打印Fs、N和頻點映射PC與MCU幅值比例不同窗增益或單邊譜縮放不同統一幅值定義并用單頻黃金信號MFCC完全不一致Mel邊界、log或DCT參數不同逐階段比較中間數組先用單頻、雙頻和全零輸入驗證頻域實現再進入真實聲音或振動數據可以大幅降低排錯復雜度。把實驗遷移到真實MCU項目CMSIS-DSP RFFT的輸出布局、縮放和數據類型與教學DFT不同。使用單頻黃金信號先確認峰值頻點再確認幅值和頻帶比例。MFCC移植要逐階段對齊窗后波形、功率譜、Mel能量、log和DCT。最終系數錯時從最早不同數組開始查。把結果再向前推進一步計算16 kHz、400點幀的幀長和頻率分辨率。根據一個機械任務設計三個非等寬頻帶并說明邊界來源。列出MFCC從波形到系數的每個階段及其版本參數。這篇文章的結論FFT、頻帶能量和MFCC分別保留頻點、頻段和譜包絡信息。選擇依據是任務物理特征、數據驗證和MCU資源。參考資料Arm CMSIS-DSP 官方文檔Arm CMSIS-DSP Real FFT 文檔更新時間2026 年 8 月 5 日