62 return ALAPRED 工 CTOR_AP 工 RESULT_OK ; 変換処理部分の実装をリスト 2.10 に示す。 528 529 } 第 2 章 実装編 522 523 524 525 リスト 2.10 LR 復元処理部分 (ala-predictor. c) side = data[l] [smpl] ; mid = (dataC0] [smpl] くく 1 ) ー (side & 1 ) ; (int32-t) ALAUT 工 L 工 TY-SH 工 FT—RIGHT—AR 工 THMET 工 C (mid ー side data[l] [smpl] (int32—t) ALAUTIL 工 TY—SH 工 FT—RIGHT—AR 工 THMET 工 C (mid + side data [ 0 ] Csmp1] まず S チャンネル成分の下位 lbit の情報を使って MS 成分を復元してから、後は式 2.5 , 2.6 によって LR チャンネル成分を復元している。 2.3.5 プリエンファシス / デ工ンファシス 線形予測の前処理として、プリエンファシスという処理が行われる事が多い [ 1 , 11 ] 。プ リエンファシスは、音声の高周波数成分を強調する処理であり、しばしばタップ数 1 の FIR フィルターで実現される。具体的に処理を式に起こしてみると、時刻〃における出 カリ ( れ ) は、現在の入力ェ ( れ ) と直前時刻の入力ェ ( れ一 1 ) を用いて式 2.7 で定義される。 ( 2.7 ) はプリエンファシスとは逆に低周波数成分を強調する処理であり、次の式 2.12 で定義さ プリエンファシス処理を施したデータを元に戻す処理にデ工ンファシスがある。これ ため、直流成分を完全に打ち消す効果を持つ。 ″ 1 の範囲に設定される。もし″ = 1 ならば式 2.7 は入力データの差分計算に該当する こでは FIR フィルターの係数であり、プリエンファシス処理においては 0.9 れる。 ( 2 ・ 8 ) プリエンファシスフィルター処理の実装をリスト 2.11 に示す。 プリエンファシスフィルター処理 予測で得られる係数が安定 ( 発散しにくい状態 ) になりやすいとの結果を示している。 いう説明が多くなされる。 [ 11 ] では実験的に、プリエンファシスを使用した場合は、線形 数成分が相対的に持ち上がり、スペクトラムが平坦になるのが良い分析結果をもたらすと なされていない。一般に、プリエンファシス処理によって、収録時に失われがちな高周波 何故プリエンファシス処理が上手くいくのか、筆者が調べた限り、その定性的な説明は
52 bit 幅 16 不定 第 2 章 実装編 内容 0xFFFF PARCOR 係数 表 2.2 ALA のプロックフォーマット 補足 プロック先頭を示す同期コード 1 チャンネル目残差、 2 チャンネル目残差、 の順序で記録 1 チャンネル目係数列、 2 チャンネル目係数列、 ェ = 16 x PARCOR 係数次数 x 波形チャンネル数 の順序で記録 工ンコード済みの残差 タのチェックサム値や巡回冗長検査 (CRC16 、 CRC32 等 ) の計算結果をプロックに記録 しておき、デコード時に検査する対策がとられる [ 28 , 32 , 16 , 33 ] 。 ALA では実装の簡略 化のため、シグネチャと同期コード以外にデータの正しさをチェックする機能を省いて いる。 2.3 ala—predictor. c ala-predictor. c には、予測と合成処理を行う関数群が集められている。 ・ PARCOR 係数計算 ・ PARCOR 予測 / 合成フィルター プリエンファシス / デ工ンファシス ・チャンネル間相関除去 ()S 処理 ) 本節では、これらの計算処理について説明する。計算処理は全て固定小数演算により実 現されているため、コードの説明の前置きとして固定小数演算についての補足説明を入れ る。また、プリエンファシス / デ工ンファシスと、チャンネル間相関除去については基本 理論で触れていない為、本節で簡易に補足を入れる。なお、 PARCOR 係数計算について は、リスト 1.1 ( 1.1.3 節 ) で既に取り上げているため説明を省略する。 2.3.1 固定小数演算 固定小数 (fixed-point float) とは、小数点が固定された bit 位置にある小数の表現法 である。一方、 C 言語で float, double 等の型を持っ浮動小数点数は、指数部の値によ り小数点が移動する。固定小数点は整数によって表すことができ、また、固定小数同士の 演算も整数演算によって実行できる。 , こでは、 [ 24 , 25 ] を参考にしながら固定小数演算
86 第 2 章 実装編 ALA のエンコード処理手順 (main. c の do-encode 関数 ) 1. 入力の wav ファイルデータを取得する。 2. ヘッダ情報を書き出す。 に達するまで繰り返す。 3. プロックのエンコード処理を行う。以下の処理を wav ファイルデータの末尾 (f) 残差をエンコードする。 (e) 同期コードと PARCOR 係数をエンコードする。 出する。 (d) 整数データに PARCOR 格子型フィルターによる予測を行い、残差を算 (c) 整数データにプリエンファシスを適用する。 COR 係数を計算する。 double 形式のデータにプリエンファシスと窓掛けを行ってから、 PAR- (a) wav のチャンネル数がステレオ ( 2 ) 以上であれば、 S 処理を行う。 (b) ている ( リスト 2.38 ) 。 入力 wav データは整数型で取得すると同時に、解析用に高精度な double 型に変換し 入力 wav データの取得 大まかな処理内容は上記内容で十分と思われるため、細かい補足について触れていく。 既に 2.6.1 節で注意したが、 WAVFi1e 構造体に含まれる波形データは 32bit 整数型で記 ー 31 ) ; input-int32 [ch] [smpl] > > = ( 32 ー in-wav->format. bits-per_sample) ; / * 情報が失われない程度に右シフト * / input-int32 [ch] [smpl] = WAVFiIe-PCM (in-wav , smpl , (h) ; input [ch] Csmp1] = WAVFi1e—PCM (in—wav , smpl , (h) * pow ( 2 , 0 ; smpl く num—samples ; smpl + + ) { 土 0 て (smpl fO て ()h = 0 ; ch く num_channels; c れ + + ) { / * 入力データ取得 * / リスト 2.38 wav データ取得 (main. c 108 107 106 105 104 103 102 101 100 から離れるに従って精度が落ちる [ 38 ] 。 * 10 IEEE 754 の規格に従う浮動小数点数は、 0 近傍に多くの数値が含まれるため数値表現精度が高いが、 0 工ンコードするサンプル数は、リスト 2.39 に示す式で決定している。 工ンコードするサンプル数の決定 型データに 2 ー 31 を乗じた double 型のデータとして記録する。 きくなり過ぎてしまい、精度落ちの可能性がある * 10 。そのため、解析用のデータは、整数 録されている。このまま PARCOR 係数の解析を行うと ( 特に自己相関関数の ) 数値が大
104 索引 。符号 , 41 一意に復号可能な符号 , 28 後ろ向き誤差 , 18 MS 処理 , 59 工ンコード , 27 工ントロピー , 34 工ントロピー符号 , 9 工ントロピー符号化 , 27 符号 , 41 格子型フィルター , 20 固定小数 , 52 Golomb 符号 , 43 残差 , 9 自己相関 , 13 情報 , 27 情報源 , 27 情報量 , 31 線形予測 , 12 デコード , 28 PARCOR 係数 , 18 標本自己相関 , 18 復号 , 28 符号 , 27 符号化 , 27 プリエンファシス , 62 前向き誤差 , 18 マクミランの不等式 , 29 窓関数 , 87 無記憶情報源 , 37 Rice 符号 , 43 Levinson-Durbin 再帰法 , 14
. 欠 0 0 0 0 0 一 1 ワ ~ っ 4 っ一 4 - りラー -8 ) -8 0 ワ ~ ワ 1 り -4 4 -4 0 っ 1 っ 4 っ一り一り一り 4 4 -4 一り一り一り一り一り - り一りり 1 り一り一り一り一り一り一り一りっ 6 っ 6 っ 6 ー「ーー冖ー「ー冖ー「ー 目 6 第 2 章実装編 ALA コマンドラインツールの使用方法 . 2.1.1 ビルド方法 . 2.1.2 実行 工ンコード デコード 2.1 ALA ファイルフォーマット . 2.2.1 ファイルヘッダフォーマット 2.2.2 プロックフォーマット ala—predictor. c 2.3.1 固定小数演算 . 固定小数による小数の表記 . 固定小数演算 . 2.3.2 PARCOR 予測フィルター 乗算時の右シフト対策の定数 前向き誤差計算 後ろ向き誤差計算 2.3.3 PARCOR 合成フィルター 2.3.4 MS 処理 MS 処理の実装解説 2.3.5 プリエンファシス / デ工ンファシス プリエンファシスフィルター処理 デ工ンファシスフィルター処理 2.3.6 残差のエントロピー観察 . 元の信号と残差の分布 . 残差計算前後でのエントロピーの変化 . bit_stream . c 2.4.1 bit 単位の出力処理 . lbit 出力処理 複数 bit 出力処理 2.4.2 bit 単位の取得処理 . lbit 取得処理 複数 bit 取得処理 ala_coder . C . 2.5.1 Rice 符号 . Rice 符号化処理 2.2 2.3 2.4 2.5
2.3 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 ala—predictor. c リスト 2.11 プリエンファシスフィルター処理 ( ala ー p て edicto て . c ) / * プリエンファシス ( t32 , マ ce ) */ ALAPredictorApiResu1t ALAEmphasisFi1ter—PreEmphasisInt32 ( int32—t* data, uint32—t num—samples , int32—t coef—shift) uint32—t smpl ; int32-t prev—int32, tmp-int32; const int32—t coef—numer = (int32-t) ( ( 1 くく coef-shift) / * 引数チェック * / if (data = = NULL) { return ALAPRED 工 CTOR—AP 工 RESULT—INVAL 工 D-ARGUMENT ; / * フィルタ適用 * / prev—int32 0 ; smpl く num-samples ; smpl + + ) { for (smpl tmp—int32 = data Csmp1] ; (int32—t) ALAUTIL 工 TY-SHIFT—RIGHT—AR 工 T}NET 工 C (prev—int32 * data [smpl] coef—numer, coef—shift) ; prev—int32 tmp—int32 ; return ALAPRED 工 CTOR—APIRESULT—OK ; 63 入力データ data をその場で ( ⅲ - place で ) 書き換える関数である。フィルター計算は固 定小数乗算を使用しており、式 2.7 の″に該当する係数との乗算を、 ( 1 くく coef-shift) 1 との乗算処理と、 coef-shift の右シフト処理に分けて実現している。 ALA バージョ ン 1.0.0 では、 coef-shift は 5 に設定されているため、フィルター係数″の値は ″ = ( 25 ー 1 ) / 25 = 31 / 32 = 0.96875 に相当する。 デ工ンファシスフィルター処理 デ工ンファシスフィルター処理の実装をリスト 2.12 に示す。 408 409 410 411 412 413 414 415 416 417 418 419 リスト 2.12 デ工ンファシスフィルター処理 (ala_predictor. c) / * デ工ンファシス ( をれ t32 , をれマ乙 ace ) * / ALAPredictorApiResu1t ALAEmphasisFilter—DeEmphasisInt32 ( int32—t* data, uint32—t num—samples , int32—t coef—shift) uint32—t smpl ; const int32-t coef—numer = (int32-t) ( ( 1 くく coef-shift) / * 引数チェック */ if (data = = NULL) { return ALAPRED 工 CTOR_AP 工 RESULT_ 工 NVAL 工 D—ARGUMENT ;
64 420 421 422 423 424 425 第 2 章 / * フィルタ適用 */ for (smpl 1 ; smpl く num-samples ; smpl + + ) { 実装編 data [smpl] + = (int32—t) ALAUT 工 LITY—SHIFT—R 工 GHT—ARITHMET 工 C (data [smpl return ALAPRED 工 CTOR-APIRESULT_OK ; 1 ] * coef—numer, coef—shift) ; 426 } にフィルター係数を乗じ、現在のサンプル値に加算するだけで良い。 2.3.6 残差のエントロピー観察 デ工ンファシスフィルター処理は簡単である。式 2.8 で示したように、前のサンプル値 本節では MS 処理、プリエンファシス、 PARCOR 予測の 3 つの予測手法によって、 れほど音声データのエントロピーが変化するかを観察する。 元の信号と残差の分布 ど 信号の分布は、入力 wav の元の信号 ( 残差計算前 ) とその残差の計算結果に対して PCM 値の出現頻度を計測することで観察した。頻度の絶対値は音源により異なるため、出現頻 度の総和を取って出現頻度を割ることで経験確率を算出した。 表 1.5 で挙げた 8 個の wav ファイルに対して信号の分布を計測した結果を図 2.4-2.11 に示す。グラフにおいて、横軸 (PCM の値 ) の範囲は -2048 から 2048 に制限し、縦軸 ( 経験確率 ) は差を見やすくするために対数軸を用いている。 全体的に、残差計算後の分布の方が 0 における頻度ピーク値が大きく、また、分布の 0 から離れたところの頻度 ( 裾野 ) が鋭く減少している事が読み取れる。これは、図 1.48 で 見た幾何分布の概形に近く、よりエントロピー符号化に適した分布に変換できていること を意味する。 ファイル個別に気になる点を述べる。 1 ー 01 火焔太鼓 . wav の元の信号の分布は奇特で ある。 0 にピークはあるものの、次の緩やかなピークが一 100 周辺に存在する。これは、 収録時に発生している背景ノイズと、直流成分 ( オフセット ) の影響を受けているもの と考えられる。振幅値の振れ幅が大きい 4 ー 02 Let' s アイカッ ! ( s 巨 0 て t サイズ ) . wav と 5 ー 02 カレンダーガール (TV-size) . wav では、他の分布と異なり残差の減衰が緩やか ( 裾野が広い ) だが、減衰が早いためグラフの横軸をト 4000 , 4000 ] まで広げた時に残差の 頻度の方が小さくなっていることを確認した。 残差計算前後でのエントロピーの変化 残差計算前後でのエントロピーの計算結果を表 2.4 に示す。表 1.5 の計測を行った際は データを 1 バイト (8bit ) に区切って計測していたが、 こでは PCM の bit 幅 (16bit)