3.6 解析例

2009年度卒業研究 (山田祐二君) の例。 アコースティック・ギターの 5弦3フレットを抑えて弾いた音を録音したWAVEファイル (サンプリング周波数 44.1kHz, 量子化ビット数 16, ステレオという形式) の、62800 個目の数値 (ファイルの最初から $ 62800/44100\kinji 1.42$ 秒後) から 1 秒分を離散 Fourier 変換した。 $ 129\mathrm{Hz}$ , $ 258\mathrm{Hz}$ , $ 388\mathrm{Hz}$ , $ 776\mathrm{Hz}$ , $ 646\mathrm{Hz}$ にピークがある。

  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]]]

図 1: guitar1.wav のスペクトル, 129,258,388,776,646 にピーク
\includegraphics[width=7cm]{spectrum.eps}
図 2: guitar1.wav のスペクトル5つのピーク
\includegraphics[width=7cm]{peakbar.eps}

プログラムは色々改良の余地がある。 どこから解析するか指示する start の単位は秒にすべきかも。

桂田 祐史
2016-11-16