\begin{equation*} \newcommand\ve[1]{\boldsymbol{#1}} \newcommand\sgn{\mathrm{sgn}} \end{equation*}

Sign-Signアルゴリズムを導入する。良くなるのは以前からよくわかっているが、さてなんでというところに考えが至っていない。ここで見るだけ見ておきたい。

「再考・適応アルゴリズム」を再びにらみながら考え中。考えてたら、Sign-Signアルゴリズムの評価関数が見えて、それを対数尤度と思ってFisher情報行列を計算したら、入力の符号の自己相関行列が出てきた。

Sign-Signアルゴリズムの評価関数 \(J(\ve{h})\) は、符号成分を入力したシステムの残差 \(\hat{e} = \ve{h}^{\ast\mathsf{T}} \sgn(\ve{x}) - \ve{h}^{\mathsf{T}} \sgn(\ve{x})\) を使って

\begin{equation*} J(\ve{h}) = \sgn(e) \hat{e} \end{equation*}

と書くことができる(SAでは \(\hat{e}\)\(|e|\) に入れ替える)。理由は、\(e\) の符号に応じて場合分けすればよい。 \(e > 0\) のときは

\begin{align*} J(\ve{h}) = \hat{e} = (\ve{h}^{\ast} - \ve{h})^{\mathsf{T}} \sgn(\ve{x}) \\ \Rightarrow \frac{\partial}{\partial \ve{h}} J(\ve{h}) = - \sgn(\ve{x}) \end{align*}

で、\(e < 0\) のときは

\begin{align*} J(\ve{h}) = -\hat{e} = -(\ve{h}^{\ast} - \ve{h})^{\mathsf{T}} \sgn(\ve{x}) \\ \Rightarrow \frac{\partial}{\partial \ve{h}} J(\ve{h}) = \sgn(\ve{x}) \end{align*}

となって、まとめると

\begin{equation*} \frac{\partial}{\partial \ve{h}} J(\ve{h}) = - \sgn(e) \sgn(\ve{x}) \end{equation*}

となってSign-Signアルゴリズムが得られた。これを対数尤度の偏微分(スコア関数)と思って Fisher情報行列 \(\ve{F}\) を計算すると、

\begin{align*} \ve{F} &= E\left[ J(\ve{h}) J(\ve{h})^{\mathsf{T}} \right] \\ &= E\left[ \sgn(e) \sgn(\ve{x}) \sgn(e) \sgn(\ve{x})^{\mathsf{T}} \right] \\ &= E\left[ \sgn(\ve{x}) \sgn(\ve{x})^{\mathsf{T}} \right] \ (a.e.) \end{align*}

となる。Fisher情報行列の各要素 \((\ve{F})_{ij}\) に着目すると

\begin{align*} (\ve{F})_{ij} &= E\left[ \sgn(x_{i}) \sgn(x_{j}) \right] \\ &= \frac{2}{\pi} \sin^{-1}\left(\frac{\rho_{ij}}{\sigma_{i} \sigma_{j}} \right)\ E[x_{i}x_{j}] = \rho_{ij}, E[x_{i}^{2}] = \sigma_{i}^{2} \end{align*}

となっている。最後の結果は自明ではない。「 Sign-sign LMS convergence with independent stochastic inputs 」に証明がある。簡単に観察すると、

  • 対角要素は必ず全て1。よって固有値は0からNを取る。次数を増やすと条件数が悪くなりそうなのはすぐわかる。
  • arcsinを使っているので相関が高くとも1に近づきにくい。高相関な信号でもSAより性能劣化しにくいっぽい。

ところまで見えた。見えないのは次の2点。

  • 逆行列が計算できれば高速化に至れるがまだ分からない。
  • 対数尤度から分布を逆算できるが、これは一体何の分布だろうか。

ちょっと置いて実装に戻ろう。ひとまずSign-Signを導入。

  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 各帯域でSS(4): 56.1%
    • SAと比べて0.8%の改善。これは大きい。採用。

残差を見ていると、高域のプチノイズがかなり気になる。ほぼインパルスで誤差が出ており、しかもブロック周期でもない。と思ったらブロック周期だった。端点処理の問題。直す。

デバッグしていたら、低域の先頭要素と高域の末尾への書き込みが抜けていることが分かった。先頭要素は状態を持たせればよいけど、末尾は未来の値を知らないといけないので難しい。 状態を持たせるのは好きではないので、0次ホールドか2サンプルの線形補間で良い方を選びたい。 と思ったけど端点処理以外に難しいな。完全再構成するために計算依存関係を見なければならない。今日はこれでつぶれそう。0次ホールド補間で再構成できるようにした。

CDF42での不連続点が改善(注: 0次ホールド補間なので消えてない)して若干の圧縮率改善が見られた。しかし最終予測結果は大量のインパルス形誤差が…。

折を見てLPC分析前に窓かけしてるんだけどよくならない。

フィルタカスケード接続を試す。案の定良くなるが、これは最適な構造を見つけるのが大変に思える。

  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4)+SS(4), 高域でSS(4): 56.0%
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(4)+SS(4): 55.7%
    • 高域の方が伸びしろがある。
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(4)+SS(2): 55.7%
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(2)+SS(2): 55.9%
    • SS(4)を1回やるよりSS(2)を連結した方が性能が高い
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(2)+SS(2)+SS(2): 55.8%
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(2)+SS(2)+SS(2)+SS(2): 55.8%
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(4)+SS(2)+SS(2): 55.7%
  • MS変換 + 最適プリエンファシス x2 + PARCOR(4) + CDF42を1段 + 低域でSS(4), 高域でSS(4)+SS(2)+SS(2)+SS(2): 55.7%

カスケード構造は最後に回した方が良さそう。もっとほかの改善策を探るべき。

残差wavをflac(-8)やwavpack(-hh)で圧縮してみると、今のベストより小さくなる。 この現象前も見て落胆したけど今なら分かる。これ、2パスエンコードが有効であることを示唆してる。 やるのであれば、例えば250ms拾ってきて1回目をLPCなりでやって、その残差に対し2回目を4096サンプルなどの短い区間でLPCなどを実行する。 これがTAKの秘訣ではないか?TAKの250msの異様に長いフレームと短い"サブフレーム"(公式に最大5つのサブブロックに分割されるとある)はそれを指しているのでは?