(C)Copyright 2000 NTT Cyber Space Laboratories
TwinVQ Ver. 2.3
平成12年10月4日
TwinVQ エンコーダは、オーディオデータを入力し、そのデータを圧縮して TwinVQ データ(ビットストリーム)を生成するプログラムです。
オーディオデータの入力デバイスと、TwinVQ データの出力デバイスは、決められたインタフェースに従った入出力ができれば何であってもかまいません。サンプルプログラムでは、入力も出力もファイルに対して行っています。
TwinVQ データの形式はあらかじめ決まっており、図1のようにヘッダ部とオーディオデータ部を持っています。オーディオデータ部には、TwinVQ エンコーダによって圧縮されたオーディオ信号(TwinVQオーディオデータ)が記録されています。ヘッダ部には、オーディオデータを解凍するのに必要なパラメータや、曲名などの、補助情報が記録されています。
図1: TwinVQ データの基本構造
なお、TwinVQ データ形式についての詳細については、TwinVQ データフォーマット説明書をご覧ください。
TwinVQ エンコーダプログラムは図2のように、5つのモジュールで構成します。モジュール間では、様々な形式でデータがやり取りされます。データの流れのうち、緑色の線で書かれたものは、入出力デバイスの種類によってインタフェースが変わります。サンプルプログラムでは、入力側も出力側もファイル入出力を使っています。
図2:TwinVQ エンコーダプログラムの構成
float[]
型の配列)に変換して出力します。様々な入力デバイスの形態の違いは、このモジュールで吸収します。サンプルプログラムでは、ファイル入力の形態で提供しています。エンコーダを動作させる手順の概要は以下のとおりです。
{
<初期化>
while( <フレームごとのオーディオデータ読み込み> ){
<エンコード処理>
<ビットストリーム書き込み>
}
<終了処理>
}
この手順はエンコーダメインプログラムに持たせます。詳しくは、サンプルプログラムの
main() (encoder.cxx)
関数を参照してください。
初期化は、TwinVQ エンコーダプログラムを動作させる前に必ず行う必要があります。初期化手順の詳細については、エンコーダ初期化マニュアルを参照してください。
フレームごとに、オーディオデータを読み出します。サンプルプログラムでは、16
bit PCM ファイルから fread()
関数を使って読み出しています。読み出したデータは、
"L,R,L,R" という順番で並んでいる
short データなので、これを buftofr()
関数を使って TwinVQ の入力フレームに変換しています。
エンコード処理では、入力フレームのオーディ信号を圧縮して
INDEX 形式のビットストリーム情報を出力します。TvqEncodeFrame()
関数を使います。
ビットストリームの書き込みは、フレームごとに行います。サンプルプログラムでは、TvqWriteBsFrame()
という関数がソースコードで用意されています。この関数は、TwinVQ
エンコーダモジュールが出力した符号化インデックス
(INDEX
) をビットストリームに変換し、ビットストリームファイルに書き込みます。
エンコード処理を終了、または、エンコード条件を変更するために再度初期化をする時には、終了処理を行う必要があります。終了処理は、次の項目からなります。処理の順序の制約はありません。
パッケージには、コンパイル済みの実行ファイル TestEnc.exe がすでに入っていますが、改めてコンパイルする場合には、Visual C++ 6.0 用のワークスペース TestEnc.dsw を使ってビルドしてください。Linux システムでお使いの場合には、ModEnc ディレクトリ上で、make してください。
DOS プロンプトから実行します。
TestEnc [オプション] <入力オーディオファイル名> <出力ビットストリームファイル名>
で実行できます。オプションの内容とデフォルト値は以下の通りです。サポートされているパラメータの組み合わせはこちらをご覧ください。
セットアップパラメータ | 指定オプション名 | デフォルト | 備考 |
サンプリング周波数モード | -f <#> | 44 | |
全チャネルトータルの ビットレート |
-b <#> | 96 | |
チャネルモード | -c <#> | 1 (ステレオ) | モノラル: 0 |
N_CAN | -n <#> | 16 | 1, 2, 4, 8, 16, 32 のいずれか 値が大きいほど高音質。 値が小さいほど高速。 |
ファイルタイプ | -t <string> | wav | ファイルタイプを指定、wav なら WAV ファイル、raw ならヘッダなしファイル |
タイトル | -T <string> | "" | |
コメント | -C <string> | "" | |
アーティスト | -A <string> | "" | |
著作権情報 | -R <string> | "" | |
ヘッダ情報の格納ディレクトリ | -h <string> | "header_info" | 拡張ヘッダ情報のパラメータファイルを置くディレクトリ |
サポートしている入力オーディオファイルの形式は、*.wav 形式又はヘッダなし 16 bit PCM です。ヘッダなし 16 bit PCM ファイルについて、1サンプルは 2Byte データで格納されています。ステレオの場合は、L, R, L, R の順でサンプルが並んでいます。
ヘッダ情報のうち、標準チャンクの情報は全て引数で指定できますが、それ以外のヘッダ情報は、実行ディレクトリに置かれた header_info ディレクトリの下にあるパラメータファイルによって与えます。追加情報のチャンクIDはファイル名によって指定し、その内容はファイルにテキスト形式で記述します。フィールドはスペースまたは改行によって指定します。SCNDチャンクを構成するサブチャンクは、header_info\SCND ディレクトリにパラメータファイルを置くことで指定します。なお、header_info ディレクトリは、-h オプションによって別のディレクトリに変更することができます。ヘッダ情報についての詳細は、TwinVQ データフォーマット説明書を参照ください。
なお、エンコーダサンプルプログラム encoder.cxx の他に、TwinVQ エンコーダを最小限に構成する simple_enc.cxx が収納されています。このプログラムは encoder.cxx と差し替えて利用することができます。
エンコーダ DLL 関数は、次の3つのカテゴリーに分けられます。
エンコードを実行するには、最初に1回初期化を行ってから、フレームごとにエンコード処理を行います。終了処理はエンコードを終了、または符号化条件を変えるために再度初期化を行う時に行います。問い合わせ関数は、TwinVQエンコーダの内部状態を問い合わせるための関数です。
使用できるエンコーダ DLL 関数は以下の表のとおりです。
カテゴリ | 関数名 | 必須 | 概要 |
初期化/終了処理用関数 | TvqEncInitialize() |
○ | TwinVQ エンコーダモジュールを初期化する。 |
---|---|---|---|
TvqEncTerminate() |
○ | TwinVQ エンコーダモジュールの終了処理をする。 | |
TvqEncGetVectorInfo() |
○ | VQ ビット情報を初期化する。ビットストリーム書き出しモジュールのサブプログラム。 | |
TvqEncResetFrameCounter() |
フレームカウンタをリセットする。 | ||
エンコード処理用関数 | TvqEncodeFrame() |
○ | フレームごとにエンコード処理をする |
TvqEncUpdateVectorInfo() |
○ | VQ ビット情報を更新する。ビットストリーム書き出しモジュールのサブプログラム。 | |
TvqEncSetFrameCounter() |
フレームカウンタを任意の値にセットする。 | ||
問い合わせ関数 | TvqEncCheckVersion() |
○ | バージョン ID 番号 |
TvqGetVersionID() |
○ | バージョン ID 文字列 | |
TvqEncGetSetupInfo() |
セットアップ情報 | ||
TvqEncGetConfInfo() |
○ | TwinVQ モジュールの設定パラメータ | |
TvqEncGetFrameSize() |
○ | フレームサイズ | |
TvqEncGetNumChannels() |
○ | チャネル数 | |
TvqEncGetBitRate() |
ビットレート | ||
TvqEncGetSamplingRate() |
サンプリング周波数 | ||
TvqEncGetNumFixedBitsPerFrame() |
1フレームあたりのビット数 | ||
TvqEncGetNumPreCand() |
VQ 予備選択数 | ||
TvqEncGetNumFrames() |
フレームカウンタの値 | ||
TvqEncGetModuleVersion( ) |
エンコーダモジュールのバージョン |
カテゴリ | 関数名 | 必須 | 概要 |
初期化用 | TvqPutBsHeaderInfo() |
○ | ビットストリームヘッダを書き込み |
TvqinitBsWriter() |
○ | ビットストリーム書き込みモジュールの初期化 | |
機能関数 | TvqWriteBsFrame() |
○ | ビットストリームのフレーム単位の書き込み |
TvqCreateHeaderChunk()
buftofr()