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 の単位は秒にすべきかも。