2 guitar-5-3.wav の音を離散Fourier変換する

以下の実験の内容は、おおむね古い卒研のレポートに基づく (松山 [1])。
snd=Import["guitar-5-3.wav","Sound"]
これでファイル guitar-5-3.wav を変数 snd に読み込む。 ボタンを押すと音が再生できる。
tbl = snd[[1, 1, 1]];
左チャンネルの音の数値データを変数 tbl に代入した (tbl は table (表) のつもり)。

右チャンネルの音が欲しければ tbl=snd[[1,1,2]] とするか、 あるいは {ltbl,rtbl}=snd[[1,1]] として同時に代入する。 ちなみに snd[[1,2]] はサンプリング周波数である。
sr=snd[[1,2]]
変数 sr の値は $ 44100$ となるはずである。音楽用 CD と同じ、 $ 44.1\;\mathrm{kHz}$ というサンプリング・レートで 録音したことを示している。

tb = Take[tbl, {1, 3*sr}];
g = ListPlot[tb, PlotRange -> All]
sr から3秒分のデータを取り出して、プロットしてみた。

(サンプリング周波数が sr$ =44.1\;
\mathrm{kHz}$ なので、$ 1$ から $ 3*$sr で、 $ 3$ 秒分のデータということになる。 Take[] は、リストから指定した範囲のデータを取り出す関数である。)

tb = Take[tbl, {62800+1, 62800+sr}];
g = ListPlot[tb, Joined -> True, PlotRange -> {{1, 1600}, {-0.3, 0.3}}]
音が鳴り始めるのは62800 番目辺りからなので、 そこから1秒分 ( sr$ =44100$ 個のデータを)取り出して、 1600 個分 ( $ 1600/44100\kinji 0.036$ 秒分) プロットしてみた。 ここは色々試してみると良い。

ListPlay[tb, SampleRate->sr]
とすると、取り出したデータ tb の音 (1秒分) を鳴らすことが出来る。

c = Fourier[tb];

ListPlot[Abs[c], Joined->True, PlotRange->All]
tb の離散 Fourier 変換 c を求め、 絶対値をプロットした。これから周波数の分布が読み取れる (はず)。

Abs[] の代わりに Re[], Im[] としてみたり (やや分かりにくいけれど、 $ C_n=\overline{C_{N-n}}$ の関係が見える?)。

graph[c_, n1_, n2_] := ListPlot[Abs[c], Joined -> True,
        PlotRange -> {{n1, n2}, {0, Max[Abs[c]]}}]

graph[c, 1, 1600]
graph[c, 120, 140]

Manipulate[
 graph[c, n1, n2], {n1, 1, Length[c], 10}, {n2, 1, Length[c], 10}]

範囲を区切って表示することで、ピークを探してみた。 ピークは 130 番目である。つまり $ \left\vert C_{129}\right\vert$ が最大ということ である。(リスト c の1番目の要素は $ C_0$ であるので、 リストの要素の番号と Fourier 係数のインデックスが $ 1$ ずれていることに 注意する。)

これは実はこのバイオリンの音の基本周波数が $ 129\;\mathrm{Hz}$ (ドの周波数 $ 131$ に近い -- ぴったりでないのは、 チューニングを少し失敗している) であることを意味する。 (この辺は後で説明する予定である。)


この資料には、どういう結果になるか書いてないが、 http://nalab.mind.meiji.ac.jp/~mk/lecture/fourier-2018/20181128-sound-exp.pdfを公開しておく。


手近の楽器の音 (ピアノ、リコーダー、…) を自分で録音出来る人は、 やっておいて下さい。

桂田 祐史
2018-11-28