ここに書かれていることは本プログラムの古い版のもので、 一部は既に内容が古くなってしまっているが、 概要については現在もかわっていないので、ここに記載しておく。 また、シンボルは全てプログラム中の関数または、RCR-STD27 に記載されてい るものを用いているので、詳細については RCR-STD27 を参照して欲しい。 一部のプログラムについては米国方式の IS54 を参照して欲しい。
このVSELPプログラムは研究用に作られていて 仕様ファイルを用意すれば多くの場合に対処できるようになっている。 現在仕様ファイルは日本標準化仕様(RCR-STD27)のみをサポートしている。 米国標準方式(IS54)の仕様ファイルを作成することも容易であると考えられる。 (誤り訂正符号化復号化を除いたものを以前は用意していた。)
decode_vselp | VSELPのdecoder |
encode_vselp | VSELPのencoder |
hpf_vselp |
IS54規格の音声帯域用プレフィルタリングをするプログラム |
NIPPONconf |
日本方式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 | 窓掛け |

図にインパルス応答の打ち切り数を変えた場合の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 の条件下で、実時間よりも高速に符号化・復号化が可能である。
| 実行時間(%) | 実行時間(秒) | 関数名 |
|---|---|---|
| 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 | その他 |
| 実行時間(%) | 実行時間(秒) | 関数名 |
|---|---|---|
| 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 | その他 |
| 原音声 | 米国方式 | 日本方式 | ||
|---|---|---|---|---|
| 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と比較すればかなりの高速化されている。