日本音響学会 編
音響入門シリーズ B-4

ディジタル音響信号処理入門

ナ社－Python による自主演習－
小澤賢司 著コロ

博士（工学）

コロナ社

ナ社
ロコ

音響入門シリーズ編集委員会
編集委員長

大川茂樹（千葉工業大学）

編 集 委 員（五十音順）
小澤賢司（山梨大学）

鈴木陽一（東北文化学園大学）

羽田陽一（電気通信大学）

誉田雅彰（早稲田大学名誉教授）

柳田益造（同志社大学名誉教授）（2022 年 8 月現在）

刊行のことば

われわれは，さまざまな「音」に囲まれて生活している。音楽のように生活を豊かにしてくれる音もあれば，騒音のように生活を脅かす音もある。音を科学する「音響学」も，多彩な音を対象としており，学際的な分野として発展してきた。人間の話す声，機械が出す音，スピーカから出される音，超音波のよ

ナ社

うに聞こえない音も音響学が対象とする音である。これらの音を録音する，伝達する，記録する装置や方式も，音響学と深くかかわっている。そのために，「音響学」は多くの人に興味をもたれながらも，「しきいの高い」分野であるとの印象をもたれてきたのではないだろうか。確かに，初心者にとって，音響学を系統的に学習しようとすることは難しいであろう。

そこで，日本音響学会では，音響学の向上および普及に寄与するために，高ロ校卒業者・大学 1 年生に理解できると同時に，社会人にとっても有用な「音響入門シリーズ」を出版することになった。本シリーズでは，初心者にも読めるコように想定されているが，音響以外の専門家で，新たに音響を自分の専門分野に取り入れたいと考えている研究者や技術者も読者対象としている。
音響学は学際的分野として発展を続けているが，音の物理的な側面の正しい理解が不可欠である。そして，その音が人間にどのような影響を与えるかも把握しておく必要がある。また，実際に音の研究を行うためには，音をどのように計測して，制御するのかを知っておく必要もある。そのための背景としての各種の理論，ツールにも精通しておく必要がある。とりわけ，コンピュータは，音響学の研究に不可欠な存在であり，大きな潜在性を秘めているツールである。
このように音響学を学習するためには，「音」に対する多角的な理解が必要である。本シリーズでは，初心者にも「音」をいろいろな角度から正しく理解

ii刊

行のことばしていただくために，いろいろな切り口からの「音」に対するアプローチを試みた。本シリーズでは，音響学にかかわる分野・事象解説的なものとして，「音響学入門」，「音の物理」，「音と人間」，「音と生活」，「音声・音楽とコンピュータ」，「楽器の音」の 6 巻，音響学的な方法にかかわるものとして「ディジタルフーリエ解析（Ⅰ）基礎編，（Ⅱ）上級編」，「電気の回路と音の回路」，「ディジタル音響信号処理入門－ Python による自主演習－」の 4 巻（計 10 巻）を継続して刊行する予定である。各巻とも，音響学の第一線で活躍する研究者の協力を得て，基礎的かつ実践的な内容を盛り込んだ。
本シリーズでは，CD や DVD，または Web サイトに各種の音響現象を視覚・ナ社

聴覚で体験できるコンテンツを用意している。また，読者が自己学習できるように，興味を持続させ学習の達成度が把握できるように，コラム（歴史や人物の紹介），例題，課題，問題を適宜掲載するようにした。とりわけ，コンピュータ技術を駆使した視聴覚に訴える各種のデモンストレーション，自習教材は他書に類をみないものとなっている。執筆者の長年の教育研究経験に基づいて制作されたものも数多く含まれている。ぜひとも，本シリーズを有効に活用し，

ロ「音響学」に対して系統的に学習，理解していただきたいと願っている。
音響入門シリーズに飽きたらず，さらに音響学の最先端の動向に興味をもたコ

れたら，日本音響学会に入会することをお勧めする。毎月発行する日本音響学
会誌は，貴重な情報源となるであろう。学会が開催する春秋の研究発表会，分野別の研究会に参加されることもお勧めである。まずは，日本音響学会のホームページ（https://acoustics.jp/）をご覧になっていただきたい。
2022 年 8 月

一般社団法人

日本音響学会 音響入門シリーズ編集委員会
編集委員長

まえがき

本書は，これから音響信号処理のプログラミングに取り組もうと考えている方を対象に，教師代わりに学習をナビゲートすることを意図した演習書です。
想定読者は，音響学に関する研究室に配属された理工系学科の卒業研究生や修れた社会人の方です。

ナ社

士１年生，そして音響関連のソフトウェア製品を開発する部署に新たに配属さ多くの理工系学科では，基礎科目においてフーリエ級数展開，畳込み演算などを学ぶでしょう。しかし，プログラミングにまで踏み込むカリキュラムは多くないように思います。著者の所属学科でも同様で，卒業研究生の中には「音に興味があってこの研究室を選んだけれど，これまで信号処理はまったく学んだことがありません」という方がいます。本書は，まさにそのような方々に，

ロ「音の信号処理は案外簡単ですね」ということを実感していただくことを目的としています。そして読後には，自信をもってご自身の業務に臨んでいただけ

コれば幸いです。

さて，本来ならば講義科目で信号処理の原理を学び，その後でプログラミング演習を行うのが望ましいと思われます。一方，本書は「離散フーリエ変換（DFT）の原理は知らなくても，与えられた音データに対する DFT の結果であるスペクトルを正しく理解して，必要な処理を実施できればよい」というスタンスです。すなわち，ブラックボックス化できる部分はそのままにして，音響信号処理全体を一通り完遂する力を習得することを目指しています。
本書は，対話的なプログラミング環境を用いることで，あたかも生徒が教師と対面で会話している雰囲気で学習を進めることを特徴とします。そのため，全体が「話し言葉に近い敬体」で書かれています。

iv

まえがき

また，本書では，その雰囲気を実現するために，プログラミング言語 Python†の対話的プログラミング環境である Google Colaboratory（略称 : Colab）を用います。Python は，汎用性の高いプログラミング言語であり，コードがシンプルで扱いやすいように設計されているので，最近は人気の高い言語です。
そして，Colab では，テキストとプログラムコードを交互に配置することが可能なノートブックというインタフェースを利用するので，教師からの指導を受けて生徒がプログラムを実行するという疑似的な対面学習が可能です。特に重要な事項は枠で囲うことで明示しましたので，復習に利用してください。
本書の Python コードは，サポートページからダウンロードできますので，ナ社

書籍中で「演習」とした課題については，ご自身でパラメータの値を変えて実行することをおすすめします。なお，サポートページの Colab ノートブックには，本書に掲載できなかった確認課題とその解答例や，やや高度な内容のコンテンツも示していますので，ぜひ一度サポートページをご覧ください。
プログラムを実行し，波形を目で見て・音として聞いてみると，「波形がこんなに違うのに，音色はほぼ同じ」ことや「波形の相違はわずかなのに，音色はロかなり違う」ことを経験されるでしょう。これが聴覚の不思議なところであり，音響学については「百見は一聞にしかず」であることを実感されるでしょう。

コ

本書では，実際に音を聞くことができる箇所にをつけてあり，音を聞くためのサポートページを各章の冒頭で 2 次元コードにより案内しています。
なお，本書では，ディスプレイで出力を確認することを前提としていたので，図はカラーであることを想定していました。出版にあたりモノクロ図面としてありますことをご容赦ください。サポートページには，出力である音に加えて，図のカラー版も掲載しています。
読者の皆さまが，本書を通じてディジタル音響信号処理の歓びを実感していただければ幸いです。そして，本書ではブラックボックス化している原理的な部分まで，ご自身で興味をもって調べていただければ幸いです。そのための参†本書に記載の会社名，製品名は一般に各社の商標（登録商標）です。本文中ではTM，Ⓡマークは省略しています。

まえがきv

考書を，本書の引用・参考文献リストのページで紹介しています。
末筆ながら，本書の出版に関してご助力いただいた皆さまに感謝いたします。本シリーズ編集委員の鈴木陽一先生には，著者の研究室の卒業研究生用に開発した教材ノートブックを，本書として出版するようお声がけいただきました。同委員長の大川茂樹先生と同委員の羽田陽一先生には，原稿を通して読んでいただき，貴重なご意見をいただきました。コロナ社には，著者の遅筆をご寛容いただき，出版までご助力いただきました。また，塩澤光一朗様をはじめとする山梨大学の卒業研究生諸氏には，この教材を用いた学習の過程でさまざまなコメントをいただきました。重ねて感謝いたします。

ナ社

コロナ禍の終息を祈りつつ

小澤賢司

コロ

2022 年 8 月■本書のサポートぺージ■
本書のサポートページは下記 2 次元コード，もしくは URL から見ることができます。
https://kenjiozawa.github.io/DSP_practice_Python.html（短縮 URL：https://bit.ly/3szss0H）（2022 年 8 月現在）

目

演習環境の立上げ

1.
Python と Colab1

1 . 1 . 1 Python と は
1 . 1 . 2 Colab と は

1

1.2

演習環境の準備

ナ社

1.1

次

1 . 2 . 1 Python 入門と Colab の利用
1 . 2 . 2 本書のサポートページ

1.3

Colab で WAV ファイルを聞いてみる

2.1

2223音 に 触 れ るロ2.

1

音を数式で表現する

コ2 . 1 . 1 時間の関数としての音の数式表現
2 . 1 . 2 振幅と位相を含んだ数式表現

4572.2

正弦波を生成して聞いてみる

92.3

A-D 変換について確認する

112.3.1 標
本化
2 . 3 . 2 不適切な標本化

122.3.3

量152.3.4

よろしくない量子化

172.3.5

量子化誤差を聞いてみる

19

子化

13

目vii

アナログ音の周波数分析

3.
3.1

次

正弦波の重ね合わせによる周期波形の合成

243 . 1 . 1 ウォーミングアップ：2 成分複合音の合成
3 . 1 . 2 3 成分複合音の合成

24

3.1.3

成分音の振幅と波形の関係

29

3.1.4

成分音の位相と波形の関係

30

3.1.5

三角関数の合成32

フーリエ級数展開

33

3.2かど26333.2.3

41

ナ社

3 . 2 . 1 丸い波による角のある波の合成
3 . 2 . 2 周期波形の分解分解された成分の位相と振幅を調べる

3.3 ス ペ ク ト ル

3842423.3.3

複素フーリエ級数展開で得たスペクトルを描画する

47

3.3.4

基本的な周期波形のスペクトル50

ロ

3 . 3 . 1 フーリエ級数展開で得たスペクトルを描画する
3 . 3 . 2 実フーリエ級数展開から複素フーリエ級数展開へ

4.

ディジタル音の周波数分析

ディジタル信号のフーリエ変換

コ

4.1

4554

4 . 1 . 1 DFT と FFT
4 . 1 . 2 FFT スペクトルを読み解く（王道の解釈）

54

4.1.3

FFT スペクトルを読み解く（曲がった解釈）

60

4.1.4

スペクトルの振幅値に関する解釈

63

4.1.5

ディジタル信号のスペクトル644.2窓

関数57674 . 2 . 1 方形波窓による切出しが引き起こす問題
4 . 2 . 2 窓関数を用いた波形の切出し

67

4.2.3

75

4.3

STFT とスペクトログラム71

窓関数による波形の変化とスペクトルの変化

80

4 . 3 . 1 切り出した波形の合成による元の波形の復元
4 . 3 . 2 窓関数の掛け算によるスペクトルの変化

80
84

目viii4.4

次

忘れてはいけない位相スペクトル

音のフィルタリング

5.
5.1

FIR フィルタによる雑音の除去

5 . 1 . 1 インパルス応答の畳込み
5 . 1 . 2 FIR フィルタを自作する
5.1.3

FIR フィルタの自動設計（窓関数法）

92
92
96
105

IIR フィルタによる雑音の除去

107

5 . 2 . 1 IIR フィルタの自動設計
5 . 2 . 2 IIR フィルタを利用した雑音除去

107

5.3

頭部伝達関数を用いた音像定位の制御

ナ社

5.287

5 . 3 . 1 頭部伝達関数とは
5 . 3 . 2 頭部伝達関数を用いて音像を制御してみよう

5.4

FFT を利用した長い音のフィルタリング

6.1

111
111112117

さまざまな音響信号処理

ロ

6.

110

ボイスチェンジャ

1181186.1.3124

コ

6 . 1 . 1 まずボイスチェンジしてみる
6 . 1 . 2 スペクトルの変化を観察する
スペクトルの変化を検討する

6.2 エ フ ェ ク タ

6.2.1 ト レ モ ロ
6.2.2 ビ ブ ラ ー ト

6.3

マイクロホンアレイによるビームフォーミング

6 . 3 . 1 遅延和法（DS 法）の基礎
6 . 3 . 2 遅延和法の実行

121127127
130

135135138

引用・参考文献

144

索145

引1

演習環境の立上げ

本書は，実際のプログラミングを通じて，音のディジタル信号処理を体得することを目的としています。本章では，その準備として，ブラウザから Python

ナ社を実行できるサービスである Google Colaboratory（略称：Colab）を利用し，音を聞くことまでを実現しましょう。

1 . 1 Python と Colab
1 . 1 . 1 Python と はロ

汎用性の高いプログラミング言語である Python1）†は，コードが読みやすく，さまざまな高機能ライブラリを無料で利用できることから，近年，注目を集めコています。本書のプログラムは，Python 3 . 7 を用いて動作を確認しています。
1 . 1 . 2 Colabとは2）Colab は，Web ブラウザから Python プログラムを記述，実行できる無料サービスです。自身でプログラミング環境の設定をする必要がないので，すぐに Python プログラミングを体験できます。
Colab では，対話的コンピューティングを行うためにノートブック（ファイルの拡張子は . ipynb）と呼ばれるインタフェースを利用します。ノートブッ
クでは，プログラムコード，数式を含む文章，グラフ，そして音の出力といったマルチメディアを混在させることができます。本書では，この機能を利用す†

肩付き数字は巻末の引用・参考文献を示します。

1.

2

演習環境の立上げることで，「教師と対面で会話する感覚」で学習を進めることにします。

1.2
1.2.1

演習環境の準備Python 入門と Colab の利用

本書では，何らかのプログラミング言語を習得した経験のある方であれば，Python を使ったことのない方でも読み下せる程度の平易なプログラミングを心がけたつもりです。もし Python に興味があれば，例えば Python 情報サイト1）で入門記事を読むことをオススメします。なお，2022 年 5 月現在，このサ

ナ社

イトにおける「ゼロからの Python 入門講座」では Colab を利用しています。
そして，Colab を利用するために必要な，Google アカウント（無料）の作成方法から解説されています。

すでに Google アカウントを所有している方は，まず Colab を利用してみま2）
しょう。日本語の「Colaboratory へようこそ」にアクセスするだけです。ノートブックインタフェースにより，「解説を読む → コードを実行する」の繰返し

本書のサポートページ

コ1.2.2

ロで，対話的に Python プログラミングを体験できます。

本書で利用するファイル一式については，右の 2 次元コードで示す本書のサポートページ†に示してあります。本書における各章の記述のうち，コード部分だけを残した Colab ノートブックを提供していますので，ぜひ実際に手を動かしながら演習に取り組んでいただければ幸いです。また，サポートページの Colab ノートブックには，本書に掲載されていないコンテンツも含まれています。ぜひ，サポートページの目次情報をご覧いただければ幸いです。
さらには，サポートページの Colab ノートブックには，本書では割愛した「各節の内容に関する確認課題」が含まれています。また，その略解を Colab†

https://bit . ly/3szss0H

1.3

Colab で WAV ファイルを聞いてみる

3

ノートブックとして提供しています。

1.3

Colab で WAV ファイルを聞いてみる

WAV ファイルは，Windows OS でよく利用されるオーディオデータのファイル形式です。本書のサポートページからダウンロードできる Colab ノートブッ
クでは，必要なライブラリの import を各章の冒頭で済ませますので，以下の 1 行のプログラムで sample / sample . wav を聞くことができます。

ナ社

In[ ]:
Audio('sample/sample.wav')
Out[ ]:

きます。

ロ

三角形の「再生ボタン（▶）」を押せば音が再生されますし，音量も調整でコ実行後の音は右の 2 次元コードのページで聞くことができます（サポートページからもアクセス可能です）。
以上で準備は完了です。次章以降では，Python による音の信号処理に徐々に慣れていきましょう。

2

音 に 触 れ る

本章では，最も単純かつ重要な波形である「正弦波」を計算機で生成するこ換）について学びます。

ナ社とから始めます。そして，アナログ-ディジタル変換（A-D 変
なお，本章において出力される音は，右の 2 次元コードのページでまとめて聞くことができます。

2.1

音を数式で表現するロ

今後の作業に備えて，波形を描く関数 plot_wave をここで定義しておきます（関数 plot_wave は，3 章以降では徐々に機能を増やしていきます。ここコでは，最も基本的な部分だけを示します）。
In[ ]:
def plot_wave(time, amplitude, xtitle = 'Time (s)', ¥ytitle = 'Amplitude (arb.)', hold = False, ¥color = 'blue', marker = ',', legend = '', ¥linestyle = '-'):''' 時間軸データと波形データを受け取り，波形を描く関数を定義する
引数 time:
時刻の離散データ
amplitude: 上記の時刻データに対応する瞬時振幅値
xtitle:
横軸のラベル（暗黙値は 'Time (s)')
ytitle:
縦軸のラベル（暗黙値は 'Amplitude (arb.)'）hold:
False（暗黙値）ならば描画し，True ならばデータを保持する

2.1

音を数式で表現する

color:

グラフの色（暗黙値はブルー）

marker:マーカの種類（暗黙値は pixel）

legend:

凡例の文字列（暗黙値は「なし」）

5

linestyle: 線の種類（暗黙値は実線）'''if (marker != ','):
linestyle = ''＃ マークが pixel でない場合には，＃ データのプロットのみを行い，線では結ばない

ナ社

plt.plot(time, amplitude, color = color, marker = marker, ¥linestyle = linestyle, label = legend)＃ この１行で描画される
if (legend != ''):
＃ 凡例のデータが渡された場合には，凡例を書く関数を呼ぶ
plt.legend()コロ

if (hold == False):＃ hold == False のときは，plt.show() を呼んで描画する
plt.xlabel(xtitle)
plt.ylabel(ytitle)
plt.show()

2.1.1

時間の関数としての音の数式表現

高校の物理では，「音が伝搬する様子」を観察したでしょう（横軸は位置 x のグラフでした）。一方，本書では，「時間の関数としての音」の表現を考えていきます（横軸は時刻 t のグラフです）。音が伝搬しているときに，ある位置においては「時間とともに圧力が変化」しています。もし，その位置に耳があれば，「時間とともに鼓膜が押される／引かれる」が繰り返されるので，音として聞こえるのです。その位置にマイクロホンを置いたと考えて，100 Hz の音を0 . 1 s 間だけ録音したのがアウトプット 2 . 1（図 2 . 1）の波形です（インプット
2 . 1 のプログラムにより描きました）
。

索

索〔い〕

〔え〕
エフェクタ

127

〔お〕
オイラーの定理
オーバラップアド
音 像
音像定位

7

コ〔き〕

奇関数
基本周波数
基本周波数成分
基本波
逆離散フーリエ変換

4926262660〔く〕空間折返しひずみ
偶関数
矩形波

136
49
36〔こ〕
高速フーリエ変換
高調波複合音

54
26

41〔し〕
周 期
周波数
周波数ビン
周波数分解能純 音
振 幅
振幅スペクトル

7764
646742, 46〔す〕

スペクトログラム

ロ

角周波数

45
80
111
111

三角関数の直交性

〔と〕
頭外定位
頭内定位
頭部インパルス応答
頭部伝達関数
トレモロ

ナ社

742, 46
87
93

145

引

〔さ〕

位 相
位相スペクトル
インパルス
インパルス応答

〔か〕

引

77

〔せ〕

線形位相
線状畳込み

〔た〕

第 n 高調波26
第 n 倍音
26
畳込み
93
タップ長
97, 105
単位パルス
87
短時間フーリエ変換
74〔ち〕
遅延和法
重畳加算
直線位相
直線畳込み

135
80
89
117

〔は〕

ハニング窓

71〔ひ〕

ビブラート
標本化
標本化周期
標本化周波数
標本化定理

89
117

116
115
112
112
127130119912〔ふ〕フォルマント複素正弦波
複素フーリエ級数展開
負の周波数
フーリエ級数展開

5645454633〔ほ〕ボイスチェンジャ
方形波

118
36〔ま〕
窓関数
窓関数法

71
100〔り〕
離散フーリエ変換

54

索146
量子化

引
量子化誤差

1118

◇
〔F〕
11〔C〕

〔G〕
Gibbs 現象
Google Colaboratory

〔D〕
54

HRTF

112

37
1〔I〕

〔P〕
1Python

〔S〕
112

STFT

ナ社
ロ

6092, 108

IDFT
IIR

〔H〕
HRIR

コ

DFT

5492, 97FFT
FIR

1Colab16◇〔A〕
A-D 変換量子化精度74

−− 著 者 略 歴 −−
小澤賢司（おざわ けんじ）

東北大学工学部通信工学科卒業
東北大学大学院工学研究科博士前期課程修了（電気及通信工学専攻）
東北大学助手博士（工学）（東北大学）
東北大学助教授
山梨大学助教授
山梨大学教授現在に至るナ社

1986 年
1988 年
1988 年
1994 年
1998 年
1998 年
2007 年

ディジタル音響信号処理入門− Python による自主演習 −検印省略Ⓒ 一般社団法人 日本音響学会 2022

初版第 1 刷発行

コ2022 年 10 月 7 日

ロ

Introduction to Digital Acoustic Signal Processing− Independent Exercises in Python −編
者
発 行 者
印 刷 所
製 本 所

一般社団法人 日本音響学会
株式会社
コ ロ ナ 社
代 表 者
牛 来 真 也新日本印刷株式会社
有限会社
愛千製本所

112-0011
東京都文京区千石 4-46-10
発 行 所
株式会社 コ ロ ナ 社
CORONA PUBLISHING CO., LTD.
Tokyo Japan
振替 00140−8−14844・電話（03）3941−3131（代）
ホームページ https://www.coronasha.co.jp

ISBN 978-4-339-01310-8 C3355 Printed in Japan（森）

本書のコピー，スキャン，デジタル化等の無断複製・転載は著作権法上での例外を除き禁じられています。
購入者以外の第三者による本書の電子データ化及び電子書籍化は，いかなる場合も認めていません。
落丁・乱丁はお取替えいたします。