見出し画像

音声信号処理、wavファイルヘッダーデータ表示

音声信号処理の勉強の為、書籍等を参考にして、実際にソフトウエア等を作成し実験してみた。今回は、wavファイルを読み込んでヘッダー部分のデータを表示させる。
参考にさせていただいた書籍は、
サウンドエフェクトのプログラミング Cによる音の加工と音源合成
参考にさせていただいたWEBページは、
音ファイル(拡張子:WAVファイル)のデータ構造について
以前購入していた上記の書籍「サウンドエフェクトのプログラミング Cによる音の加工と音源合成」を使って音声信号処理を勉強する為P48~P52の「3.5 音ファイルの入出力」を実験していたところ、書籍のプログラムのサンプルはおそらく1ch、16bit、リニアPCMにあえて機能を絞っている様なのにも関わらず、自分は、2ch、16bitのwavファイルをコピーしてファイルが短くなったり、1ch、8bitのwavファイルをコピーしてファイルが長くなったりした。書籍のサンプルソースを読んであえて機能を絞っているのではないかと判って来ましたが、対象のwavファイルをバイナリーエディタで確認しても判りにくい為、wavファイルを読み込んでヘッダー部分のデータを表示させるプログラムを作成した。

書籍「サウンドエフェクトのプログラミング Cによる音の加工と音源合成」では、プログラム開発環境としてBorland C++ Compiler (BCC55)を使用していましたが、自分は後継(?)のFree C++ Compiler (BCC102)を使用しています。
以下のWEBサイトを参考にさせていただきインストールした。
実践編・Free C++ Compiler 開発環境ポータブル化
C++ Compilerのダウンロードとインストール
「サウンドエフェクトのプログラミング Cによる音の加工と音源合成」のP48~P52の「3.5 音ファイルの入出力」のサンプルプログラムは以下の様にするとコンパイル出来た。
bcc32c -c wavread.c
bcc32c -c wavwrite.c
bcc32c wavreadtest.c wavread.obj wavwrite.obj
(ワーニングは出たがコンパイル成功。)

wavファイルの形式は以下の様になっている。
「サウンドエフェクトのプログラミング Cによる音の加工と音源合成」のP52~P53及びWEBページ「音ファイル(拡張子:WAVファイル)のデータ構造について」を参考にしてExcelで表にまとめた。

画像1 wavファイルの形式

wavファイルを読み込んでヘッダー部分のデータを表示させるプログラムwav_header_disp.cを作成する。ただしかなり書籍「サウンドエフェクトのプログラミング Cによる音の加工と音源合成」のwavreadtest.cを参考にさせていただいていてかなりの部分をそのまま使っています。
また、書籍のwavlib.hとwavread.cをそのまま使わせていただいていて、wav_header_disp.cと同じフォルダに入れて以下の様にコンパイルする。
bcc32c -c wavread.c
bcc32c wav_header_disp.c wavread.obj
実行はヘッダー部分を表示させたいwavファイルを指定する。
実行例
wav_header_disp inputsound.wav
実行している様子がタイトルにもしているこの画像。

画像2 実行している様子

以下にwav_header_disp.cのソースリストを載せる。
上記に書いた様に書籍のwavreadtest.cを参考にさせていただいていてかなりの部分をそのまま使っています。
また、書籍のwavlib.hとwavread.cをそのまま使わせていただいている為、こちらは載せるのを控えています。

// wavファイルのヘッダー情報を表示させる
#include <stdio.h>
#include <stdlib.h>
#include "wavlib.h"  // wavライブラリー使用手続き
// 実行方法: wav_header_disp wavファイル名
// ヘッダーの表示のみの為、8bitでも16bitでも1chでも2chでもOKのハズ
int main(int argc, char *argv[])
{
  char *fnI;                                                           // ファイル名格納
  wav_head bufhead;                                                    // wavファイルヘッダー部分格納
  int i;

  if(argc != 2) {
    printf("\nusage: %s I_filename \n",argv[0]);                       // 実行例 wavreadtest hapyou2.wav
    printf("  I_filename   : header display sound file name\n");
    return 0;
  }
  // ファイル名関係
  fnI = calloc(100,sizeof(char));                                      // メンバー数, 1個のサイズ
  sscanf(argv[1],"%s",fnI);                                            // 入力文字列へのポインタ, 文字列フォーマット, 出力する変数
  // wavファイル読み込み
  wavread(&bufhead,fnI);
  // 表示
  printf("RIFF         = ");  for (i = 0; i < 4; i++)  putchar(bufhead.RIFF[i]);  putchar('\n');
  printf("riff_size    = %ld\n",bufhead.riff_size);
  printf("riff_kind    = ");  for (i = 0; i < 4; i++)  putchar(bufhead.riff_kind[i]);  putchar('\n');
  printf("fmt          = ");  for (i = 0; i < 4; i++)  putchar(bufhead.fmt[i]);  putchar('\n');
  printf("fmt_chnk     = %ld\n",bufhead.fmt_chnk);
  printf("fmt_id       = %d\n",bufhead.fmt_id);
  printf("Nch          = %d\n",bufhead.Nch);
  printf("fs           = %ld\n",bufhead.fs);
  printf("dts          = %ld\n",bufhead.dts);
  printf("bl_size      = %d\n",bufhead.bl_size);
  printf("bit          = %d\n",bufhead.bit);
  if (bufhead.fmt_chnk != 16) {
    printf("fmt_ext_size = %d\n",bufhead.fmt_ext_size);
    putchar('\n');
  }
  printf("data_chnk    = ");  for (i = 0; i < 4; i++)  putchar(bufhead.data_chnk[i]);  putchar('\n');
  printf("Nbyte        = %ld\n",bufhead.Nbyte);
  putchar('\n');

  return 0;
}

今回は以上です。

この記事が気に入ったらサポートをしてみませんか?