ネットワーク単位で同一の正則化パラメータを使ったら圧縮率が向上した。しかし、単層LPCでやるときのような単調性は認められず。網羅探索が必要。それによってエンコード負荷がまた増えてしまう。

エンコードオプションで、固定1/512か、網羅探索か選べるようにするのが吉と見える。

また、今日は係数の分布に隔たりがあるように見えて、係数を圧縮しようとして係数の分布を見ていた。

結果は音源依存で、一部の音源ではほぼ幾何分布だったが、他ではほぼ一様で、符号無しで128以降で減少する分布が見られた(これはわかる。右シフトによって128以降は出づらくなっている)。エントロピーは6、低くて4とか出ていたが、平均が係数次数などでまちまちなので一般化が困難。次数ごとにHuffmanテーブル作るのは難しそう。また、一層目では明確に零平均ではない傾向が見られた。2層目以降は零平均っぽい分布を見せる。

書き捨てるのももったいないので一応スクリプトを残す。

import sys
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
    # 係数ファイルを読み込み
    # 列(次数)ごとに解析
    data = np.loadtxt(sys.argv[1])
    for col in range(data.shape[1]):
        uniq, counts = np.unique(data[:, col], return_counts=True)
        prob = counts / np.sum(counts)
        print(-np.sum(prob * np.log2(prob)), np.mean(data[:, col]), np.var(data[:, col]))
    # 全体で解析
    uniq, counts = np.unique(data.flatten(), return_counts=True)
    prob = counts / np.sum(counts)
    print(-np.sum(prob * np.log2(prob)), np.mean(data.flatten()), np.var(data.flatten()))
    plt.hist(data.flatten(), bins=256, density=True)
    # 幾何分布と重ねてみる
    mean = np.mean(data.flatten())
    p = 1.0 / mean
    x = np.arange(0, 256)
    plt.plot(x, p * (1 - p) ** x)
    plt.show()

右シフトで最悪127だけ損するの、もったいないよなあと振り返る。といっても正規化定数を入れるのはどうなんだろうとも思う。最悪どんくらいの誤差が出るのかまた気になっている。