📖 互動式學習講義 · Interactive Lecture

特徵產生 II 好好玩

Feature Generation II — from Theodoridis & Koutroumbas, Pattern Recognition, Ch. 7

這一頁要帶你用「看圖說故事」的方式,學完第七章的全部重點:怎麼把一張圖、一段聲音,濃縮成電腦能懂、能分辨的「特徵數字」。中間穿插 7 個可動手玩的互動示範,配合後面的 Python 筆記本,學完馬上能用。

2 大主線影像 ⚡ 聲音
7 個互動 Demo
3 本手把手筆記本
★→★★★由易到難
PART 0

開始之前:這份講義怎麼用?

How to use this lecture

這是一份「自學即戰力」導向的教材,不是教科書閱讀器。請照這個節奏使用:

① 讀「白話講解」
每節先用生活語言解釋「這是什麼、為什麼需要、數字大小代表什麼」。公式只要求「看懂它算什麼」,不要求推導。
② 玩「互動 Demo」
藍色邊框的區塊都可以動手玩:點按鈕、拉滑桿、在畫布上畫圖。動手玩過的印象,比讀十遍深刻。
③ 跑「Python 筆記本」
每個 Part 對應一本筆記本(handson/ 資料夾),逐格執行,把概念變成你真的會寫的程式。
💡 搭配「00-知識地圖.md」使用:地圖是學習路線圖,這份講義是路線站牌,筆記本是每個站的實習課。三者合一,3–4 週內完成。
🗺️

知識地圖(路線總覽)

Knowledge map

主線 A(影像特徵 7.2–7.4)與主線 B(音訊特徵 7.5)各自獨立;先看地圖定位,再往下逐 Part 學習。完整版本(含學習基石與知識卡)見 00-知識地圖.md。

2026-08-22T17:47:52.547427 image/svg+xml Matplotlib v3.10.6, https://matplotlib.org/

八站路線(★ 必學核心)

站主題難度時數動手(筆記本)
0Python 熱身★1hnb0
1★ R0 為什麼要特徵 + A1 一階統計★2hnb1
2★ A2 共生矩陣 + A3 游程★★3hnb1(對課本 7.8/7.12)
3A4 Laws + A5 Hu 不變矩(+A6 Zernike)★★3hnb2
4★ 形狀:A8 傅立葉描述子・A9 鏈碼・A10 幾何★★3hnb2
5★ B1 切幀/窗 + B4 頻譜 + B5 時域★★3hnb3
6★ B2 倒頻譜 + B3 MFCC(王者)★★★3hnb3(手刻 MFCC)
7✚ A7 AR 模型・A11 碎形(選修)★★★2hnb2 附錄
8🏆 即戰力迷你專案★★★4hnb4(紋理 kNN 96.7%/拍手 100%)
PART 1

為什麼需要特徵?難度 ★

Why features? — the core problem

想像這個處境:你拿到一張 64×64 的小圖。對電腦來說,它是 4,096 個數字(每個像素一個亮度值)。問題來了:

  • ❌ 計算上:4,096 維的資料,分類器光是存、算就很吃力;圖再大一點(例如百萬畫素)直接爆炸。
  • ❌ 泛化上:資料維度越高,要撐起模型需要的訓練樣本就越多(「維度詛咒」)。樣本一少,模型就過擬合——考試考過的才會,沒考過的全錯。
✅ 解法:特徵產生(Feature Generation)——算出一組「新變數」,把原始像素裡「對分類有用」的資訊濃縮打包成少量數字。課本說:特徵要具備「高資訊壓縮性」且從「類別可分離性」出發(high information-packing, class separability)。白話:數字少、但每一顆子彈都要打得準。
I(m,n) → [f1, f2, …, fk]特徵產生 → 「這是哪一類?」分類器
特徵產生 → 特徵向量 → 分類器 → 類別判斷

本章的兩大戰場

🖼️ 戰場 A:影像(7.2–7.4)

「讀取」圖片裡的區域資訊(紋理:平滑或粗糙?)與物體形狀(輪廓:圓的?有幾個洞?)。代表應用:醫學影像、遙測衛星、機器人視覺、光學字元辨識 OCR。

🎧 戰場 B:聲音(7.5)

「聽取」音訊的頻譜與時間結構(有多亮?音高多少?是穩定的樂音還是雜訊?)。代表應用:語音辨識、音樂類型分類、影片內容檢索。

🎬 這章的時代背景(讀懂它 = 讀懂現代 AI):課本這章是「手工特徵」時代的集大成。深度學習(CNN)出現後,很多特徵變成「讓網路自己學」。但這不代表這章過時——因為:① 傳統特徵在工業視覺、嵌入式系統仍大量服役;② CNN 學的「特徵圖」本質上就是這章概念的進化版(卷積核 ≈ Laws 遮罩);③ 音訊領域的 MFCC 至今仍是業界標準。所以這章是「看懂現代 AI 大樓的鋼筋」。
PART 2

影像紋理特徵 難度 ★–★★

Regional features for texture characterization

「紋理(texture)」沒有嚴格定義,但我們都會說:這張圖看起來粗或細、平滑或粗糙、均勻或雜亂。本 Part 教你把這些「感覺」變成數字。

2.1 一階統計:直方圖家族 必學

做法只有三步:把圖片區域的每個像素亮度值拿出來 → 統計「每個灰階值出現的比例」得到直方圖(histogram)→ 從直方圖算出幾個數字當特徵。

$$P(I)=\frac{\text{count of pixels with gray level }I}{\text{total pixels in region}}$$
(7.1) 直方圖 = 灰階值 I 出現的機率(比例)
特徵公式留印象白話意義數字大代表…
平均值 Mean$m_1 = E[I]$整體亮度畫面偏亮
變異數 Variance$\mu_2 = \sigma^2$亮度的分散程度明暗差異大
偏斜度 Skewness$\mu_3$直方圖左右不對稱大多偏暗(或偏亮)
峰態 Kurtosis$\mu_4$直方圖的高瘦/矮胖高瘦 = 灰階集中在某些值
熵 Entropy$H=-\sum_I P(I)\log_2 P(I)$灰階的「豐富度」直方圖越均勻 → 熵越高
🧠 口訣:一階統計 = 只看亮度值本身,完全不看位置。所以兩張圖就算亮度分布一模一樣、只是排列不同,一階統計也會「看走眼」——這正是下一節二階統計登場的理由。
互動 Demo 1|直方圖的五種個性選一種「個性」,看直方圖與算出的數字

2.2 二階統計:共生矩陣 核心必學 ★★

升級思路:一階統計漏掉了「空間關係」。共生矩陣(co-occurrence matrix / 空間相依矩陣)補上這個洞——它統計:在「距離 $d$、方向 $\phi$」的相對位置上,灰階值 $(i,j)$ 的像素對出現的機率。

$$P(I_1,I_2)=\frac{\text{count of pairs }(I_1,I_2)\text{ at distance }d\text{, orientation }\phi}{\text{total pairs }R}\qquad(7.6)$$
(7.6) 距離 d、方向 phi(0°/45°/90°/135°)下,灰階值 (I1,I2) 像素對出現的機率。

方向 $\phi$ 有四種:0°(水平)、45°(主對角)、90°(垂直)、135°(反對角);距離 d 通常先取 1(相鄰像素)。

四個方向
課本 Fig. 7.2:建立共生矩陣的四個方向

從共生矩陣算特徵(Haralick 家族的四大天王)

特徵公式白話粗紋理 / 平滑圖
ASM 角二階矩
Angular 2nd Moment
$\sum_i\sum_j P(i,j)^2$矩陣的「集中度」=平滑度粗圖低、平滑圖高(→1)
CON 對比度
Contrast
$\sum_n n^2\sum_{|i-j|=n}P(i,j)$鄰近像素亮度差多大粗糙圖很高(如 989!)
IDF 反差分矩
Inverse Diff. Moment
$\sum_i\sum_j\frac{P(i,j)}{1+(i-j)^2}$反过来的對比度平滑圖高(→0.78)
熵 Entropy$-\sum_i\sum_j P(i,j)\log_2 P(i,j)$排列的隨機性平滑圖低、粗糙圖高
🎯 課本 Table 7.2 的實測數字(Fig. 7.3 的 grass 粗紋理 vs 平滑圖):CON:989.5 vs 0.613——對比度差了一千多倍!這就是「特徵具有區辨力」最好的示範。
📌 實務細節:完整 Haralick 特徵共 14 個(課本 Table 7.1,含 Correlation、Sum/Difference 系列等)。實務上常把 4 個方向的值平均,讓特徵對「影像旋轉」比較不敏感(rotation tolerant)。
互動 Demo 2|親手算共生矩陣課本 4×4 範例圖:選方向 → 看矩陣;點矩陣格子 → 反查是哪幾對像素
方向: 距離:

繪製中的藍色點對 = 你在右邊矩陣點選的格子 (i,j) 對應的像素對

共生矩陣 $A$(4×4,數值 = $\eta_{ij}/R$)

✅ 0°(水平)的結果與課本 (7.8) 完全一致(R=24)。45°/135° 的課本印刷範例矩陣在不同版本間方向定義略有出入——重點是方法:都是「數像素對 → 除以總對數」。點矩陣格子反查像素對,最多能看懂的就會懂 😉

2.3 灰階游程(Run-Length)必學 ★☆

另一種看空間關係的方法:沿著某個方向掃過圖片,把「連續相同灰階的像素串」叫做一個游程(run)。統計「灰階 i 出現長度為 j 的游程有幾次」→ 得到游程矩陣 $Q_{RL}(i,j)$ → 從中算特徵。

$$\underbrace{SRE=\frac{\sum_{i,j} Q_{RL}(i,j)/j^{2}}{\sum_{i,j}Q_{RL}(i,j)}}_{\text{short-run weighted}}\qquad \underbrace{LRE=\frac{\sum_{i,j} Q_{RL}(i,j)\,j^{2}}{\sum_{i,j}Q_{RL}(i,j)}}_{\text{long-run weighted}}$$
(7.14)(7.15) SRE:短游程加權 → 粗糙圖數值大;LRE:長游程加權 → 平滑圖數值大。

還有 GLNU(灰階不均勻度)、RLN(游程長度不均勻度)、RP(游程比例)。

Fig 7.3 實測(課本 Table 7.3)SRELREGLNURLNRP
粗紋理(grass)0.9321.349255.631080.906
平滑0.56316.92971.65070.4
🧠 口訣:平滑圖 = 長游程多(LRE 爆高);粗糙圖 = 短游程多(SRE 高)。直覺到不行!
互動 Demo 3|游程矩陣動手算同一張 4×4 圖,換方向看游程矩陣與特徵值
方向: (對課本 (7.12)/(7.13) 的 0° 與 45° 結果)
游程矩陣 Q_RL(列 = 灰階 0–3,欄 = 游程長度 1–4)

2.4 區域線性轉換:Laws 遮罩 必學 ★★

一句話:用 9 個 3×3 的「濾鏡(遮罩 mask)」掃過圖片,每個濾鏡抓一種紋理性質,得到 9 張「特徵圖」,再從特徵圖算一階統計當特徵。

$$\boldsymbol{y}_{mn}=A^{T}\boldsymbol{x}_{mn}\qquad (7.19)\ \text{each } y = \text{filtering of the } N\times N \text{ neighborhood by one mask}$$
每個 y 元素 = 用一個 mask 對 N×N 鄰域做卷積(filtering)。

9 個 mask 由三條基本向量兩兩交叉相乘產生:[1,2,1]=局部平均(平滑)、[−1,0,1]=邊緣偵測、[−1,2,−1]=斑點偵測:

1 2 1
2 4 2
1 2 1
−1 0 1
−2 0 2
−1 0 1
−1 2 −1
−2 4 −2
−1 2 −1
−1 −2 −1
0 0 0
1 2 1
1 0 −1
0 0 0
−1 0 1
1 −2 1
0 0 0
−1 2 −1
−1 −2 −1
2 4 2
−1 −2 −1
1 0 −1
−2 0 2
1 0 −1
1 −2 1
−2 4 −2
1 −2 1
Laws masks filtering
課本 Fig. 7.4:每個 mask 產生一張新的特徵圖(channel)
🧠 精髓一句(課本原話):「紋理的空間相依性,可以被吸收進轉換後影像的一階統計裡」——把「二階資訊」巧妙地藏進「一階數字」。看懂這一句,你就看懂了卷積神經網路為什麼有效。
PART 3

影像形狀特徵 難度 ★★–★★★

Features for shape & size characterization

場景切換:現在我們不管紋理了,專注在物體的輪廓形狀。業界動機:醫學影像靠「形狀不規則 → 惡性腫瘤機率高」判讀;OCR 靠形狀認字——而且都要能不在乎物體的位置、大小、旋轉。

3.1 矩(Moments)與 Hu 七不變矩 核心必學 ★★

把影像當成一塊「蛋糕」:亮度值 = 密度。矩就是蛋糕的各種統計量——質心(一階矩)、「轉動慣量」(二階矩)等等。重點是課本證明了:矩可以完全重建回影像(資訊零流失),所以它是優良特徵。

幾何矩 $m_{pq}=\iint x^{p}y^{q}I(x,y)\,dx\,dy\quad (7.21)$  →  中心矩 $\mu_{pq}$(平移不變)$(7.22)$  →  正規化 $\eta_{pq}$(平移+縮放不變)$(7.23)$
Hu 的魔法 (1962):把 $\eta$ 組合成 7 個式子 $\phi_1..\phi_7$ → 平移、縮放、旋轉全都不變。數碼影像上只是「近似不變」(網格採樣誤差),實務上取 log 用。

七個 $\phi$ 的家庭成員

  • $\phi_1=\eta_{20}+\eta_{02}$:二階矩的「總量」
  • $\phi_2=(\eta_{20}-\eta_{02})^2+4\eta_{11}^2$:形狀的「方向性」
  • $\phi_3..\phi_7$:三階矩的組合,捕捉不對稱與細節
  • 🎭 $\phi_7$ 的祕密:鏡射會讓它變號 → 用它可以偵測「是不是鏡像」
petasti
課本 Fig. 7.5「petasti」符號的各種變形版

Table 7.4 實測:縮放、旋轉 15°/90°/180° 後 $\phi_1..\phi_6$ 幾乎不變(93.13 → 94.28…);唯獨鏡射版 $\phi_7 = −0.53$ 變號!

互動 Demo 4|畫一個形狀,考考 Hu 矩在畫布上畫圖(或載入預設造型)→ 旋轉/縮放/鏡射 → 看 $\phi$ 值多穩定
(模式:畫筆)

🖱️ 在灰色畫布上按住滑鼠畫圖(白色=前景)

Hu 不變矩目前原始誤差 %
$\phi_1$–––
$\phi_2$–––
$\phi_3$–––
$\phi_4$–––
$\phi_5$–––
$\phi_6$–––
$\phi_7$–––

3.2 Zernike 矩(進階選修)選修 ★★★

幾何矩的小毛病:它的基底函數 $x^p y^q$ 彼此「不垂直」(非正交)→ 資訊會重複。Zernike 矩改用單位圓內的正交多項式當基底 → 資訊不重複、旋轉不變性更好、抗雜訊更強(字元辨識實測勝過 Hu)。代價:徑向多項式計算較複雜。

$$A_{pq}=\frac{p+1}{\pi}\iint_{x^2+y^2\le 1} I(x,y)\,V^{*}_{pq}(\rho,\theta)\,dx\,dy \qquad V_{pq}=R_{pq}(\rho)e^{jq\theta}$$
V 為 Zernike 多項式(單位圓內的正交基底);|A_pq| 對旋轉不變。
🚀 Python 只要一行:skimage.measure.zernike_moments(img, degree)(筆記本 2 會玩)。

3.3 AR 參數模型(進階選修)選修 ★★★

換一個世界觀:前面的特徵都是「從影像算數字」。AR 模型反過來——假設影像/訊號是被某個「產生機制」製造出來的,而機制本身可以被「線性預測 + 隨機擾動」描述:

$$I(n)=\underbrace{\sum_{k=1}^{p}a(k)\,I(n-k)}_{\text{past }p\text{ samples}}\ +\ \underbrace{\eta(n)}_{\text{prediction error (white noise)}}\qquad (7.26)\ \text{AR}(p)$$
(7.26) AR(p) 自迴歸模型:用過去 p 個樣本預測現在+預測誤差(白雜訊);參數 a(k) 本身可當特徵。

參數 $a(1)..a(p)$ 本身 = 特徵——不同紋理/不同聲音有不同「產生機制」,參數就不同。求解 = 最小化預測誤差 → 解線性方程 $R a_p = r_p$(7.31)。矩陣 $R$ 是 Toeplitz 結構 → 有 Levinson 快速演算法 $O(p^2)$。

AR model
課本 Fig. 7.7:白雜訊經過「線性系統」產生出我們觀察到的訊號
🎤 偷偷告訴你:語音編碼界的 LPC(線性預測編碼)就是 AR 模型的親戚——手機講電話,就是靠把「AR 參數 + 誤差」傳給對方再重建聲音。筆記本 2 附錄會驗證課本 Example 7.4。

3.4 傅立葉描述子 必學 ★★

把輪廓當「訊號」處理:沿輪廓取 N 個點 $(x_k,y_k)$,組合成複數 $u_k=x_k+jy_k$,對這串複數做 DFT → 係數 $f_l$ 就是傅立葉描述子(Fourier descriptors)。超棒的性質(課本 7.41 附近):

幾何變換對傅立葉係數的影響→ 不變性的做法
平移只動 $f_0$丟掉 $f_0$ 不用
旋轉全部係數乘 $e^{j\theta}$(只轉相位)用大小 $|f_l|$
縮放全部係數等比例放大用比值 $f_i/f_j$
取樣起點不同相位平移正規化 $\hat{f}_l=f_l e^{jl\phi_1}$(7.42)
🧠 更驚人的是:只用前幾個係數就能重建出輪廓的大致形狀(低頻管大形狀、高頻管細節)→ 等於「壓縮」了輪廓。這就是「再生式(regenerative)描述」。

3.5 鏈碼(Chain Codes)必學 ★☆

把輪廓翻譯成「方向語言」:沿輪廓一步一步走,每一步用數字記錄方向(4 方向碼或 8 方向碼:0=右、1=右上、2=上…)。整條輪廓 = 一串方向編號,叫鏈碼。

chain directions
課本 Fig. 7.11:(a) 4 方向碼 (b) 8 方向碼
chain code example
課本 Fig. 7.12:粗網格重新取樣後產生鏈碼

鏈碼的兩個弱點與解藥:① 編碼很長 → 用方向出現次數比例(8 個方向 → 8 個特徵)當摘要;② 對雜訊敏感 → 先用較粗網格重新取樣再編碼。曲率特徵:統計「凸角(外角 <180°)」「凹角」出現比例(共 16 個特徵)。

互動 Demo 5|輪廓如何變成鏈碼點「下一步」逐段追蹤:灰線 = 已走過的輪廓,綠點 = 目前位置

為了一個簡單的「L 形」輪廓(5×5 網格),我們用 8 方向鏈碼編碼它的外緣。開始吧!

3.6 幾何特徵 必學 ★

最直覺的形狀特徵,全部一筆算出(筆記本 2 用 skimage.measure.regionprops 一次拿齊):

特徵公式用途
周長 Perimeter$P=\sum_i\|\mathbf{x}_{i+1}-\mathbf{x}_i\|$大小估計
面積 AreaA = 區域內像素數大小估計(課本:肺結節周長 >3cm → 惡性機率高!)
圓度 Roundness$\gamma=\frac{P^2}{4\pi A}$圓形時 =1;越扁越大——「不規則邊界 → 惡性」的量化
方向 Orientation$\theta=\frac{1}{2}\tan^{-1}\left(\frac{2\mu_{11}}{\mu_{20}-\mu_{02}}\right)$物體主軸角度(最小慣性軸)
離心率 Eccentricity$\varepsilon=\frac{(\mu_{20}-\mu_{02})^2+4\mu_{11}}{A}$拉長程度
孔洞數 Holes—🎯 區分「8」和「0」的關鍵(外觀一樣圓!)
OCR 5
課本 Fig. 7.9:OCR 管線——分割 → 二值化 → 取邊界,接下來就能抽形狀特徵
PART 4

碎形:量不準的曲線 難度 ★★ 選修

A glimpse at fractals

先來個小魔術:海岸線的長度,用 1 公里的尺量是 X 公里;換成 100 公尺的尺,會量出更長!尺越細,長度越長,趨近無限大。這不是測量誤差——而是因為海岸線真的「每一段放大都長得跟原本一樣」:自相似性(self-similarity)。

碎形維度(相似維度):$$D=\frac{\ln N}{-\ln m}\qquad (7.47)$$
N = 縮小後能拼回原形的份數;m = 縮放比。直線:D=1(切成 2 段、比 1/2);平面正方形:D=2。Koch 曲線:每步放大 3 倍變 4 段 → D = ln4/ln3 ≈ 1.26——介於 1 和 2 之間,一條「比線還滿」的曲線。
Koch curve stages
課本 Fig. 7.15:線段、正方形與 Koch 曲線的自相似結構
🧠 為什麼影像辨識要用碎形?→ 碎形維度是「表面粗糙度」的量化指標:山脈、雲、樹木這些自然紋理的 D 值有統計規律,可當分類特徵;課本接著介紹的分數布朗運動(fBm, fractional Brownian motion)則是用機率方式生成「帶有碎形性質」的隨機訊號(Hurst 參數 H 控制粗糙度)。
⚠️ 選修理由:工作上「直接算碎形維度」的機會不算多(大多被深度學習取代),但這是面試時「加分題」等級的知識,而且 Koch 雪花很美,先玩再說。
互動 Demo 6|Koch 雪花產生器拉滑桿增加遞迴深度——注意周長怎麼「越算越長」
遞迴深度: 3 現在周長 ≈ – 單位 (起點邊長 = 1 → 每次 ×4/3)
PART 5

音訊特徵:讓電腦「聽懂」聲音 難度 ★–★★★

Typical features for speech & audio classification

應用場景:語音辨識、音樂類型分類、影片槍戰場景偵測(聽槍聲!)、哼歌找歌。核心挑戰:聲音是「一直在變」的訊號,我們要想辦法把它變成可分類的特徵。

5.1 前置:短時處理與窗函數 必學 ★

問題:傅立葉轉換(頻譜分析)只對「統計性質不變」的平穩訊號有效,但語音/音樂隨時在變(「非平穩」)。

解法(聰明又樸素):把聲音切成一幀一幀(frame,約 10–50 ms),假設每幀內「大致穩定」(準平穩 quasistationary),就可以對每幀放心做頻譜分析。切幀 = 乘上一個「窗函數」(矩形窗最樸素;Hamming 窗兩端平滑收斂,減少頻譜洩漏)。

$$\text{Hamming window:}\ w(n)=0.54-0.46\cos\Big(\frac{2\pi n}{N-1}\Big)\qquad \text{frame } i:\ x_i(n)=x(n+m_i)\,w(n)$$
Hamming 窗(兩端平滑收斂 → 減少頻譜洩漏);幀 i = 原始訊號 × 窗。
訊號類型取樣率合理幀長對應時間
語音10 kHz100–200 點10–20 ms
音樂44.1 kHz2048–4096 點45–95 ms
🎨 課本明言:幀長選擇是「一門藝術」——太短看不出週期性(音高),太長又破壞「穩定」假設。
frames
課本 Fig. 7.19:連續三幀(N=20,重疊 5 點)
互動 Demo 7|切幀 + 窗函數視覺化拉滑桿移動幀的位置與長度,比較矩形窗 vs Hamming 窗
窗類型: 幀起點: 幀長 N:

原始訊號 + 目前幀的位置(綠色框)

被窗函數「切」出來的幀(乘上窗的結果 = 綠色實線,窗形 = 灰色虛線)

🎧 這是一個「兩段音樂」的合成訊號:前 40% 是穩定的弦音(正弦波),後面是快速變化的琶音。注意 Hamming 窗如何讓幀的兩端平滑地收斂到零。

5.2 倒頻譜 Cepstrum 必學 ★★

一個超棒的數學魔術:我們聽到的聲音 = 「聲帶製造的聲源」×「嘴型(聲道)的濾波效果」。在時間域它們是相乘(卷積),不好分開;但若對頻譜取 log,乘法就變成加法,再反傅立葉一次,兩者會自動分家、住到不同的位置:

$$c(n)=\frac{1}{2\pi}\int_{-\pi}^{\pi}\underbrace{\log_{10}|X(\omega)|}_{\text{spectrum log}}\ e^{j\omega n}\,d\omega\qquad (7.60) \quad\Rightarrow\quad \boxed{\text{cepstrum} = \text{inverse FT of }\log|X(\omega)|}$$
倒頻譜 = 頻譜取 log 後再逆傅立葉——把「乘法變加法」,分離聲源與聲道。

實作 4 步(課本 7.5.2 結尾):① 幀尾補零(512–1024 個,減少 aliasing)→ ② 做 M 點 DFT → ③ 對大小取 log → ④ 逆 DFT → 得到倒頻譜係數。

💡 倒頻譜係數的「資訊壓縮」能力極好,是語音辨識與音訊分類的超級候選特徵。

5.3 梅爾倒頻譜 MFCC 王者必學 ★★★

人耳的真相:我們對頻率的感受不是線性的——1000 Hz 以下線性,以上變對數(課本 Fig. 7.21:10 kHz 的純音,聽起來只比 1 kHz「高三倍」→ 3000 mel)。另外人耳有「臨界頻帶」:太靠近的兩個音分不出來。MFCC 就是模仿人耳來設計特徵:

$$f_{mel}=2595\log_{10}\Big(1+\frac{f}{700}\Big)\qquad (7.65)\ \text{mel scale}$$
mel 刻度:模仿人耳「低頻線性、高頻對數」的頻率感受(1 kHz ↔ 1000 mel)。
  1. 每一幀做 DFT(記得先補零)
  2. 在 mel 刻度上均勻放 L 個三角濾波器(組成一組濾波器組 filter bank),繞回線性頻率時自然變成「低頻密集、高頻稀疏」
  3. 對每個濾波器:計算帶內 log|X(m)| 的加權平均(課本 7.67)→ 得到「人耳版頻譜」
  4. 對這個序列做逆 DFT(實務上用 DCT)→ 梅爾倒頻譜係數 MFCC
mel filter bank
課本 Fig. 7.22:L=35 個臨界頻帶(只示前 17 個)
mel scale
課本 Fig. 7.21:mel 刻度曲線
🧠 一句話記住 MFCC:「把頻譜重新排列成人耳的聽法,再壓縮成幾個係數」。它是語音助理、音樂分類、聲紋辨識的標準配備——業界價值五顆星。
互動 Demo 8|Mel 濾波器組是怎麼排的?拉滑桿調整濾波器數量,看三角濾波器在 mel 刻度上等距、在頻率軸上「低密高疏」
濾波器數量 L: 12

上圖:線性頻率軸上的三角濾波器;下圖:同一組濾波器攤在 mel 刻度上(等距!)。

5.4 頻譜特徵 必學 ★★

特徵公式白話=它量什麼
Spectral Centroid
頻譜重心
$C(i)=\frac{\sum_m m|X_i(m)|}{\sum_m |X_i(m)|}$能量偏重高頻還低頻?高 →「明亮」的聲音
Spectral Roll-off
頻譜滾降點
$\sum_{m=0}^{m_c^R(i)}|X_i(m)|=\frac{c}{100}\sum_m|X_i(m)|$($c$ ≈ 85–90)頻譜的「歪斜」程度,另一個能量位置指標
Spectral Flux
頻譜通量
$F(i)=\sum_m\big(N_i(m)-N_{i-1}(m)\big)^2$相鄰兩幀頻譜變化量 → 聲音「變得多快」(= 事件邊界偵測神器)
Fundamental Freq.
基頻(音高)
$f_0$:頻譜峰值頻率的 $\mathrm{GCD}$(Schroeder 法)樂器/濁音的基本週期(男聲 80–200 Hz、女聲 150–350 Hz)。課本 Fig 7.23 單簧管範例:基頻 230 Hz 居然不在頻譜上,但耳朵與演算法都聽得出來!

5.5 時域特徵 必學 ★

特徵公式白話
Zero-Crossing Rate
零交越率 ZCR
$Z(i)=\frac{1}{2N}\sum_n|\mathrm{sgn}[x_i(n)]-\mathrm{sgn}[x_i(n-1)]|$訊號穿越零線的頻率 → 「吵雜程度」(清音/雜訊高,濁音/樂音低)
Energy 能量$E(i)=\frac{1}{N}\sum_n |x_i(n)|^2$大小聲 → 分「有聲/無聲/清音/濁音」

實戰示範:拍手聲 vs 鋼琴(課本 7.5.6)

clap ZCR
拍手聲的 ZCR:跳來跳去、像雜訊
piano ZCR
鋼琴(巴哈英國組曲)的 ZCR:平穩、有結構
🎯 結論很好用:ZCR 與基頻追蹤的「穩定度」就能區分「雜訊型聲音 vs 樂音型聲音」——不用神經網路,閾值規則就做得起來。這就是 7.5.6 的示範要義。
📌 更高一層:以上都是「幀級特徵」(每幀一個值)。要抓「語意」得看特徵隨時間的軌跡(如 ZCR 軌跡的均值/變異數當特徵——Tzanetakis 音樂類型分類的經典做法)。
PART 6

動手實作:三本筆記本 + 兩個迷你專案

Hands-on labs

讀講義只能懂 30%,跑完筆記本才是真的會。所有筆記本都在 handson/ 資料夾,逐格執行(Shift+Enter),每個練習都附「你應該看到什麼」的解說。

📓 Notebook 1|紋理特徵

合成 3 類紋理圖 → 一階統計 → 共生矩陣(手寫 + graycomatrix 對照)→ 游程特徵 → Laws 9 遮罩。

對應 Part 2

📓 Notebook 2|形狀特徵

Hu/Zernike 矩的旋轉縮放測試 → 傅立葉描述子(前 10 係數重建輪廓)→ 鏈碼 → regionprops 幾何特徵 → 附錄:AR 模型 + Koch 雪花。

對應 Part 3–4

📓 Notebook 3|音訊特徵

合成訊號 → 切幀/窗函數 → 頻譜特徵(centroid/rolloff/flux)→ ZCR/能量 → 手刻 MFCC + librosa 對照 → 音高估計。

對應 Part 5

🏆 兩個迷你專案(驗收即戰力)

專案 A:紋理分類器

用 Notebook 1 的知識,把「平滑/粗糙/條紋」三類紋理圖抽成特徵向量 → 用 kNN 分類 → 畫出特徵空間散佈圖,證明「特徵真的能把類別分開」。

專案 B:拍手聲 vs 鋼琴聲判別器

合成「脈衝聲」與「和絃聲」,算 ZCR/頻譜通量/MFCC 軌跡 → 用閾值規則判別 → 畫出兩者的特徵軌跡對比圖。

完成這兩個專案,你就拿到了本章的「即戰力徽章」:給我一張圖 / 一段聲音 → 我能抽出關鍵特徵 → 交給分類器。這正是影像/多媒體工程師的基本功。
⚠️ 環境安裝(一次就好):Python ≥ 3.9,執行 pip install numpy matplotlib scikit-image scipy jupyter(音訊章節可再加 librosa,沒裝也能跑,筆記本有純 NumPy 版)。
PART 7

學完之後:職業延伸路線圖

Career roadmap
2026-08-22T17:49:10.602396 image/svg+xml Matplotlib v3.10.6, https://matplotlib.org/

▲ 箭頭 = 發展路徑:先到「中繼站」補齊機器學習理論(課本 Ch3–Ch5),再選一條主線深耕,最終匯入多媒體/AI 系統開發與技術創新。

給你的練功心法(避坑指南)

  • 不背公式,只問「這算式在算什麼?數字大代表什麼?」——能回答這兩個問題,公式就活了。
  • 每一站至少 30 分鐘動手——筆記本都幫你備好了,改參數、觀察變化,比多讀十頁有效。
  • 不急著跳深度學習——把手工特徵玩熟,你會發現 CNN 的一切都似曾相識(卷積核 = 自動學的 Laws 遮罩)。
  • 一天一站——站與站之間隔一晚,睡眠是免費的學習加速器(間隔效應)。
  • 用自己的話解釋一次——講義每節的「口訣」都是示範,試著自己發明口訣(費曼技巧)。