1.1 線形予測 信号値 表 1.1 ー 2 信号値の例 3 4 5 -1 0 0 11 9 1 ー 2 6 1 7 1 8 2 うカ ) * 3 この様に予測できるのは、経験的に信号値の連続性を仮定しているいるからではないだ 直前の時刻の信号値がそのまま続くと予測してみる。 * 4 予測と同時に、予測に対しての誤 予測が圧縮に活かされる例を見ていく。表 1.1 の信号値に対して ? = 2 だったとして、 いる。 マルチメディアのデータ圧縮は、まさにこの信号値の連続性に着目して圧縮を達成して で、自然な音声においてはなめらかな、即ち連続な信号値でなくてはならない。一般に 時刻が隣り合った信号値が大きく異なるとプチノイズとなって耳障りに聞こえてしまうの 合った信号値は大きく変化することはあまり見られない。例えば音声データにおいては、 ろうか。実際、画像や音声ファイルの信号を観察すると、時間的、あるいは空間的に隣り 差 ( 残差 ) を計算しておく。残差は次の式 1.1 で定義される。 残差 = 信号値ー予測値 予測値と残差を追記した結果を表 1.2 に示す。 表 1.2 予測の例 ( 1 ・ 1 ) 時刻 0 信号値ー 2 2 3 4 5 6 7 8 9 ー 1 0 0 1 1 2 2 ■・・動 0000 ■ 1 0 1 0 1 0 1 0 表 1.2 において、残差は 0 , 1 だけで構成されていることが分かる。これはデータ圧縮に とって都合が良い。なぜなら、圧縮すべき対象の種類が少なく、かっ、その値が 0 付近に 偏って出現しているからである。この性質によって残差は元の信号値よりも小さく圧縮す ることができる。 圧縮された残差を戻すときには、それまでに復元した信号値から圧縮時と全く同様の予 測を行い、残差に予測値を加えれば良い ( 式 1.2 ) 。 信号値 = 残差十予測値 ( 1 ・ 2 ) ' 3 真面目な人であればれ次の多項式を使って最小二乗法でフィッティングすると吹っ飛んだ値になるだと か、ロジスティック回帰だ、 SVR だ、ガウス過程回帰だと言い始めるかもしれない。 * 4 この予測方式を特に前値予測と呼ぶことがある。
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)
2.5 ala_coder . c 77 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 } / * 商部分を取得 * / quot BitStream—GetBit (strm, &bit) ; while (bit quot 十十 ; BitStream—GetBit (strm, &bit) ; } else { rest / * 1 の剰余は 0 */ if (rice—parameter / * 剰余部分を取得 * / return (rice—parameter * quot + rest) ; rest (uint32—t) bitsbuf ; BitStream—GetBits (strm, ALAUti1ity—Log2Cei1(rice—parameter) , uint64_t bitsbuf ; / * ライス符号の剰余部分取得 * / &bitsbuf 符号化処理 ( リスト 2.19 ) の逆の操作を行っているだけである。まず商 quot を住符号 の定義 ( 1 が出現するまでの bit 数 ) に従って取得し、次に Rice 符号のパラメータを元に 剰余 rest を取得する。 2.5.2 残差の符号化と復号 残差の符号化と復号処理は、 Rice 符号のパラメータを入力データに適応しながら変更 し、残差を出力、あるいは取得する処理に要約される。 Rice 符号のパラメータの更新処理 は式 1.54 で見たように平均値の更新処理に帰着される。平均値は有限のサンプル数では 厳密に計算できないので、替わりに推定平均値の計算を行う。符号化と復号処理で全く同 じ様に推定平均値を更新することで、パラメータを適応的に変更しながらでも、可逆な符 号化が実現できる。 残差の符号化 残差の符号化処理をリスト 2.22 に示す。 110 111 112 113 リスト 2.22 残差の符号化処理 (ala-coder ・ c) / * 符号付き整数配列の符号化 * / ALACoderApiResu1t ALACoder-PutDataArray ( struct ALACoder* coder, struct BitStream* strm, const 土Ⅱ t32 ー t * * data, uint32_t num—channels , uint32_t num—samples)
2.2 ALA ファイルフォーマット ファイル先頭 に並ぶ 時系列順 ファイル末尾 51 ヘッダ - ALA のフォーマット情報 - wav のフォーマット情報 プロック - PARCOR 係数 - 工ンコード済み残差信号 プロック - PARCOR 係数 - 工ンコード済み残差信号 プロック ( 残りサンプル分 ) - PARCOR 係数 - 工ンコード済み残差信号 図 2.1 ALA ファイルの構成概要 表 2.1 ALA のヘッダフォーマット bit 幅 32 16 8 32 32 8 16 8 2.2.2 内容 フォーマットノヾーション チャンネル数 サンプル数 サンプリングレート プロックフォーマット PARCOR 係数次数 プロックあたりサンプル数 サンプルあたり bit 数 補足 ALA ファイルであることを示すシグネチャ バイナリフォーマットのバージョン 1 チャンネルあたりのサンプル数を示す ファイル末尾ではこの数値より小さくなるので注意 全プロックで同一の次数を用いる 表 2.2 に、 ALA ファイルのプロックフォーマットを示す。 プロック先頭の同期コードは、デコード時に現在読み出している位置が正しいかどうか を判定する目的で使用する。しかし、この同期コードはおまじない程度にしか効果がな い。 PARCOR 係数や、エンコード済みの残差の bit 列の中に 0xFFFF が表れた場合、そ の場所をプロック先頭と誤判定する可能性がある。より厳格な対策として、プロックデー
9 第 1 章 基本理論編 ロスレス音声コーデックによって . wav 等の音声テー 大まかに言うと図 1.1 に示す処理が動いている。 入力 wav 予測 (PCM データ ) 残差信号 タファイルをエンコードするとき、 工ントロピー 符号化 出力バイナリ 図 1.1 ロスレス音声コーデックのエンコード処理概要 工ンコードの処理の内容について、簡単に説明すると次のようになる。 ロスレス音声コーデックのエンコード手順 1. 入力の wav を取得する。 ( 工ンコード ) する。 コードは図 1.2 に示すように、エンコードの逆の手順を辿ることで元の wav に復元する。 るように符号化を行う符号化手法である。次にデコードの処理手順について説明する。デ , こで、エントロピー符号とは、入力データの確率に基づいて、出力ビット列が短くな 。 pulse code ModuIationo 信号の時間と振幅を量子化 ( 離散化 ) して記録する方式を指す。 4. 出力バイナリデータが得られる。 3. 工ントロピー符号 (entropy coding) によって残差信号をビット列に符号化 の差を取って残差 (residual) を計算する。 2. 入力の音声データバターンを解析して、音声波形の予測を行い、元波形と予測 wav ファイルにおいて、音声信号テータは PCN で符号化されている。
2.4 bit_stream . c いただきたい。 表 2.4 ファイル名 4 ー 02 井戸の茶椀 . wav 1 ー 01 火焔太鼓 . wav 02 My Song. wav 09 瑠璃子 . wav 30 ー自分だけの繩き . wav 29 一重ねる努力 .wav 残差計算前後のエントロピー計算結果 に区切って計測を行ったため、残差計算前のエントロピー値が表 1.5 と異なることに注意 69 4 ー 02 Let's アイカッ ! ( Short サイズ ) . wav 5 ー 02 カレンダーガール (TV-size) . wav 元の信号 [byte] 15.16 15.10 14.59 13.73 13.66 13.04 11.91 11.04 残差 [byte] 5.44 7.88 7.86 6.01 8.27 9.42 12.88 12.82 全てのファイルにおいて、残差計算によってエントロピーが減少することを確認し た。ただし工ントロピーの減少度合いは音源依存で、 4 ー 02 井戸の茶椀 . wav に見られ るようにエントロピーが半分以下になるファイルがある一方、 5 ー 02 カレンダーガール (TV-size) . wav のように、エントロピーが 1 割程度しか減少しないファイルが存在した。 2 4 bit_stream . c bit-stream. c には、 bit 単位でファイル入出力を行う関数群が集められている。この モジュールは bit 単位の入出力機能に限らず、 CPU の差異により発生するバイトオー ダー ( 工ンディアン ) を揃える目的も兼ねている。実装は [ 7 ] の bitio. c を参考に、僅か lbit だけ出力を行う処理をリスト 2.13 に示す。 lbit 出力処理 2.4.1 bit 単位の出力処理 な機能拡張を行っている。 177 178 179 180 181 182 リスト 2.13 lbit 出力処理 (bit_stream. c) / * れ出力 * / BitStreamApiResu1t BitStream—PutBit(struct BitStream* stream, bit) / * 引数チェック */ if (stream = = NULL) { return BITSTREAM_APIRESULT_INVALID_ARGUMENT ; uint8_t
7 Rice 符号化されたデータの復号処理 2.5.2 残差の符号化と復号 残差の符号化 . 残差の復号 . wav . C . 2.6.1 構造体定義 . 2.6.2 公開 API . wav ファイルの読み込み . wav ファイルの書き込み 2.6.3 使用例 . C 2.7.1 ALA のエンコード処理 入力 wav データの取得 工ンコードするサンプル数の決定 窓掛け PARCOR 係数の量子化 . PARCOR 係数のエンコード プロック末尾のバイト境界揃え 2.7.2 ALA のデコード処理 シグネチャとフォーマットバージョンのチェック . デコードするサンプル数の決定 2.7.3 引数処理 FLAC との比較 2.8.1 所感 性能向上の指針 . 2.9.1 他のロスレス音声コーデックの概略 . FLAC(Free Loss1ess Audio Codec) Wavpack TTA (The True Audio) MPEG—4 ALS (The MPEG—4 Audio LossIess Coding) Monkey ' s AudiO TAK (Tom' s verlustfreier Audiokompressor) 2.9.2 予測手法 . Burg 法 1 乗算型 PARCOR 格子型フィルター 適応フィルター ー 1 ワ 1 つひ一 4 -4 4 -4 一り一り冖ー一 8 ) 0 1 -1 っっっ 0 つひ 4 -4 -4 -4 り一り一り一り -8 一 -8 一 2.6 2.7 2.8 2.9
. 欠 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
10 工ントロピー 復号 入力バイナリ 残差信号 予測 第 1 章基本理論編 (PCM データ ) 出力 wav 図 1.2 ロスレス音声コーデックのデコード処理概要 ロスレス音声コーデックのデコード手順 1. 入力のバイナリデータを読み込む。 2. バイナリデータから残差を復号 ( デコード ) する。 が異なるため、ロスレス音声コーデックでは浮動小数演算が使われることは基本的にはない。 * 2 浮動小数点演算はアーキテクチャごと ( 例 : lntel 系プロセッサと ARM 系プロセッサ ) に得られる結果 mp3, 。 gg 等のロッシーなコーデックは、デコード結果の波形は元の入力素材と一致しない。 * 1 ずつ上昇している所を観察すると、直感的には ? = 2 であると予測できるのではないだろ 状況で、貴方なら時刻 9 に対応する信号値をどう予測するだろうか ? 信号値が 2 時刻で 1 表 1.1 において、時刻 9 に対応する信号値は未知“ ? ”であり予測する必要がある。この 例として、表 1.1 に示すような、時刻に対応した信号値の列が観測されたとしよう。 立つのかを見ていく。 , こでは確率論に立ち入らず、予測についての概要と、それが如何にしてデータ圧縮に役 未来の状態を推定することを言う。推定を行うための理論には必ず確率論が潜んでいる。 工学的な立場から予測というと、予測を行うまでに観測したデータから現在、あるいは 1.1 ユ予測とデータ圧縮 1 ユ線形予測 れぞれ紹介していく。 本章では、ロスレス音声コーデックの基礎を支える予測とエントロピー符号の技術をそ いる。 が一意に復号可能となる ( 曖昧さを残さずに元に戻すことができる ) 条件はよく知られて 算の性質を使うことで達成できる * 2 。また、エントロピー符号についても、構成した符号 なければならないことに注意する。予測した結果を元に戻すには、大雑把に言うと整数演 コードの処理において、予測とエントロピー符号の処理はそれぞれ元に戻るように構成し 異もなく ) 復元される * 1 。ビットパーフェクトの要請を満たすためには、エンコードとデ ロスレス音声コーデックの場合は、入力した wav がビットパーフェクトに ( lbit も差 4. 元の wav ファイルが得られる。 3. 残差とそれまでに復元した入力信号から予測を行って入力信号を復元する。
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 ] を参考にしながら固定小数演算