(*  20201202fourier.nb --- このファイルの名前 
(1) サンプル・データは WWW においてあるもの取得して使う。ターミナルで直接 URL を指定して
curl -O http://nalab.mind.meiji.ac.jp/~mk/fourier/guitar-5-3.wav
cp -p guitar-5-3.wav ~/Desktop
のように準備するか、ブラウザーでアクセスして保存する。ここではデスクトップに保存している。
  (2) 以下、最初は真似をすれば良いが、セミコロン ; を入力し損なうと面倒なことが起こるので注意。
*)

(* 今いるディレクトリィは？ *)

Directory[]

(* ファイルを保存した場所に移動する --- デスクトップへ *)

SetDirectory["~/Desktop"]

FileNames[]

fname="guitar-5-3.wav"

(* WAVEファイル読み込み *)

snd=Import[fname,"Sound"]

(* サンプリング周波数を取得する。以前は snd[[1,2]] としていたけれど、今年度はお行儀よくする *)

sr=Import[fname,"SampleRate"]

(* チャンネルの数を取得する。2ならばステレオ、1ならばモノラル *)

ch=Import[fname,"AudioChannels"]

(* 標本化データを取得する。以前は samples=snd[[1,1,1]]; とかしていた。 *)
sl=Import[fname,"SampledSoundList"];

(* モノラルの時は次が唯一のデータ、ステレオの時は左チャンネル *)

samples=sl[[1,1]];

(* 次はステレオのときのみ存在する。右チャンネルのデータ。モノラルのときやると叱られるので飛ばす *)
rsamples=sl[[1,2]];

(* 先頭から3秒分取り出す *)

s3=Take[samples,{1,3*sr}];

g1=ListPlot[s3,PlotRange->All]

(* 62800番目から1秒分取り出す *)

x=Take[samples,{62800+1,62800+sr}];

(* 1600個分のサンプルをプロットしてみる *)

g2=ListPlot[x,Joined->True,PlotRange->{{1,1600},{-0.3,0.3}}]

(* 1秒分のデータ x を鳴らしてみる *)

ListPlay[x,SampleRate->sr]

(* 離散Fourier変換する *)

c=Fourier[x];

(* 離散Fourier係数の絶対値 (いわゆるスペクトル) をプロットする *)

g3=ListPlot[Abs[c],Joined->True,PlotRange->All]

(* ピークを探す *)

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

(* 逆離散Fourier変換を試す *)

x2=Re[InverseFourier[c]];

Norm[x-x2]

ListPlay[x2,SampleRate->sr]

(* 付録 --- 音声ファイルには色々な要素が入っている。それを表示する *)
showallelements[fname_]:=Block[{i,elname=Intersection[{"AudioChannels","BitRate","Duration","Length","MetaInformation","RawMetaInformation","SampleDepth","SampleRate"},Import[fname,"Elements"]]},
For[i=1,i≤Length[elname],i++,Print[elname[[i]],"=",Import[fname,elname[[i]]]]]]

showallelements[fname]