無音時間を計測するには?


つよし  2005-03-31 07:37:29  No: 120587

はじめまして。
MIC端子より1KHz正弦波を録音して、断続的な無音(音切れ)時間を計測したいのですがどのような方法が考えられますでしょうか?

関連する質問としましては、以下が参考になるかと思ったのですが、当方VB初心者の為に難解でした。
http://madia.world.coocan.jp/vb/vb_bbs/200406_04060125.html

環境はVB6です。よろしくお願い致します。


ねろ  2005-03-31 17:39:36  No: 120588

単音の有無の確認は、そんなに難しくないかも、
ただし最低でも次の情報は必要。

1、サンプリングの周波数
2、標本化のビット数
3、ステレオかモノラルか
4、ファイルから読み込むのか、リアルタイムに判断するのか
5、正弦波の最大値
6、何波長欠けたら音切れと判断するか(例  1/3波長とか

録音をWindows標準のサウンドレコーダーで行う場合は、
サウンドレコーダーの「ファイル」→「プロパティ」
を見てみると参考になるかも。


つよし  2005-03-31 21:08:32  No: 120589

早速のご回答ありがとうございます。

情報が足りなくて申し訳ございません。
対象ファイルは

サンプリング周波数:11.025KHz
標本化ビット数:8bit
モノラル,PCM

のWAVファイルです。

正弦波の最大値・・・これはD/A変換後の最大値と捉えればよろしいですか?

音切れ時間に関しては1波長0.001sec(1KHz正弦波)ですので100波長分の0.1secと考えておりました。

理想としましてはリアルタイムに音切れを判断したいと思っておりました。
が、他の測定器との通信及びGPSからのデータ取得等々で過大負荷になってしまいそうですので、ファイルからの判断でも・・・と考えておりました。


ねろ  2005-03-31 23:37:04  No: 120590

>正弦波の最大値・・・これはD/A変換後の最大値と捉えればよろしいですか?
8ビットサンプルの場合、データーは正値は0000001〜01111111までの値すなわち
0〜127までの値を、負値は11111111〜10000000つまり255〜128までの値を取ります。
(負値の場合は値が大きくなる程音は小さくなることに注意します。)
00000000は無音です、つまり00000000がデーターとして連続した部分を無音と
判断すれば良いように思われますが、実はマイク入力には雑音が必ず入ります、
雑音と信号を区別する境界線を設ける必要があります。(スレッシュホールド値)
この値を正弦波の最大値から換算することが一般的には必要となります。
正弦波の最大値は音源の音量とマイクボリュームの位置によって変わります。
スレッシュホールド値を厳密に定める必要があるのは、一般的に波形切れの検出が
1/2波長以下の場合で、この質問の様に何波長もの波形切れの検出には、
便宜的に『10以上の値がデーターのある状態』と決めしまっても良いでしょう。
このスレッシュホールド値はプログラム上で可変できる様にしておきます。
又負値(255〜128)は無視して波形が『検波』された状態として判断すれば良いでしょう。
1波長分のデーターは11025/1000=11となり100波長分のデーターは1100となります。
ファイルからデーターを1バイトずつ読んで、1100バイト
の中に11〜127までのデーターが無い場合を、波形切れと判断すればいいことに
なります。
データーは取りあえず、バイナリーアクセスで1バイトずつ読みましょう。
WAVファイルの頭には通常RIFFチャンクという52バイトのフォーマットデーターが
付いています、この部分は読み飛ばしましょう。

オンザフライ(入力と同時進行)で行う場合は、多分データーは割り込みで入って
来るのでしょうから、メインルーチンでLoopを回しAPIのTimeGetTimeを使って
11〜127のデーターの入って間隔を測り100msec以内の間に11〜127のデーターが
入らなかったら、波形切れと判断しても良いでしょう、この処理には殆ど時間は
かかりません。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加