未分類

WAVEファイルの波形をgnuplotで表示してみる

サウンドエフェクト、信号処理に興味があるが前提知識が全く無い状態。
とっかかりとして、まずはWAVEファイルを理解することから初めてみることにした。
今回はかじり得た知識を使ってWAVEファイルから音データを抜き出して波形を表示してみた。実行環境はLinux(CentOS 7)。

WAVEファイルとは

WAVEファイルとはWindowsで音情報をディジタル信号に変換したデータのこと。例えばWindowsの警告音やシャットダウン時の音で使用されている。

波形表示対象のWAVEファイル

新しく用意するのも面倒なので下記のWindows PCのエラー音(Windows エラー.wav)を使うことにした。

f:id:segmentation-fault:20170806222158p:plain

ファイルフォーマット

公式な文書は見つけらなかったので、下記を参考にさせていただいた。

www.youfit.co.jp

 


ファイルフォーマットと照らし合わせながら実際のパラメータ値がどうなっているか確認する。

RIFFチャンク

パラメータサイズ(byte)値(16進数)補足
チャンク識別子40x52494646‘RIFF’
チャンクサイズ40x00029e24171556byte ヘッダサイズ(36byte)+dataチャンクのチャンクサイズ
フォーマットタイプ40x57415645‘WAVE’

fmtチャンク

パラメータサイズ(byte)値(16進数)補足
チャンク識別子40x666D7420‘fmt’
チャンクサイズ40x0000001016bit
フォーマットタイプ20x0001PCM
チャンネル数20x0002ステレオ
サンプリング周波数40x0000ac4444.1Khz
1秒あたりバイト数40x0002b110サンプリング周波数×ブロックサイズ
ブロックサイズ20x00044byte
量子化精度20x001016bit

dataチャンク

パラメータサイズ(byte)値(16進数)補足
チャンク識別子40x64617461‘data’
チャンクサイズ40x00029e00171520byte

16bitステレオなのでデータを抽出するときは4byte(L,Rの順で2byte)ずつ読み込んでいけば良いようだ。

データ抽出プログラム

構造体は下記のように定義しておく。

読み込んだデータは3列(時間 L(左) R(右))で表示する(後でgnuplotに食わせる為)。

ソースコード全体(plotwav.c)

波形表示