Linux 用オーディオプログラム

片山泰男(Yasuo Katayama)
May 17 2016

(1) Linux 用オーディオ入出力プログラム。初心者への参考。

ao: wave file to audio
Usage:./ao [-][-b][-fN][-vN] [file]
- from stdin
-m mono
-b Big Endian
-fN N: sampling frequency [Hz]
-vN N: [1,100] volume

ai: audio to wave file
Usage:./ai [-][-b][-fN][-vN] file
- from stdin to stdout
-m mono
-b Big Endian
-fN N: sampling frequency [Hz]
-vN N: [1,100] volume

オーディオ入出力プログラムソース 16kB : aio.tgz


(2) Linux 用 Waveファイル切出ヘッダ修正器 1kB : cutw.tgz
cutw: cut out a part of wave file and modify wave header.
Usage: ./cutw start end (start (byte position) >=44, start < end (byte position)


(3) Linux 用オーディオ符号化復号プログラム。単純な独自方式 (MDCT (block length= 4K sample) + frequency adaptive quantize + run-level 2 dimensional Huffman code)。
256 サンプル位からブロックサイズを大きくするだけで(どこまでも)符号化効率が上がった。(4回ほど2倍した4Kサンプルが最適。) 2次元VLCには効果があり、大ブロックサイズにはハフマンコード作成が効果あった。

dm: encoder
Usage: ./dm [-r N] [file.wav [bitstream]]
-r N: bitrate (def. 64 [kbps])
-v V: volume(0-100(def. 80))
- : reconst wav file to stdout(def. audio)

dd: decoder + audio出力
Usage: ./dd [-] [file(.dms)]
file.dms encoded bitstream(def. stdin)
options:
-v V: volume(0-100(def. 80))
-: reconst wav file to stdout(def. audio)

オーディオ符号化復号プログラムソース 10kB (2002/8/13 版) : dm05.tgz
符号例 Bach平均律第1(ハープシコード 24kbit/s) 674kB 3m49sec : bach_well_tuned1.dms


(4) オーディオ符号化復号プログラムソース 13kB (2002/8/16 版 仕様変更) : dm07.tgz
de: decoder + audio output
Usage: ./de [-v V] [file(.dms) [rcst.wav]]
file.dms: bitstream file (.dms can be reduced) (def. stdin)
rcst.wav: reconst wav file (def. audio device)
-v volume: 0-100 (def. 80)

en: encoder for wave file
Usage: ./en [-options] [file.wav [bits.dms [reco.wav]]]
file.wav: input wav file
bits.dms: output encoded bitstream (def. file.dms)
reco.wav: output decoded wav file (def. audio dev)
options:
-r N: bitrate (def. 64 [kbps])
-v V: volume(0-100(def. 80))
-o: reconst wav to stdout
-n: no decoding

アルゴリズムの説明は、dm07.tgz 内の dm.txt を参照。以下は、それ。

独自方式オーディオ符号化のアルゴリズム
片山泰男

1. 入力のリーキー予測と出力のその逆変換

サンプルあたり、1/16 のリーキー予測によって高域強調し、符号化系に与える。出力ではその逆処理を行う。高域強調は、一般には符号化効率を上げる。 摩擦音等ではそれをさける方がよいが、その仕組みは入っていない。

2. 適応フレーム長

MDCTの変換点数 N= 4096 が符号化効率から最適である。しかし、アタック音のためにそれよりも小さい幅をフレームとすることのできる仕組みをとる。 最大フレーム長を 4096 として、その 1/2, 1/4, 1/8の幅をフレームとすることを可能にしている。

3. 変換

時間信号を周波数上のパターンにする変換が行われる。音楽符号化の目的には、離散フーリエ変換(DFT)、離散コサイン変換(DCT)が使用可能である。 一般的には変形離散コサイン変換(MDCT)がよく使用される。 離散フーリエ変換(DFT) では、音響信号が実信号なので、DFTは N点の実信号からの cos 係数 N/2+1 点と sin 係数 N/2-1 点との合計N点で表現する。 左右の信号(L,R)を実部と虚部にあてた複素数信号として N 点 FFT で左右両方の変換をするという方法もある。 離散コサイン変換(DCT)は、N 点から N 点への変換であるが、計算処理は、N/2点の FFT を使用することができる。 変形離散コサイン変換(MDCT)は、2N 点の窓掛け信号を N 点で表現できる。現在は、MDCT がその性能が最大であるため、これを使う。

4. 量子化と逆量子化

N 点の周波数位置によって量子化粗さを変更する量子化マトリックス qm[BL] とともに、レート制御からも量子化粗さを変更する必要があるため、量子化パラメ タ qp[ch] の両者の積で量子化粗さを与える形をとった。これは、MPEG Video の方式をとりいれたものである。量子化、逆量子化は、次の式によって表される。 (QV= 4096)

for(i=0;i<n;i++){
	c= coef[ch][i];
	q= qp[ch]*qm[i];
	if(c< 0) q= (c*QV-q/2)/q;
	 else   q= (c*QV+q/2)/q;
	qcoef[i]= q;
	rcoef[i]= q*qp[ch]*qm[i]/QV;
}

5. 符号化

量子化係数のエントロピー符号化である。変換係数は一般に低域に集中するので、変換の低域から高域へ向かって符号化する。 これには、 MPEG Video の方式を採り入れた、ランとレベルの2次元VLCを使用した。先行する 0 の個数を run と呼び、量子化係数を level という。 両者のペアに対して統計からハフマン符号を設計した。VLC総数は HTL= 256に設定されている。VLCが用意されていないランレベル対のとき使われる ESC コードと、ブロック終了を示す、EOB を含む。

6. 分析窓と合成窓

エンコーダでは、変換と量子化の前に、分析窓掛けを行い、量子化係数の符号化をする。逆量子化、逆変換の後に、合成窓掛けを行う。 フレームはすべての点で前後のフレームとオーバーラップしている。分析窓は、変換前の窓掛けで、信号の範囲をオーバラップ中央に絞る働きがある。 信号のこのフレームの部分を重み付けするのである。 合成窓は、再生信号を切れ目無く連続させる、ブロック歪み除去の働きをもつが、符号化波形と使用波形が異なるという基本的欠点がある。 分析窓と合成窓は、両方とも sin(π(i+.5)/2N) 窓を使うことが多いが、それには自由度がある。分析窓と合成窓の両方が掛かるために、 W_1:分析窓、W_2:合成窓とするとき、

W_1(i)W_2(i)+ W_1(i+N)W_2(i+N)= 1

の条件が必要である。通常同じ長さのフレームが連続するとき、分析合成ともに対称窓である。

W_1(i)= W_1(2N-1-i), W_2(i)= W_2(2N-1-i)

分析窓処理では、現フレームの N 点の前後 2N 点に窓掛けして、 MDCT,Q,Q-1,IMDCT に渡す。前後のフレーム長が現フレーム長と異なるときは、 窓の形が変わってくる。合成窓掛けと前後のフレームへの加算は次のようにする。 2N 点に合成窓 W2 を掛け、結果の前半のサンプル(0〜N-1)は、過去の遅延バッファに記憶された波形に加算して出力する。結果の後半(N〜2N-1)を 遅延バッファにしまう。

7. MDCT と 窓関数の関係

MDCTは、2N 点の信号を変換して、N 点の係数で表現する。しかし、当然 2N点の任意の信号を N 点で表現できるわけではない。前半 N 点では、 前半の中央 N/2-0.5 を中心とする奇関数、後半 N 点では、後半の中央 3/2 N-0.5を中心とする偶関数しか表現できない。 順方向の MDCT 変換(FMDCT)は、前半では奇成分抽出のための折り返し、後半では偶成分抽出のための折り返しをして、N点にしてから N to N の 順変換をする。逆方向の MDCT 変換(IMDCT)は、前半では奇関数、後半では偶関数成分の再現をするため、前半は、奇成分展開(符号を反転してコピー)、 後半は、偶関数展開(コピー)をしてN点から、 2N 点に広げる処理をする。またこのことから分かるが、 MDCTは中央の膨らんだ信号を表現する能力はない。 MDCTは、前後のフレームとの半分重ねる形で使う。現フレーム前半では、以前のフレーム後半が偶成分を表し、現フレームは、奇関数成分を表す。 両者が正しく揃って初めて連続する任意の信号を表現できる。このような重なりの利用から、MDCT に使用できる窓関数の形には通常の窓関数への要請、

W_1(i)W_2(i)+ W_1(i+N)W_2(i+N)= 1

だけでは不十分である。例えば、分析窓が矩形窓、合成窓がsin^2(π(i+.5)/2N)窓のとき、また逆に、分析窓が sin^2(π(i+.5)/2N) 窓で、合成窓が 矩形窓のとき、これらは、MDCTでは正しい窓ではない。量子化と符号化を行わず、MDCT後の N点の変換係数が完全再現されるとき、 波形が完全再現ができるかを問題にする。 実際 MDCTでは sin(π(i+.5)/2N) 窓がよく使われる。この窓が波形の完全再現能力をもつことを確認する。また、サイン窓以外に分析窓と合成窓がど のような条件を満たせば、波形での完全再現ができるかを調べる。 W_1を掛けた入力の奇関数成分、偶関数成分が MDCT で再現されるから、i=0〜N/2-1 において、 次の式が満たされる必要がある。

W_2(i){ W_1(i)-W_1(N-1-i) } + W_2(i+N){ W_1(i+N)+W_1(2N-1-i) } = 1

これに、

W_1(i) W_2(i)+ W_1(i+N) W_2(i+N)= 1

を代入して、

W_2(i) W_1(N-1-i) = W_2(i+N) W_1(2N-1-i)

これが MDCT の窓関数への要求である。W_1(i) = W_2(i) = sin(π(i+.5)/2N) のとき、この要求は、W_1(N-1-i)= W_2(i+N)= cos(π(i+.5)/2N), W_1(2N-1-i)= sin(π(i+.5)/2N)であることから、成立する。