以下の実験の内容は、おおむね古い卒研のレポートに基づく (松山 [1])。
snd=Import["guitar-5-3.wav","Sound"] |
tbl = snd[[1, 1, 1]]; |
右チャンネルの音が欲しければ tbl=snd[[1,1,2]] とするか、 あるいは {ltbl,rtbl}=snd[[1,1]] として同時に代入する。 ちなみに snd[[1,2]] はサンプリング周波数である。
sr=snd[[1,2]] |
tb = Take[tbl, {1, 3*sr}]; g = ListPlot[tb, PlotRange -> All] |
(サンプリング周波数が sr なので、 から sr で、 秒分のデータということになる。 Take[] は、リストから指定した範囲のデータを取り出す関数である。)
tb = Take[tbl, {62800+1, 62800+sr}]; g = ListPlot[tb, Joined -> True, PlotRange -> {{1, 1600}, {-0.3, 0.3}}] |
ListPlay[tb, SampleRate->sr] |
c = Fourier[tb]; ListPlot[Abs[c], Joined->True, PlotRange->All] |
Abs[] の代わりに Re[], Im[] としてみたり (やや分かりにくいけれど、 の関係が見える?)。
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 番目である。つまり が最大ということ である。(リスト c の1番目の要素は であるので、 リストの要素の番号と Fourier 係数のインデックスが ずれていることに 注意する。)
これは実はこのバイオリンの音の基本周波数が (ドの周波数 に近い -- ぴったりでないのは、 チューニングを少し失敗している) であることを意味する。 (この辺は後で説明する予定である。)
この資料には、どういう結果になるか書いてないが、 http://nalab.mind.meiji.ac.jp/~mk/lecture/fourier-2018/20181128-sound-exp.pdfを公開しておく。
手近の楽器の音 (ピアノ、リコーダー、…) を自分で録音出来る人は、 やっておいて下さい。
桂田 祐史