索引 / 001 ZH-TW
Think DSP: Digital Signal Processing in Python(Think DSP:用 Python 學數位訊號處理) cover

工程學

工程學

Think DSP: Digital Signal Processing in Python(Think DSP:用 Python 學數位訊號處理)

Allen B. Downey

英文原名: Think DSP: Digital Signal Processing in Python

一本簡短、以計算為導向的訊號與系統入門,透過 Python 程式碼而非從數學推導開始教學。唐尼以聲音為主要範例,示範如何產生、分析與濾波訊號,並藉由讀者可以執行和修改的實驗,引入傅立葉轉換、摺積與線性非時變系統。Green Tea Press 提供的免費 PDF(1.1.4 版)與 O'Reilly 印刷版是同一文本。

需要的基礎: 基本的 Python 程式設計能力,熟悉代數與複數;懂微積分有幫助但非必要。

難度等級
入門
學術層次
大學部
signal processingfourier analysisfilteringpython入門

01 / 導讀

導讀

引用

Downey, A. B. (2016). Think DSP: Digital Signal Processing in Python (Version 1.1.4). Green Tea Press. Free official edition: https://greenteapress.com/wp/think-dsp/

章節概要

第1章:聲音與訊號

開篇一章把訊號定義為隨時間變化的量,並以聲音作為貫穿全書的例子,接著介紹本書的核心概念、核心數學工具與核心演算法:頻譜分解、離散傅立葉轉換(DFT)與快速傅立葉轉換(FFT)。作者用一段小提琴錄音講解基頻、諧波與音色。本章其餘部分介紹作者撰寫的 thinkdsp 模組及其三個主要類別 Signal、Wave 與 Spectrum,示範如何讀寫 WAV 檔、繪製波形,以及對頻譜套用簡單的低通、高通與帶拒濾波。

第2章:諧波

本章以程式產生三角波與方波並檢視其頻譜:兩者都只含奇次諧波,但三角波的諧波振幅隨頻率的平方衰減,方波的諧波則與頻率成反比衰減。接著,本章刻意製造一個令人困惑的頻譜來引出混疊:以每秒 10,000 個影格取樣時,4500 Hz 與 5500 Hz 的餘弦訊號得到完全相同的取樣值,由此說明折疊(奈奎斯特)頻率。最後說明 make_spectrum 如何呼叫 NumPy 的實數 FFT,以及如何把每個複數值解讀為一個振幅和一個相位偏移。

第3章:非週期訊號

本章從頻率成分固定的訊號更進一步,建構線性啁啾與指數啁啾,並順帶說明相位是頻率的積分、人耳感知的音高與頻率的對數相關。由於啁啾的頻譜無法顯示各頻率何時出現,本章引入短時傅立葉轉換與頻譜圖。隨後說明時間解析度與頻率解析度之間的取捨(Gabor 極限)、把有限片段當作週期訊號處理所造成的頻譜洩漏,以及作為補救方法的漢明窗,最後以彼此重疊的加窗片段實作 make_spectrogram。

第4章:雜訊

本章產生並分析雜訊。先從不相關均勻雜訊開始,透過功率譜與積分譜說明它是白雜訊。布朗雜訊(紅雜訊)由隨機漫步建構,在雙對數座標上擬合直線,可看出其功率按 1/f² 衰減。具有一般指數 β 的粉紅雜訊,以及以常態機率圖檢驗的不相關高斯雜訊,構成這個家族的其餘成員。習題把這些概念應用到自然聲音錄音與比特幣價格資料上,並要求讀者實作 Bartlett 方法與 Voss-McCartney 粉紅雜訊演算法。

第5章:自相關

本章從皮爾森相關係數出發,定義序列相關與自相關函數,並用它們精確說明第4章雜訊訊號所謂的「相關」與「不相關」,包括粉紅雜訊的長程相依。主要應用是根據自相關的第一個峰值估計一段人聲啁啾錄音的音高,所得的頻率精度遠高於讀取短片段的頻譜。本章最後把相關重新表述為內積,並使用 NumPy 的 correlate。

第6章:離散餘弦轉換

從這裡開始,本書著手解釋轉換的運作原理,以 DCT(用於 MP3、JPEG 與 MPEG 壓縮)作為通往 DFT 的墊腳石。本章把合成問題(由振幅得到訊號)與分析問題(由訊號求振幅)表述為線性代數問題:先求解線性方程組,再說明只要仔細挑選時間點與頻率,合成矩陣就會成為正交矩陣(DCT-IV),其反矩陣就是轉置。本章最後介紹反 DCT 以及以 SciPy DCT-II 為基礎的 Dct 類別。

第7章:離散傅立葉轉換

本章沿著同樣「先合成、後分析」的路線,藉由尤拉公式引入複指數、複正弦訊號與複數振幅,再把 DFT 建構為與一個么正矩陣相乘,其反矩陣是共軛轉置。本章說明 DFT 對頻率索引具有週期性,並透過對實數鋸齒波做完整 DFT,解釋為何實訊號頻譜的後半部是前半部的鏡像——這也是前面各章使用 rfft 的原因。一道習題引導讀者藉由 Danielson-Lanczos 引理實作遞迴 FFT。

第8章:濾波與摺積

本章以某支股票每日收盤價與方波的 30 日移動平均為例引入摺積,並說明平滑相當於低通濾波。由此引出摺積定理:時域中的摺積對應頻域中的乘法。本章把高斯窗與移動平均(矩形)窗相比較,呈現旁瓣的影響,並說明 FFT 如何使摺積、互相關與自相關的計算更有效率(N log N 而非 N²)。

第9章:微分與積分

本章延續窗與濾波器之間的關係,說明差分窗 [1, −1] 表現為高通濾波器,而精確的微分對應於把每個頻率成分乘以 2πif。相對地,積分對應於除以 2πif,累積和是它的近似,可以把鋸齒波變成拋物線形的訊號。本章接著從頻域解釋為何對白雜訊積分會得到功率與 1/f² 成正比的布朗雜訊。

第10章:LTI 系統

本章以音樂聲學為例介紹訊號與系統理論。在定義線性非時變(LTI)系統之後,本章說明系統的脈衝響應及其 DFT——轉移函數——可以完整刻畫該系統:一段槍聲錄音被當作某個房間的脈衝響應,並套用到一段小提琴錄音上。接著把摺積解釋為脈衝響應經平移與縮放後之副本的總和,最後以複指數證明摺積定理。

第11章:調變與取樣

最後一章回到第2章出現的混疊現象並加以解釋。與脈衝做摺積會產生平移的副本,這說明了振幅調變與解調;接著把取樣建模為與脈衝串相乘,這會複製頻譜。本章以一段鼓獨奏錄音說明低通濾波器在什麼情況下能去除這些副本,介紹磚牆濾波器及其在時域中的對應物 sinc 函數,並透過這些例子非正式地介紹奈奎斯特—夏農取樣定理。

核心概念

第1章:聲音與訊號

  • 頻譜分解:訊號可寫成不同頻率正弦波之和的概念,是全書的組織主軸。
  • Signal、Wave 與 Spectrum:thinkdsp 的三個類別,分別代表隨時間連續變化的函數、在離散影格上取樣後的該函數,以及它的頻率成分。
  • 基頻與諧波:通常決定感知音高的最低頻率成分,以及塑造音色的整數倍成分。

第2章:諧波

  • 諧波結構:包含哪些諧波、其振幅衰減多快的模式,可用來區分三角波、方波與鋸齒波。
  • 混疊:高於取樣率一半的成分在取樣後與某個較低頻率成分無法區分的現象。
  • 折疊頻率:取樣率的一半,超出範圍的頻率會以它為軸折回可測範圍。

第3章:非週期訊號

  • 啁啾:頻率隨時間線性或指數變化的訊號;相位由頻率積分而得。
  • 頻譜圖:由短而重疊之片段的頻譜(短時傅立葉轉換)構成的時頻圖。
  • Gabor 極限:要提高頻率解析度就必須拉長片段,因而降低時間解析度的取捨。
  • 洩漏與加窗:片段邊緣不連續所造成的虛假頻率成分,以及用漢明窗等窗函數讓片段兩端平滑衰減以減輕洩漏的方法。

第4章:雜訊

  • 白雜訊:平均而言在所有頻率上功率相等的雜訊,例如不相關的均勻雜訊或高斯雜訊。
  • 布朗(紅)雜訊:由隨機漫步構成、功率與 1/f² 成正比的雜訊。
  • 粉紅雜訊:功率按 1/f^β(β 介於 0 與 2 之間)衰減、介於白雜訊與紅雜訊之間的雜訊。

第5章:自相關

  • 序列相關:訊號每個值與下一個值之間的相關。
  • 自相關函數:以延遲量為自變數計算的序列相關,可揭示週期性與長程相依。
  • 音高估計:由第一個自相關峰值所在的延遲量求出週期訊號的基頻。

第6章:離散餘弦轉換

  • 合成問題與分析問題:由成分振幅得到訊號及其反向過程,表述為矩陣乘法與線性方程組求解。
  • 正交矩陣:反矩陣等於轉置的矩陣,使分析與合成同樣便宜。
  • DCT-IV 與 DCT-II:以特定方式選取取樣時間與頻率所得到的離散餘弦轉換版本;實務上常用的是 DCT-II。

第7章:離散傅立葉轉換

  • 複正弦訊號:形如 e^{i(2πft+φ)} 的訊號,是一種方便的抽象,其實部就是一般的正弦訊號。
  • 么正合成矩陣:DFT 矩陣,其反矩陣為共軛轉置,因此 DFT 與反 DFT 都是矩陣乘法。
  • DFT 的週期性與對稱性:DFT 在頻率索引上以 N 為週期重複;對實訊號而言,上半部是下半部的鏡像。

第8章:濾波與摺積

  • 摺積:把反轉的窗沿著訊號滑動並對乘積求和的運算,是移動平均等操作的一般形式。
  • 摺積定理:摺積的 DFT 等於各自 DFT 的逐元素乘積。
  • 高斯濾波器:其轉換近似高斯形的平滑窗,比矩形窗得到更乾淨的低通濾波器。

第9章:微分與積分

  • 微分濾波器:把每個成分乘以 2πif,是一種高通濾波器,可用差分近似。
  • 積分濾波器:除以 2πif,可用累積和近似。

第10章:LTI 系統

  • 線性非時變系統:輸入的加權和產生輸出的加權和、輸入平移則輸出同樣平移的系統。
  • 脈衝響應與轉移函數:對單一脈衝的輸出及其 DFT,兩者共同刻畫 LTI 系統。

第11章:調變與取樣

  • 振幅調變:把訊號與載波餘弦相乘,將其頻譜的副本搬移到較高頻率。
  • 把取樣視為與脈衝串相乘:說明取樣會複製頻譜的模型,可解釋混疊。
  • 取樣定理與 sinc 內插:以高於最高頻率兩倍的速率取樣的帶限訊號,可用磚牆低通濾波器(等同於以 sinc 函數內插)還原。

評析

優點

  • 以程式為先、以真實聲音為素材的教法。 前言指出,多數訊號處理教科書從相量等抽象概念由下而上展開,本書則反其道而行:每章先介紹一種技術,套用到錄製的訊號上(小提琴、鐘聲、人聲啁啾、槍聲、鼓獨奏),之後才解釋原理。讀完第1章,讀者就能分析與產生聲音。
  • 以線性代數建構轉換。 第6章與第7章把合成與分析表述為矩陣問題,再透過選取取樣點讓矩陣成為正交或么正矩陣,藉此推導 DCT 與 DFT。這為程式設計者提供具體的途徑,理解轉換為何可逆、為何快速,而不是直接給出 DFT 公式。
  • 反覆出現、前後連貫的例子。 第4章的雜訊在第5章與第9章再次出現,第8章的股價序列在第9章的微分與積分中被重複使用,第2章的混疊之謎在第11章獲得解答。這些前後呼應呈現了各概念之間的關聯。
  • 開放、可執行的教材。 本文以創用 CC BY-NC-SA 授權免費提供,每章在作者的 GitHub 儲存庫中都有 Jupyter 筆記本與解答筆記本,並附 Binder 連結,不必安裝即可執行。

局限

  • 作為完整的訊號課程,涵蓋範圍偏窄。 書中沒有 z 轉換、拉普拉斯轉換與極零點分析,也沒有系統性的 FIR 或 IIR 濾波器設計;連續時間傅立葉分析只是非正式地出現。修習訊號與系統或控制課程的學生需要另一本教科書補足這些內容。
  • 數學表述較不嚴謹。 取樣定理只以例子說明而未加證明,作者本人也承認複訊號缺乏令人滿意的詮釋。只有摺積定理得到證明(第10章)。
  • 依賴作者的函式庫與較舊的工具。 大量內文以 thinkdsp 類別為前提撰寫,前言還提到相容 Python 2 與 Python 3 以及 scipy.fftpack;在目前的 Python 環境中,讀者可能需要做些小調整。部分習題連結(例如價格資料網站)可能已經改變。
  • 預設讀者具備熟練的程式能力。 前言假定讀者掌握 Python 核心語法並熟悉物件;尚不習慣寫程式的讀者會覺得節奏不均。

書中的應用

應用分散於各章之中,而非集中成章:分析樂器與人聲錄音(第1–3章與第5章)、以自相關追蹤音高(第5章)、DCT 在音訊與影像壓縮中的角色(第6章,附壓縮習題)、對股價時間序列做平滑與差分(第8–9章)、以槍聲的脈衝響應模擬房間聲學(第10章),以及用於廣播的振幅調變和以 CD、DVD 取樣率對音訊取樣(第11章)。習題還涵蓋自然雜訊錄音、比特幣價格、蓋革計數器(卜瓦松)雜訊,以及來自線上聲學資料庫的脈衝響應。

在課程中的定位

在「訊號、系統與控制」課程的書單中,Think DSP 是為擅長透過寫程式學習的學生準備的入門書。Sadiku、Ali 與 Musa 的 Signals and Systems: A Primer with MATLAB 同樣如書名所示,是藉助 MATLAB 介紹訊號與系統的入門書;作為訊號與系統的專門入門書,它很可能較接近一般的教學大綱;Think DSP 則透過 Python 實驗建立對頻譜、摺積與取樣的直覺。Oppenheim、Willsky 與 Nawab 的 Signals and Systems 是自然的下一步,可補上本書省略的正式內容,例如連續時間轉換與 z 轉換。

書單中的控制與機器人教材——Nise 的 Control Systems Engineering、Åström 與 Murray 的 Feedback Systems,以及 Craig 的 Introduction to Robotics——都建立在訊號與系統的基礎上,而 Think DSP 對這些基礎只是點到為止(第10章介紹了 LTI 系統與轉移函數,但沒有涉及回授、穩定性或拉普拉斯域設計)。本書最好在主教科書之前或與之並行閱讀,而不能取而代之。

如何使用本書

本書的對象是掌握 Python 核心語法與基本物件用法、熟悉複數、了解微分與積分意義的程式設計者與學生;前言說明線性代數會在用到時講解。開始之前,先複製或下載 GitHub 儲存庫,確認能在本機或 Binder 上執行各章筆記本。

第1–3章是必讀內容,應依序閱讀,讀完即可掌握頻譜、混疊與頻譜圖的實用詞彙。第4章與第5章(雜訊與自相關)在以系統為重點的課程中可以縮減,但第5章對音訊處理很有幫助。第6–8章是概念核心,不應跳過:DCT 一章為 DFT 一章鋪路,第8章的摺積定理則是第9–11章的基礎。每章閱讀時都開著對應的筆記本,執行所有範例並聆聽聲音,在查看所附解答筆記本之前至少完成兩道習題。一學期的選修課大約每週一章即可講完全部 11 章;把本書當作正式課程輔助讀物的學生,可配合相應的課堂進度閱讀第1–3、7、8、10 與 11 章。

版本與來源

本導讀依據 Think DSP Version 1.1.4(© 2014 Allen B. Downey,創用 CC BY-NC-SA 4.0 授權),閱讀的是 Green Tea Press 官方頁面 https://greenteapress.com/wp/think-dsp/ 所連結的免費 PDF;本書的印刷版於 2016 年由 O'Reilly Media 出版。本導讀參考了前言、完整目錄,以及全部 11 章的引言、每一節、程式範例與章末習題。