汎用VSELP encoder/decoder プログラム

by 池田幹男

はじめに

ここに書かれていることは本プログラムの古い版のもので、 一部は既に内容が古くなってしまっているが、 概要については現在もかわっていないので、ここに記載しておく。 また、シンボルは全てプログラム中の関数または、RCR-STD27 に記載されてい るものを用いているので、詳細については RCR-STD27 を参照して欲しい。 一部のプログラムについては米国方式の IS54 を参照して欲しい。

このVSELPプログラムは研究用に作られていて 仕様ファイルを用意すれば多くの場合に対処できるようになっている。 現在仕様ファイルは日本標準化仕様(RCR-STD27)のみをサポートしている。 米国標準方式(IS54)の仕様ファイルを作成することも容易であると考えられる。 (誤り訂正符号化復号化を除いたものを以前は用意していた。)


プログラムの概要

プログラム

decode_vselp VSELPのdecoder
encode_vselp VSELPのencoder
hpf_vselp IS54規格の音声帯域用プレフィルタリングをするプログラム
NIPPONconf 日本方式VSELPの仕様ファイルを作成するプログラム

関数(主にVSELP専用であるが、なるべく汎用に使用できるように したもの)

関数名 機能
addwvec ベクトルの重み付け和を求める
alfinterp 通常の線形予測係数の補間
autocovvec 自己共分散行列の計算
code_to_weight コードから各々のベクトルに対する重み(-1 or 1)に変換する
codesearch VSELP用高速コード探索
covvec1 ベクトルとマトリクスの共分散(相互相関)を求める
findmsb ONになっている最高位bitの位置を求める
flat FLATアルゴリズムを用いて反射係数を求める
gainerror γから誤差のパワを求める
gainsearch 最適なgain-codebookの探索
getgain gain-codeから各励振ベクトルの実際のgainを求める
getpower 励振信号のパワを求める
getxi ピッチプレフィルタのξを求める
isigcov ``音声''の自己共分散行列を求める
lagsearch 長期予測フィルタのlagを求める
mkr0table フレームパワ(R0)の量子化テーブルを作る
orth_gram ベクトルの直交化
pitch_prefilter ピッチプレフィルタ
postfilter ポストフィルタ (若干手抜きがあるが、音質にはあまり影響はない)
r0encode フレームパワ(R0)の量子化、符号化を行なう
refdecode 反射係数を復号化する
soft_alfinterp 線形予測係数の軟補間
syn_code_excite 励振コードから励振ベクトルを求める
syn_longterm 長期予測による励振ベクトルを求める
update_state 内部状態の更新
weighted_response 聴覚重み付け応答を求める
zero_input ゼロ入力応答を求める
zero_state ゼロ状態応答を求める
genlinks_viterbi 畳み込み符号化・復号化用状態遷移表の作成
interleave インターリーブ 及び デインターリーブ
conv_interl 畳み込み符号化及びインターリーブ
hard_viterbi 硬判定 Viterbi 最尤法による 畳み込み復号化及びデインターリーブ
soft_interleave 軟判定用デインターリーブ (本プログラムでは使用せず)
soft_viterbi 軟判定 Viterbi 最尤法による畳み込み復号化及び デインターリーブ (本プログラムでは使用せず)

関数(汎用)

alfbet 全極フィルタのインパルス応答を求める
alfiir 全極フィルタの応答を求める
alfref 全極フィルタの係数を反射係数に変換する
getfirst 最初のフレームのデータを得る
lagwdw SST用のlag窓を作成する(正規化周波数版)
lagwin SST用のlag窓を作成する(lag数版)
rdframe フレームデータを得る
refalf 反射係数から全極フィルタの係数に変換する
refcor 反射係数から自己相関係数に変換する(全極フィルタの係数も同時に決まる)
multrrr 窓掛け

符号化プログラムの流れ

復号化プログラムの流れ

ラグサーチの高速化

ラグサーチのときにLPCフィルタのインパルス応答を打ち切ったものが 必要であるが、打ち切り長を短くすることができれば、 ために、高速化が図られる。 そこで、インパルス応答の打ち切り数を変えてセグメンタルSNR(以後SNRsegと略す)を測定してみた。

インパルス応答の打ち切り数を変えたときのSNRseg

図にインパルス応答の打ち切り数を変えた場合のSNRsegを示す。

この結果より、 インパルス応答の打ち切り数は6程度で十分であると考えられる。 この結果はLPCフィルタのインパルス応答は次数程度あればよい といわれていることとも一致する。 VSELPの場合はさらに聴覚重み付けを行なっているので、 極点が単位円の内側に移動し、 等価なインパルス応答の長さは短くなっているために、 インパルス応答の打ち切り数は6程度でも十分な結果が 得られたものと考えられる。

仮にインパルス応答の打ち切り数をLPC分析次数の10としたとすると、 ラグサーチにかかる時間は22.5% 短縮することができる。 ラグサーチの全体にかかる時間は全体の約30% を占めているで、 全体では約6.5% 程度の短縮化を図ることができると考えられる。


実行速度

以下に本プログラムの Sun SparcStation 1+ (SunOS 4.1.1) での実行時間を示す。ただし、 このとき計測した値は本プログラムの古い版であり、誤り訂正符号化復号化を 含んでいない。全てのサブルーチンは -O でコンパイルし、メインルー チンのみを -pg オプション付でコンパイルし、gprof を用いて各関数での実行時間を計測した。

現時点では、このプログラムは Pentium 120MHz, Linux (1.3.49), gcc-2.6.3 の条件下で、実時間よりも高速に符号化・復号化が可能である。

米国方式VSELP符号化の実行時間の内訳
実行時間(%) 実行時間(秒) 関数名
28.7 14.46 lagsearch
16.7 8.40 zero_state
8.0 4.01 gainerror
6.5 3.26 codesearch
5.9 2.97 orth_gram
5.7 2.88 autocovvec
4.1 2.05 gainsearch
3.2 1.61 mcount(時間計測用)
3.0 1.51 addwvec
2.6 1.33 .mul(裸の乗算?)
2.4 1.23 weighted_response
2.4 1.19 syn_code_excite
1.7 0.88 flat
1.7 0.87 covvec1
1.2 0.60 zero_input
1.2 0.58 update_state
1.1 0.55 isigcov
0.8 0.41 alfref
0.8 0.38 alfbet
2.5 1.26 その他

日本方式VSELP符号化の実行時間の内訳
実行時間(%) 実行時間(秒) 関数名
3.4 14.41 lagsearch
2.9 5.57 codesearch
2.1 5.21 zero_state
5.5 2.39 autocovvec
3.6 1.54 mcount(時間計測用)
3.2 1.40 .mul(裸の乗算?)
3.2 1.40 weighted_response
2.9 1.24 soft_alfinterp
2.8 1.21 orth_gram
2.5 1.07 gainerror
2.3 1.00 addwvec
2.2 0.93 syn_code_excite
1.9 0.83 gainsearch
1.7 0.74 flat
1.5 0.64 zero_input
1.4 0.59 isigcov
1.2 0.52 covvec1
1.2 0.50 update_state
1.0 0.45 alfbet
3.5 1.51 その他

7.26秒の音声(chossf.fil)を符号化するために必要な 計算時間は米国方式で50.43秒(SPARC Station 1+) であったので、実時間の6.95倍の時間がかかる。 日本方式の場合は計算時間は43.15秒であり実時間の5.94倍である (SPARC Station 1+) これらの結果からlagサーチに最も時間がかかっていることがわかる。 またzero_state, weighted_response, zero_input等のフィルタリング、 autocovvec, covvec1の内積演算 にもかなりの時間がかかることもわかる。 従って、実時間処理のためのDSPを選定するときには、 を考慮する必要があると考えられる。 多くのDSPはフィルタリング、内積演算は高速で処理できるので、 複雑な制御が必要なラグサーチが高速で処理できることが重要である。 LPC分析の部分はisigcovとflatで全体の3.2% の計算量ですんでいる

復号化された音声の品質

表:VSELPの評価(ただし、括弧内はRCRでの計測方法に従ったもの)
原音声 米国方式 日本方式
SNRseg(dB) LPC-SD(dB) SNRseg(dB) LPC-SD(dB)
chossf.fil 12.74(12.31) 2.87 11.29(10.96) 3.16
fuf.fil 13.48(13.24) 2.86 12.17(11.95) 3.15
fum.fil 10.18(10.12) 2.64 8.86 (8.79) 2.96
muf.fil 14.20(14.06) 2.76 12.73(12.59) 3.19
smm.fil 12.91(12.62) 2.90 11.44(11.25) 3.23
平均 12.70(12.47) 2.80 11.30(11.11) 3.14

5名の話者のSNRseg及び LPCスペクトル歪(以下LPC-SDと略す)を上の表に示す。 μ-law PCMの場合、SNRsegは 40kbps(5bit/sample)で 約17dB, 32kbps(4bit/sample)で約11dB程度である。 SNRsegでみればVSELPの音声の品質は 4bit/sampleのμ-law PCM程度である。 しかし、LPC-SDはμ-law PCM の場合、 48kbps(6bit/sample)で約3.2dBであることから、 実際の聴覚的な品質は48kbpsのμ-law PCM 程度であると考えられる。 これまでの経験から、LPC-SDの差は0.2dB以下の場合は聴覚的には ほとんど検知できないので、日本方式と米国方式との品質の違いは わずかであると考えられる。


むすび

VSELPのビットレート(グロス)は米国方式で7.95kbps日本方式で6.7kbpsである。 VSELPはこのような低ビットレートでも 48kbps のμ-law PCMに匹敵する 高品質で音声を伝送することが可能な優れた音声符号化方式である。 VSELPには多くの高速化の手法が取り入れられ、 通常のCELPと比較すればかなりの高速化されている。