索引 / 001 JA
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章:倍音

三角波と矩形波をコードで生成し、そのスペクトルを調べる。どちらも奇数次の倍音しか含まないが、三角波の倍音は周波数の2乗に比例して、矩形波の倍音は周波数に比例して減衰する。続いて、わざと紛らわしいスペクトルを作ってエイリアシングを導入し、毎秒10,000フレームでサンプリングした4500 Hz と5500 Hz の余弦波がまったく同じサンプルになることを示して、折り返し(ナイキスト)周波数を説明する。最後に、make_spectrum が NumPy の実数 FFT をどのように呼び出しているか、各複素数値を振幅と位相オフセットとしてどう読むかを示す。

第3章:非周期信号

周波数成分が一定の信号から一歩進み、線形チャープと指数チャープを作る。その過程で、位相は周波数の積分であること、知覚される音高は周波数の対数に従うことを説明する。チャープのスペクトルでは各周波数がいつ現れたかがわからないため、短時間フーリエ変換とスペクトログラムを導入する。時間分解能と周波数分解能のトレードオフ(ガボール限界)、有限区間を周期的とみなすことで生じるスペクトル漏れ、その対策としてのハミング窓を説明し、窓をかけて重ね合わせた区間を使う make_spectrogram の実装で章を終える。

第4章:ノイズ

この章ではノイズを生成し分析する。まず無相関一様ノイズを取り上げ、パワースペクトルと積分スペクトルによって、それが白色であることを示す。ブラウンノイズ(赤色ノイズ)はランダムウォークとして作られ、両対数プロット上で直線を当てはめることで、そのパワーが 1/f² で減少することが示される。一般の指数 β をもつピンクノイズと、正規確率プロットで確かめる無相関ガウスノイズで、この系列が完結する。演習では、自然音の録音やビットコイン価格データにこれらの考え方を適用し、バートレット法やボス=マッカートニーのピンクノイズ生成アルゴリズムの実装を求める。

第5章:自己相関

ピアソンの相関係数から出発して、系列相関と自己相関関数を定義し、それらを使って第4章のノイズ信号に関する「相関がある」「相関がない」という言い方を正確にする。ピンクノイズの長期依存性もここで扱う。主な応用は、録音された声のチャープの音高を自己相関の最初のピークから推定することで、短い区間のスペクトルを読むよりはるかに高い周波数精度が得られる。最後に、相関を内積として捉え直し、NumPy の correlate を使う。

第6章:離散コサイン変換

ここから本書は、変換がどのように機能するかの説明に入る。MP3、JPEG、MPEG の圧縮に使われる DCT を、DFT への足がかりとして用いる。合成問題(振幅から信号へ)と解析問題(信号から振幅へ)を線形代数の問題として定式化し、まず連立一次方程式を解き、次に時刻と周波数を注意深く選ぶと合成行列が直交行列になる(DCT-IV)ので、逆行列が転置で済むことを示す。章の最後で逆 DCT と、SciPy の DCT-II に基づく Dct クラスを扱う。

第7章:離散フーリエ変換

同じ「合成から解析へ」の道筋をたどり、オイラーの公式による複素指数関数、複素正弦波、複素振幅を導入したうえで、DFT を、逆行列が共役転置に等しいユニタリ行列による掛け算として組み立てる。DFT が周波数インデックスについて周期的であることを示し、実数のノコギリ波に完全な DFT を適用することで、実信号のスペクトルの後半が鏡像になる理由、そしてそれまでの章で rfft を使ってきた理由を説明する。演習では、ダニエルソン=ランチョスの補題をたどって再帰的な FFT を実装させる。

第8章:フィルタリングと畳み込み

ある株式の日次終値と矩形波に30日移動平均をかける例を通じて畳み込みを導入し、平滑化がローパスフィルタとして働くことを示す。そこから畳み込み定理――時間領域での畳み込みは周波数領域での掛け算に対応する――が導かれる。ガウス窓を移動平均(矩形)窓と比較してサイドローブの影響を示し、FFT によって畳み込み、相互相関、自己相関が効率的に(N² ではなく N log N で)計算できることを説明する。

第9章:微分と積分

窓とフィルタの関係を引き続き扱い、差分の窓 [1, −1] がハイパスフィルタとして振る舞うこと、厳密な微分は各周波数成分に 2πif を掛けることに対応することを示す。積分は同様に 2πif で割ることに対応し、累積和がその近似となって、ノコギリ波を放物線状の信号に変える。さらに、白色ノイズを積分するとパワーが 1/f² に比例するブラウンノイズになる理由を、周波数領域から説明する。

第10章:LTI システム

信号とシステムの理論を、音楽音響を題材に導入する。線形時不変(LTI)システムを定義したあと、システムのインパルス応答と、その DFT である伝達関数がシステムを完全に特徴づけることを示す。録音した銃声を部屋のインパルス応答として用い、それをバイオリンの録音に適用する。次に畳み込みを、インパルス応答をずらして拡大縮小したものの和として解釈し、最後に複素指数関数を使って畳み込み定理を証明する。

第11章:変調とサンプリング

最終章は第2章で見たエイリアシングに戻り、それを説明する。インパルスとの畳み込みはずれたコピーを作ること、これが振幅変調と復調を説明することを示し、続いてサンプリングをインパルス列との掛け算としてモデル化して、それがスペクトルのコピーを作ることを示す。ドラムソロの録音を使って、ローパスフィルタでそれらのコピーを除去できる条件を示し、ブリックウォールフィルタとその時間領域での対応物であるシンク関数を導入し、これらの例を通してナイキスト=シャノンの標本化定理を非形式的に提示する。

主要概念

第1章:音と信号

  • スペクトル分解:信号を異なる周波数の正弦波の和として表せるという考え方で、本書全体をまとめるテーマ。
  • Signal、Wave、Spectrum:thinkdsp の三つのクラスで、それぞれ時間の連続関数、それを離散フレームでサンプリングしたもの、その周波数成分を表す。
  • 基本周波数と倍音:通常、知覚される音高を決める最も低い周波数成分と、音色を形づくるその整数倍の成分。

第2章:倍音

  • 倍音構造:どの倍音が含まれ、その振幅がどれだけ速く減衰するかというパターンで、三角波・矩形波・ノコギリ波を区別する。
  • エイリアシング:サンプリングレートの半分を超える成分が、サンプリング後には低い周波数の成分と区別できなくなる現象。
  • 折り返し周波数:サンプリングレートの半分で、範囲外の周波数はこれを軸に測定可能な範囲へ折り返される。

第3章:非周期信号

  • チャープ:周波数が時間とともに線形または指数的に変化する信号。位相は周波数を積分して得られる。
  • スペクトログラム:短い区間を重ねながら求めたスペクトル(短時間フーリエ変換)から作る時間‐周波数の図。
  • ガボール限界:周波数分解能を細かくするには区間を長くする必要があり、その分時間分解能が粗くなるというトレードオフ。
  • スペクトル漏れと窓関数:区間の端の不連続によって生じる偽の周波数成分と、ハミング窓などで区間の両端を滑らかに減衰させてそれを抑える方法。

第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章:変調とサンプリング

  • 振幅変調:信号に搬送波の余弦波を掛けることで、スペクトルのコピーを高い周波数へ移す操作。
  • インパルス列との掛け算としてのサンプリング:サンプリングがスペクトルを複製することを示し、エイリアシングを説明するモデル。
  • 標本化定理とシンク補間:最高周波数の2倍より速くサンプリングされた帯域制限信号は、ブリックウォール・ローパスフィルタ(シンク関数による補間と同等)で復元できる。

批判的分析

長所

  • 実際の音を使った、コード先行の教え方。 序文は、多くの信号処理の教科書がフェーザのような抽象から積み上げていくと指摘し、本書はその順序を逆にする。各章はまず手法を導入し、それを録音された信号(バイオリン、鐘、声のチャープ、銃声、ドラムソロ)に適用し、そのあとで仕組みを説明する。読者は第1章の終わりには音を分析し生成できるようになる。
  • 線形代数から組み立てる変換。 第6章と第7章では、合成と解析を行列の問題として定式化し、行列が直交またはユニタリになるようにサンプル点を選ぶことで DCT と DFT を導く。DFT の公式を天下り的に示すのではなく、変換がなぜ逆変換可能で、なぜ高速なのかを、プログラマーに具体的な道筋で理解させる。
  • 繰り返し登場する一貫した例。 第4章のノイズは第5章と第9章で再登場し、第8章の株価系列は第9章の微分・積分で再利用され、第2章のエイリアシングの謎は第11章で解かれる。こうした呼応が、考え方どうしのつながりを示している。
  • 公開され、実行できる教材。 本文はクリエイティブ・コモンズ 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章の土台になる。各章ではノートブックを開いたまま本文を読み、すべての例を実行して音を聴き、用意された解答ノートブックを見る前に少なくとも二つの演習に取り組むこと。1学期の選択科目なら、ほぼ1週1章のペースで全11章を扱える。形式的な講義の副読本として使う学生は、対応する講義に合わせて第1〜3章、第7章、第8章、第10章、第11章を読むとよい。

版と出典

本ガイドは Think DSP Version 1.1.4(© 2014 Allen B. Downey、クリエイティブ・コモンズ BY-NC-SA 4.0)に基づいており、Green Tea Press の公式ページ https://greenteapress.com/wp/think-dsp/ からリンクされている無料 PDF を用いた。印刷版は2016年に O'Reilly Media から刊行されている。本ガイドは、序文、目次全体、そして全11章について各章の導入、すべての節、コード例、章末演習を参照している。