【PCMファイル編集】Cygwinとコマンドプロンプトにて

f:id:TurnipCucumber:20171221165620p:plain

 

こんにちは、かぶきょうりです。

 

先日、PCMファイルを編集していて初めて気づいた事があったので

記事にしておこうと思います。

 

PCMファイルとは

音をデータ化した最も基本的な音声フォーマットです。

特徴としては、

  1. 量子化ビット数が16bitで構成されている点です。
  2. データ部のみで構成されており、1サンプル毎にデータが記載されている。

サンプリング周波数は、場合によって変更されている事があります。

 

※サンプリング周波数・・・1秒間の数値回数

 量子化ビット数・・・1回のサンプリングあたりのビット数

 

作業目的

2つのマイクを使用して収録したPCMファイルを各マイクごとの音声に分解するという事を実施しました。

 

ツール等を使用すれば簡単にできると思うのですが、C言語を使用して挑戦してみました。

 

作業環境

 

今回躓いたところ

Cygwinでのプログラミング作成は、何事もなく進み完成しました。

最後に出来心で

「Cならプロンプトでも問題なく動くだろう」

とか思ってしまい、

 

gccMinGWからインストールして実行したところ、分割した音声ファイルがおかしなことに。。。

 

原因究明の為にいろいろ調査したところ、以下のことが判明した。

  • 分割後のファイルサイズが大きくなっていたと

結論

調査の結果、書き込み処理で音声ファイルに異常が発生している事がわかった。

特にファイルを開く際に問題があり、fopenコマンドで以下のように記載していた為音声ファイルが異常な状態となっていた。

 

  ファイルポインタ  =  fopen( 対象ファイル , "a" );

 

そう、PCMファイルはバイナリファイルなのでfopenコマンドでは"b"オプションを追加して以下のように記載しなければならない。

 

  ファイルポインタ  =  fopen( 対象ファイル , "ab" );

 

なぜ

無事に問題は解決したものの、一つ釈然としない問題が。。。

なぜ、Cygwinでは問題なく動作していたのにコマンドプロンプトではだめだったのだろうか。。。。?

 

今回の問題、プロンプトで実施してみなければ直面しなかったことなので、見識を深めるためにももう少し調査してみた。

 

調査結果

 

結果、バイナリファイルを扱う場合にfopenの"b"オプションが不足しているとWindows環境では特有の挙動をすることが分かった。

 

  • Windows環境以外では、バイナリ操作を行う際に改行コードにLF(ラインフィード)が挿入されるが
  • Windows環境では、CR+LF(キャリッジリターン+ラインフィード)が挿入されるらしい、なのでWindows環境では"b"オプションを指定して改行コードをLFにしてあげる必要がある。

 

上記の理由で、Cygwinでは正常に実行できていたが、コマンドプロンプトでは異常な音声ファイルとなってしまったようです。

 

まとめ

  • Windows環境でバイナリファイルを扱う際は改行コードに注意。
  • C言語でfopenを実行する際は環境ごとに挙動がかわるので注意。

 

いやぁ、解決できたすっきりしました。

 

今回はPCMファイル編集プログラム(C言語)について記載しました。

ご覧戴き、ありがとうございました。