音声信号の取り扱い

2011 Nov. 3 Masahiro Mizutani

Wave ファイル（モノラル）を読み込む

something=Import["~/Desktop/something.wav"]

ボタン (>) を押すと再生される（なんだか分かるかな？）

Waveファイルを数値データとして読み込む

上でインポートしたwaveファイルはMathematicaではsoundオブジェクトとして扱われる。その構造は次のようになっている

something /. Sound->List

サンプリングデータ

最後の数字44100がサンプリング周波数(Subscript[f, s])。
1秒間に r =44100 回サンプルされた振幅レベル値は（振幅値は-1から1の実数近似値）がリストデータとして並んでサウンドデータを構成している。このwavデータはCD（サンプリング周波数(Subscript[f, s])=44.1KHz）から得たもので、再生可能周波数はサンプリング周波数(Subscript[f, s])の半分、22KHzである。
ちなみに、DVDの(Subscript[f, s])=48KHz、AMラジオの(Subscript[f, s])=22KHz, 電話の(Subscript[f, s])=11KHz

wavファイルのサンプリングデータの取得

インポート関数 Import[ ] でオプション "Data" を指定

dthing=Import["~/Desktop/something.wav","Data"]

注意：
数値の並びの1つの長大なリスト {(Subscript[s, 1])(Subscript[s, 2]),...,(Subscript[s, N])}が{}でリスト化されている、つまり"Data"オプション付きでInportしたリストは1つの要素（その要素が {(Subscript[s, 1])(Subscript[s, 2]),...,(Subscript[s, N])}である）からなってる。
wavファイルデータ並びdthingから、数値並びリストを取り出すには、例えば、 1番目の要素としてFirst[dthing]、あるいは最後の要素としてLast[dthing]を実行する。

この例では 94234 個の数値が並んでいる。

len=Length[First[dthing]]

Log[2,len]//N

振幅レベル値をプロット

上で表示されているものは、サウンドデータの並び1秒間に r =44100 回サンプルされた振幅レベル（振幅値は-1から1の実数近似値）がリストデータとして並んでいる 。

ListPlot[dthing]

振幅レベル値データ並びからサウンドを再生する

振幅レベルデータ並び dthing とそれが得られたサンプリング周波数 44100 信号を指定してSampledSoundList[ ]関数でsoundオブジェクトにする。Sound関数wavファイルの原音を再送できる。

Sound[SampledSoundList[dthing,44100]]

注意：
振幅レベルデータ並びがどんな時間間隔で得られたのか、つまりサンプリング周波数を正確に与えないと「原音」再生とはならない。 実際、散布するした時間間隔を2倍、、サンプリング周波数を半分にした次のsoundオブジェクトを再生してみよう

Sound[SampledSoundList[dthing,22050]]