2009年度卒業研究 (山田祐二君) の例。
アコースティック・ギターの
5弦3フレットを抑えて弾いた音を録音したWAVEファイル
(サンプリング周波数 44.1kHz, 量子化ビット数 16, ステレオ, という形式)
の、62800 個目の数値 (ファイルの最初から
秒後)
から 1 秒分を離散 Fourier 変換した。
,
,
,
,
にピークがある。
SetDirectory["c:/Documents and Settings/ユーザー名/デスクトップ/どこか"]
wavFourier[snd_,start_] :=
Abs[Fourier[Take[snd[[1,1,1]],{start,start+snd[[1,2]]-1}]]]
plotSpectrum[spec_] :=
ListPlot[spec,PlotJoined->True,PlotRange->{{1,1600},All}]
peakPositions[spec_,n_] :=
Module[{pp,pps,halfspec},
pps={}; halfspec=Take[spec,Floor[Length[spec]/2]];
For[i=1,i<=n,i++,
pp=Ordering[halfspec,-1][[1]];
pps = Append[pps,pp];
For[j=-6,j<=6,j++,halfspec[[pp+j]]=0]
];
pps
]
peakBar[spec_,pps_]:=BarChart[spec[[Sort[pps]]],ChartLabels->Sort[pps]-1]
sounddata=Import["guitar1.wav"];
aft=wavFourier[sounddata,62800];
g1=plotSpectrum[aft]
pps=peakPositions[aft,5]
結果は {130, 259, 389, 777, 647}
g2=peakBar[aft,pps]
解析位置
For[s = 40000, s <= 80000, s += 2000,
Print[peakPositions[wavFourier[Import["guitar1.wav"], s], 5]]]
|
プログラムは色々改良の余地がある。 どこから解析するか指示する start の単位は秒にすべきかも。