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