あぷりばーどの担当分 < Wavelet-based spatial audio framework
Wavelet-based spatial audio framework
全体の流れ
Chapter 5 INTRODUCTION TO WAVELET THEORY
5.1 Introduction to Wavelet Transforms
5.2 Multiresolution Analysis
5.3 Subdivision Mesh
5.4 Second Generation Wavelets via the Lifting Scheme
5.4.1 Lifting Scheme
5.4.2 Fast Lifted Wavelet Transform
5.4.3 Dual Lifting Scheme
5.4.4 The Lazy Wavelet
5.4.5 Interpolating Wavelet Transform via the Lifting Scheme
5.5 Spherical Wavelets via the Lifting Scheme
Chapter 6 WAVELET-BASED SPHERICAL AUDIO FRAMEWORK
Chapter 7 BUILDING SPHERICAL WAVELETS VIA NUMERICAL OPTIMIZATION
そもそも何を解こうとしていた?
VRサウンドデザイナ「あの方向から音が聞こえるようにスピーカーから再生したいなァ.......」
https://gyazo.com/3f16a8858efef08142ea966d229a4f0b
でも、現実のスピーカーはすでに個数も位置も固定されていて、デザイナの思う場所にあるとは限らない。
どうすれば、
(1) サウンドデザイナの考える音場を、現実のスピーカー配置で再現できるか?
(2) サウンドデザイナの考える音場を、データとして表現・保存すればいいか?
データとして音場を保存できてれば、少しスピーカーの配置が変わっても同じ音場を再現できるはず。
あってほしい性質
1. 均質 / homogeneous なシステム:どの方向でも良く音場が再現される
https://gyazo.com/b2510420e646ed2cd4fc249f091d39eb
均質さを測っている図
2. Coherentなシステム:聴者の位置変化に頑健である
https://gyazo.com/d2bddcf71678928a2a339c1560fed564
コヒーレントの図
問題の整理と課題
[本来あって欲しい音場情報] --(encoding)--> [音場のデータ] --(decoing)--> [現実のスピーカーのゲイン(音量)]
この音場のデータの表現方法として、今Ambisonicsが流行っている。
フーリエ級数:様々な周波数の基底関数$ \sin, \cosを重み付けた和(線形結合)によって、様々な信号を表現する枠組み。
球面調和関数の級数:基底関数を球面$ S^2上の関数に置き換えて、それらの重みづけ和によって様々な信号を表現。
https://gyazo.com/d87afc2d584872c4b25ae6058bbcf911
第6回後半から引用
重みづけ和(線形結合)の係数列の最初の4つとか9つとかだけを取れば、おおまかな低周波の成分の表現だけを抜き出せる。
音場の圧縮した表現として有効。
Ambisonicsの問題点
けど、もうちょっといい圧縮がつくれるんじゃねえの?
1. 不規則なレイアウト; irregular layoutが苦手 (Ch. 2)
Ambisonicsはスピーカーが完全な球体上に規則的(regular)に並んでることが前提。現実じゃ再現不可能じゃね?
著者ScainiはAmbisonicsの枠組みの中で改良を試みたが(IDOHA) でも微妙!
https://gyazo.com/6eabe1a5dead868d68d209f048dd7606
I_Rの理論的限界;第四回前半さんから引用
2. フーリエ級数の非局所性 (Ch 5.1)
指向性の高い音場を低次Ambisonicsでは精度良く表現できない。
低次Ambisonicsでは、球面全体に広がる基底関数の係数をいじることでうまく再現しないといけない。
エベレストのような「局所的な山」を一つ作るだけでも地球全体の波のバランスを計算する必要がある
一点だけから飛んでくる音を表したいときどうすんのコレ あかんやん
3. 局所性を解決しうるはずの窓付きフーリエ級数の時間・周波数解像度の問題 (Ch 5.1)
局所性を守った方法としては窓付きフーリエ級数がある。
「窓」を基底関数にかけて、局所的な範囲にしか響かないようにできる。
https://gyazo.com/5b688b95e69725a6e88ea2f40e5145fc
ガウス窓の例; from
ハイゼンベルグの原理:時間窓の狭さ$ \Delta tと周波数窓$ \Delta fの狭さをどちらも無限に狭めることはできない。
時間窓を狭めれば周波数値がどの時間のものなのかを精度良く見れるが、
その分周波数値の音高をきめ細かく見れなくなってしまう。
今回の「時間」は「空間(球面)」のことを述べているappbird.icon
窓付きフーリエ級数は$ \Delta tが使う窓によって固定されてしまうのが悩み。
低い周波数の時は時間窓を広げ、高い周波数の時は狭めるように動的に変化させられないか?
Wavelet-based Spatial Audio Framework
じゃあWaveletの枠組みを使えばええんちゃうの?
なんと、「空間周波数に合わせて空間解像度を変形できるすごい窓」がそこにはある!
基底となる関数のシフト量 / スケール(~ 周波数)を変えられる。
Waveletの定義;第6回前半から引用
https://gyazo.com/a8f7973d7fb8e2fbc8bf8ea0ad364992
Waveletの定義;第6回前半から引用
https://gyazo.com/75f0ffd0ba9f3b0daad6354001eceaff
これを球面上に展開できればよさそう。
ただ、既存のWaveletの理論は直線$ \R上の関数にだけ反映できる理論。
今考えたいのは音場(球面$ S^2上の関数)なんだけど、並行移動・スケールだけでは表現に限界がある。
でも、並行移動・スケールができたから「局所的で適度に解像度を変える基底」の線形結合で信号を表せた。
何を持っていけばええんや....?
MRAによる第二世代ウェーブレットの構築
$ S^2に持っていきたい、Waveletの重要な姿勢
1. 細かいスケールの信号変動は細かい波(基底)を使って表現する
2. より荒いスケールの基底は、細かい波を使って表現できる(入れ子構造)
3. それぞれの基底は局在的である。
この三つの性質を守れば、Waveletでやりたかったことが$ S^2上でもできる!
「局所的で適度に解像度を変える基底」の線形結合で$ S^2上の関数を表す!
全体のワークフロー (Ch 6.)
1. 「ユーザが作りたい音場$ f^n」を十分に細かいスケールで捉え
2. 荒く近似した表現$ f^jに落として、そこで得られた係数列$ c^jを保存する。
3. $ c^jに基づいて、スピーカーにデコーディングする
球面上に「解像度」をどうやって表現するか?
球面$ S^2をsubdivision meshの要領で八面体から近似していくことを考える。
https://gyazo.com/ca347f019dea3ecdef31ee89cf588717
各辺ごとに頂点を増やしていき、分割していき、より細かくメッシュを分解していく。
それぞれの点に何かしらの数値を対応づけ、$ S^2上の関数を離散化して表現する。
この分割操作を$ n回行ったら、level nのmeshと表現することにする。
nが大きいほど細かいものとなる。
「局所的」をどうやって表現するのか?
上限のlevel nにおいて、各データ点$ pごとに次のような基底を対応づける。
$ \phi^n_p(x) = \delta(x - p):$ x = pのとき$ 1、それ以外$ 0になる関数。
level nは本当に全ての$ S^2上の関数が自由に表現できるぐらい精細であって欲しい。
$ \phi_p^nをうまく重み付けて全部の点$ xにわたって足せば、任意のlevel n mesh上の関数を表現できる。
高い level のフィルタは、実際には低い level のフィルタを縮小したものになるように構成する。
https://gyazo.com/5ca3ec7becfc386852719731484f1ebc
これで、局所的かつスケーリングするように基底を選び出せる
音場の情報を圧縮した後、また再構成するので、レベルは上下に行き来できる術が欲しい。
一次Ambisonicsは音場の情報を、4つの基底に対する4つの係数に圧縮した。
多解像度解析を行う場合、基底とそれに対する係数が各レベルごとにあるとみなせる。
基底を見ずに、レベルjの係数だけからj+1, j-1の係数がわかればいいなぁ
以下ではレベルを行き来するために、その規定をどう表現するのかの戦略を立てていく。
第二世代Waveletの概要
1. 信号$ fは$ f = \sum_{x} c_{x} \phi_p(x)のように、基底の線形結合で表され、レベルごとに係数$ c_xを持つ。
2. レベルが下がるたびに基底$ \phiを粗くしていくことで、$ (f^{n}, c^n) \to (f^{n-1}, c^{n-1}) \to \cdotsとどんどん関数の表現できる幅を粗くしていく。
3. 関数$ f^{n+1}のレベルを下げる時に、荒い関数$ f^{n}の係数$ c^{n}だけでなく、失われた細かい関数の基底に対する係数$ d^{n}も保持しておく。(レベルを上に復元するための工夫)
係数$ c^i, d^iには次の関係が成立するので、これを使う。
粗への分解:$ c^j = A^{j+1} c^{j+1}
詳への分解:$ d^j = B^{j+1} c^{j+1}
分解の可逆性:$ c^{j+1} = P^j c^j + Q^j d^j
レベルの間で成り立っていてほしい関係の整理
どのレベルでも一般的に成り立つ、基底$ \phi_p^jと実際のlevel $ j上の信号$ f^jの関係を調べていく。
線形代数の用語:「関数の空間$ Vを張る基底$ \{\phi_p\}_p」
その重みづけ和で集合$ Vの中に入っている全ての関数$ fが表現できるような基底$ \{\phi_p\}_pのこと。
用語:level $ jの関数空間$ V^j
level $ jの基底$ \{ \phi_p\}_pが張る関数の空間のこと。
アイデア0:係数列$ \bm c^jによって$ f^jの情報を過不足なく表せる。
1. 細かいスケールの信号変動は細かい波(基底)を使って表現する
$ f^{j} = \sum_{p} \phi^{j}_p c^j_p = \Phi^n \bm c^j
アイデア1:$ V^jの関数は、より細かい関数空間$ V^{j+1}に含まれる。
2. より荒いスケールの基底は、細かい波を使って表現できる(入れ子構造)
$ V^j \subset V^{j+1}
$ \Phi^{j} = \Phi^{j+1} P
アイデア2:$ V^{j+1}は、それより荒い関数部分空間$ V^jと細かさの元となった部分空間$ W^jに分けられる。
$ V^{j+1}に対して粗い$ V^{j} (scaling functions)に欠けるものを考えると、$ V^{j+1}を補うような細かい関数の空間$ W^{j} (wavelets)を見出せる。
直和を用いれば$ V^{j+1} = V^{j} \oplus W^{j}。つまり、$ W_{j}の基底を加えれば、$ V^{j}は$ V^{j+1}と同じ範囲を張れる。
$ V^{j+1}は$ V^{j}と$ W^{j}に分解される。
$ W^j \subset V^{j+1}
分解可能性:$ f^{j+1}は、$ W^jを張る基底$ \Phi^{j} = (\phi^{j}_p)_pと$ V^{j}を張る基底$ \Psi^{j} = (\psi^{j}_p)_pを用いて表現できる。
$ f^{j+1} = \sum_p \phi^{j}_p c^{j}_p + \sum_p \psi^{j}_p d^{j}_p = \Phi^{j} \bm c^{j} + \Psi^{j} \bm d^{j}
この第一項がlevel $ jで表現できる荒さの上での$ f^{j+1}の近似となっていて欲しい。第二項はそれでは表現しきれなかった細かい部分が入っている。
$ f^{j} = \Phi^{j} \bm c^{j}
$ f^{j+1} - f^{j} = \Psi^{j} \bm d^{j}
信号$ f^jを表す重要な情報は$ \bm c^j, \bm d^j。
今後$ \bm c^j, \bm d^jだけに注目して議論を進めたい。$ c^{j+1}から$ c^{j}の情報を得られると嬉しいな〜。
双対性を利用して係数を抜き出す
関数$ f^j \in V^jから同じレベルの係数$ \bm c^{j}を抜き出すには?
$ f^j = \sum_i \phi_i c^j_i = \Phi \bm c^j
基底を並べた行列$ \Phi^jの逆変換$ \tilde{\Phi}^jがあると便利(有限次元行列の場合、逆行列$ \Phi^{-1})
両辺$ \Phi^{-1}をかければ、$ \Phi^{-1} f = \bm c^jがもとまる。(なぜなら$ \Phi^{-1}\Phi = I; 単位行列)
この逆変換$ \tilde\Phi^j = (\Phi^{-1})^\top *1の列ベクトルを基底にとれば、新たな関数空間$ \tilde{V}^jを張れる。
双対性:同じ議論を行えば、$ \tilde{V}^jの側にも$ \tilde\Phi^j, \tilde \Psi^jや$ \tilde W^j, \tilde V^{j} \subset \tilde V^{j+1}, \tilde W^{j} \subset \tilde V^{j+1}の関係を見出せる。
*1 $ \Phi^{-1}側の行ベクトルが$ fと内積されて$ \bm c^jの各々の係数が決まっている。ここでは、基底同士の関係を見たいので転置$ ^\topをとった。
相等条件:$ \tilde \Phi^{j} \Phi^j = I / $ \tilde \Psi^{j} \Psi^j = I
交差条件:$ \tilde \Phi^{j} \Psi^j = O / $ \tilde \Psi^{j} \Psi^j = O
同じように$ f^{j+1} = \Phi^{j} \bm c^{j} + \Psi^{j} \bm d^{j}からも係数$ \bm c^j, \bm d^jを取れるだろうか?
$ \tilde\Phi^jを使えば、$ f^{i+1}から$ c^{j}, d^{j}を直接抜き出せる!
$ c^{j} = (\tilde\Phi^{j})^\top f^{i+1}
$ d^{j} = (\tilde\Phi^{j})^\top f^{i+1}
https://gyazo.com/2b32be89a2265c8f84449966e3e9976e
レベルの間で成り立っていてほしい関係(係数同士の関係)
導けた表式らに双対行列を使っていくと、$ c^j, d^jに対して次のような行列(フィルタ)$ A, B, P, Qが存在するといえる。
粗への分解:$ c^j = A^{j+1} c^{j+1}
詳への分解:$ d^j = B^{j+1} c^{j+1}
分解の可逆性:$ c^{j+1} = P^j c^j + Q^j d^j
これは双直交条件$ (A\; B) (P; Q) = Eを満たしている。
「基底を見ずに、レベルjの係数だけからj+1, j-1の係数がわかれば」が達成された!
今後はこの係数だけしか見ないことにする。
ただ、ここまで$ c^jに成り立って欲しい話しかしていなくて、具体的に$ A, B, P, Qがなんなのかという話を一切していない。
....では、その関係をどうやって作っていけば良いだろうか?
まずはいったん球面$ S^2であることを忘れて、直線$ \R上の関数で考えてみよう!
単純なフィルタを考えて、それを元にcoarse, detailに分けるフィルタを構成しよう。
5.4.4. Lazy Wavelet
偶奇に分けるだけのWavelet。
粗詳への分解という目的は達成されないけど、とりあえず分解に可逆性はある。
粗への分解:$ c^j = A^{j+1} c^{j+1}
$ E= A^{j+1}は$ c^{j+1}の偶数番目の要素だけを取り出して圧縮$ c^j
詳への分解:$ d^j = B^{j+1} c^{j+1}
$ D= B^{j+1}は$ c^{j+1}の奇数番目の要素だけを取り出して圧縮$ d^j
分解の可逆性:$ c^{j+1} = P^j c^j + Q^j d^j
$ P, Qはそれを偶数番目$ E^T、奇数番目$ D^Tの番号に配置し直すだけ。
これらは全て行列として表現できる
定理:Lifting Scheme
定理:双直交性を満たす可逆なフィルタ$ \{A, B, P, Q\}がある時、どんな行列$ Sに対しても双直交性を持つ新しいフィルタが作れる。
$ Aの操作に$ B側を噛ませられる点が重要
code:tex
\begin{aligned}
\overline{\mathbf{A}}^j & =\mathbf{A}^j+\mathbf{S}^j \mathbf{B}^j \\
\overline{\mathbf{B}}^j & =\mathbf{B}^j \\
\overline{\mathbf{P}}^j & =\mathbf{P}^j \\
\overline{\mathbf{Q}}^j & =\mathbf{Q}^j-\mathbf{P}^j \mathbf{S}^j
\end{aligned}
https://gyazo.com/4be5e162a86a579994852fcbde3b0cf0
定理:Dual Lifting Scheme
同じく、双対側(?)に対しても同じ改造ができる。
$ Bの操作に$ A側を噛ませられる点が重要
code:tex
\begin{aligned}
& \mathbf{P}^j=\overline{\mathbf{P}}^j+\overline{\mathbf{Q}}^j \tilde{\mathbf{S}}^j \\
& \mathbf{A}^j=\overline{\mathbf{A}}^j \\
& \mathbf{Q}^j=\overline{\mathbf{Q}}^j \\
& \mathbf{B}^j=\overline{\mathbf{B}}^j-\tilde{\mathbf{S}}^j \overline{\mathbf{A}}^j
\end{aligned}
これを悪用して、Lazy WaveletをSaikyo Waveletにする。
5.4.4 Interpolating Wavelet Transform via the Lifting Scheme
基本アイデア
今、detailにodd、coarseにevenが入っている。
detail -- 「odd側の値」と「even側からoddを補間 *1 した値」の差分とする。(predict operator $ \tilde S)
激しく変化している信号なら、線形補間した値からは大きく差分が出るはず ---> 高周波であることが残せる。
*1 スカイーニキ曰く、線形補完でも三次補間でもエルミート補間でもなんでもいいらしい。
coarse -- 「even側」から「detail」のぶんの情報を省く (update operator $ S)
e.g. [0, 100, 0, 100, 0, 100]のevenは[0, 0, 0]であるが、これは果たして粗いフィルタとみなせるだろうか?
levelが下がったとしても、元信号値の$ f^jの平均を保つように粗くしたい。
$ c^nは長さ$ 2^Nの信号、$ c^{n-1}は長さ$ 2^{N-1}、$ \cdotsと段階的に圧縮されていく。
$ f^nは$ c^nに簡単に変換できる(基底が$ \delta(x -p)なので)
https://gyazo.com/fc09ec0fc954b5c9c8c086952373805a
補完フィルタの導出
evenの情報しかない$ c^jから$ c^{j+1}のodd番目を復元する
$ c^{j+1} = P^j c^j + Q^j d^j ... (*)
coarse側としては、even側を保ちながらodd側をなんとか補間する必要がある。
従って、可逆なフィルタ$ \{E, D, E^T, D^T\} に対して、$ Sを「近傍からoddを補完する」行列とすれば、Dual Liftingより、次の可逆なフィルタ$ A_1, B_1, P_1, Q_1を得る。
$ P_1 = E^T + D^TS
(*)の右辺第一項に対して$ Pc^j = E^T c^j + D^T S c^j
$ c^jはevenの情報しか入っていない
$ E^T c^jは$ c^jをそのまま係数列の偶数番目に置き直している。(Evenは変えてはいけない)
$ D^T S c^jのうち、$ S c^jはevenからoddの補間値だけを出す。$ D^Tはそれらをodd番目に置き直す
それぞれeven, oddが独立して計算されている点に注意する。
$ A_1 = E
$ Q_1 = D^T
$ B_1 = E - SD
$ d^j = Bc^{j+1} = Ec^{j+1} - SDc^{j+1}
$ Ec^{j+1}はeven番目係数の取り出し
$ Dc^{j+1}はodd番目係数の取り出しで、$ Sでそこからevenの係数を補間する。
つまり、補間した結果と実際の値の差をみる式。
これにより$ B側(detail)側はdetailの情報を収められるようになった。
$ A側はまだeven係数の取り出しを見ているだけ
$ c^jから$ c^{j-1}に変わった時に全体の平均が変化するという問題が残っている。
また、連続関数として考えた場合、$ A, Qは理論上Dirac Deltaとして考えなくてはならない。
$ A, Qの双対は理論上$ \mathcal{L}^2の中 *1にない (?)。
*1 $ L^2とは絶対二乗可積分である関数の集合のこと。フーリエ級数など、工学で扱いやすい関数としてよく出てくるクラス。$ \int_{-\infty}^\infty |f(x)|^2 dxが発散すると色々困る。
先に議論した$ V^jは$ \mathcal{L}^2の上で議論されているので、できればこれは連続関数の理論としても正しく扱えて欲しい。
そこで、$ A, Qにも普通のLifting Schemeによって、coarse側に情報をつける。
さっき構成した可逆なフィルタ$ \{A_1, B_1, P_1, Q_1\}を用いれば、次のような形に書き直せる。
code:tex
\begin{aligned}
& \mathbf{P}_2^j=\mathbf{P}_{1}^j\\
& \mathbf{A}_2^j=\mathbf{A}_{1}^j+\mathbf{S}^j \mathbf{B}_{\mathrm{1}}^j \\
& \mathbf{Q}_2^j=\mathbf{Q}_{1}^j-\mathbf{P}_{1}^j \mathbf{S}^j\\
& \mathbf{B}_2^j=\mathbf{B}_{1}^j
\end{aligned}
$ Sは、$ c^jから$ c^{j-1}の信号値$ f^j, f^{j-1}の平均ができるだけ変わらないように設計する。
これは$ d^j側の信号値の平均を$ 0にすることと同じである。
そのためには、$ d^j側の基底をうまく調節するように$ W^jの基底が選ばれなくてはならない。
これは$ Q^j_2によって達成される。$ \Psi^{j} = \Psi^{j+1}Qであるため。
(信号全体値を積分して、それに基づいて近傍detailの値を重みづけるなどの実装が考えられる)
ちゃんと展開するとこう
code:tex
\begin{aligned}
& \mathbf{P}_2^j=\mathbf{E}^{\top}+\mathbf{D}^{\top} \tilde{\mathbf{S}}^j \\
& \mathbf{A}_2^j=\left(\mathbf{1}-\mathbf{S}^j \tilde{\mathbf{S}}^j\right) \mathbf{E}+\mathbf{S}^j \mathbf{D}^j \\
& \mathbf{Q}_2^j=-\mathbf{E}^{\top} \mathbf{S}^j+\mathbf{D}^{\top}\left(\mathbf{1}-\tilde{\mathbf{S}}^j \mathbf{S}^j\right) \\
& \mathbf{B}_2^j=\mathbf{D}-\tilde{\mathbf{S}}^j \mathbf{E}
\end{aligned}
ややこしくてやってられんから図も用意したで
記法の注意について話があったが、前回monotonさんが取り上げたので省略。
https://gyazo.com/b885dd949230b578c81efd18436040c5
....で、これは直線$ \R上の話でしょう?球面$ S^2上にevenもoddもなくない?
本質的には、サンプル index に基づいて信号を2つの信号に分割するものであった。
直線や平面より複雑な空間、たとえば一般メッシュへ移るとき、この単純な定義は一般化できる。
5.5 Spherical Wavelets via the Lifting Scheme
アイデア
https://gyazo.com/ca347f019dea3ecdef31ee89cf588717
even側からoddを予測して、levelを一つ上へ復元するという話だった。
even = level jの頂点上のデータ
odd = level j + 1の頂点のデータ;新しく出てきた頂点のデータとみなす。
二つの近傍$ v_1, v_2のデータの平均から$ pのデータを予測し、
detailにその残差を入れる。
detailを用いて、coarseの平均を変えないようにレベル$ jのデータを調節する。
見方:$ c^{(レベル)}_{(頂点添字)}
$ j:レベル
$ m, v: 頂点
dual liftingでoddを予測する。
フィルター$ A, Bは次のように定められる。
平均2近傍からoddを予測する。
code:tex
\begin{align*}
c^j_{m}&=c^{j+1}_{m} \\
d^j_{m}&=c^{j+1}_{m}-\frac{1}{2}\left(c^{j+1}_{v_1}+c^{j+1}_{v_2}\right)
\end{align*}
式(5.28)
つまり、周辺2近傍の平均を以て頂点$ mのデータ点を予測することになる。
これは行列$ A, B, \tilde Sの操作としてかける。
$ P, Qはここから自動的に定まる(式 5.29)。
普通のliftingで$ fの平均を保つようにcoarseを調節する。
$ c^jの平均を保つようにcoarseを調節する ---> $ d^j側の信号の平均が$ 0じゃないといけない
$ \mathbf{Q}_2^j=\mathbf{Q}_{1}^j-\mathbf{P}_{1}^j \mathbf{S}^jの$ S^jをどう決めるか問題
$ d^jの各値がどれだけ元の関数$ fの平均に影響を与えるかを調べなければいけない。
それはその基底関数$ \psi^{j}_m(x)が球面上にどういった平均を持つのかを調べないといけない。
$ I^j_m = \int_{S^2} \psi^j_m(\omega) d\omega
$ I^{j+1}_{m}がdetail側の信号に影響を与える平均成分となる。
これがcoarse側に失われている成分なので、$ c^{j}_{v_1}, c^{j}_{v_2}に足しておきたい。
今まで$ \phi^n_mの計算を避けて$ c^jだけを見てきたのに、ここで計算し直さないといけない?
しかし実は楽ができる。
(i) $ \phi^n_m (\omega) := \delta (\omega - m)と定義していたこと
(ii) $ V^{n-1}の基底は$ V^nの基底の線形結合で表せる($ \Phi^{n-1} = \Phi^n P)
この二つを使えば、$ \phi^n_k(x)の積分$ I^n_mからフィルター$ Pを使って、
$ \phi^{n-1}_k (x)の積分$ I^{n-1}_m、
$ \phi^{n-2}_k (x)の積分$ I^{n-2}_m、....
と段階的に求められる。 (* のちのページに補足あり)
level $ jのliftingにおいては、$ I^{j+1}_mを打ち消すべくcoarse, Q側に操作を加える。
$ \mathbf{Q}_2 d^j=\mathbf{Q}_{1} d^j-\mathbf{P}_{1} \mathbf{S} d^j
code:tex
\begin{aligned}
& \mathbf{c}'^j_{v_1}=\mathbf{c}^j_{v_1}+\mathbf{s}^j_{v_1, m} \mathbf{d}^j_{m} \\
& \mathbf{c}'^j_{v_2}=\mathbf{c}^j_{v_2}+\mathbf{s}^j_{v_2, m} \mathbf{d}^j_{m}
\end{aligned}
$ v_1のdetail値にかける係数を$ I^{j+1}_{m} / 2 I^{j}_{v_1}
$ v_2のdetail値にかける係数を$ I^{j+1}_{m} / 2 I^{j}_{v_2}
とするようにして、各々のvertexのcoarse側に分配すれば、$ cから抜け落ちた平均の情報を補填できる。*2
*2 かなり大胆に詳細を省いている。
これでdetail側の信号平均を0にできるのは、$ Q_2に$ \Psi^{j} = \Phi^{j+1}Q^{j+1}と下levelのdetail側の基底(wavelet)を決める能力があることに起因する。
まず、$ d^j側の基底の$ S^2にわたる積分を$ 0にしたいという気持ちがある。
$ Q_2の定義では、それによって定められた新しい基底の$ S^2にわたる積分は$ I^{j+1}_{m}-s^j_{v_1, m} I^j_{ v_1}-s^j_{v_2, m} I^j_{v_2}となる。
この係数$ sらをいじり倒すことで、基底の平均を$ 0にできるという寸法.....だが、正直自分も完全に理解できていない。
数学的な詳細:なぜ$ I^j_mで楽ができるのか
level $ nは、かなり素直に近似できる。
$ I^n_m = \int_{S^2} \phi^n_{m}(\omega) d\omega = \int_{S^2} \delta(\omega -m) d\omega \simeq (球面の中で頂点mに割り当てる面積)
(全部足し合わせたら$ \sum_m I^n_m、単位球の表面積$ 4\piになっていて欲しいので、等分する)
図をつける。
level $ n-1は?
各レベルの関数空間が部分空間の階層構造$ V^{n-1} \subset V^{n}をなすことを思い返す
$ V^{n-1}の基底は$ V^nの基底の線形結合で表せる。($ \Phi^{n-1} = \Phi^n P)
積分も
$ I^{n-1}_m = \int_{S^2} \phi^{n-1}_m(\omega) d\omega
$ = \int_{S^2} \left( \sum_{i} p_{i} \phi^{n}_{m} (\omega ) \right) d\omega
$ = \sum_{i} p_{i} \int_{S^2} \phi^{n}_{m} (\omega ) d\omega (交換可能(のはず))
$ = \sum_{i} p_i I^n_m
まとめると$ \bm I^{n-1} = P^\top \bm I^nのように行列でかけ、積分値を直接毎回計算しにかからなくていいことがわかる。
この議論を繰り返せば、任意のレベル$ jに対して同じように、$ c^jの寄与が求められる。
したがって、信号の流れは次のようになる。
解析段階では、まず prediction step、すなわち式 (5.28) を適用し、次に update、すなわち式 (5.30) を適用する。
合成段階では、まず update を取り消し、式 (5.31) を適用し、次に prediction を取り消し、式 (5.29) を適用する。
実例
実際動かしたwaveletの基底をFigures 5.7, 5.8, 5.9, 5.10 に示されている。
高い level のフィルタは、実際には低い level のフィルタを縮小したものになっていることが分かる。
https://gyazo.com/5ca3ec7becfc386852719731484f1ebc
注意:lifting scheme では、scaling functions や wavelets を明示的に構成することはないが、delta をグラフに入力しそれを無限に走らせることで、それらを得ることができる。
ここから先どうなるのか?
僕らはそもそも何をしていたのか?
Ambisonicsの弱点を克服した、新たな音場データ表現の獲得
1. 多重解像度解析の枠組みによって、段階的に音場の表現を荒くしていける ---> 必要な粒度を選択ししやすい
2. 局所性のある基底の選択 ---> 指向性の高い音場に強い!
SWF(Saikyo Wavelet Transform)へ辿り着いた!
実際どのようにここから使われていくのか? (Ch. 6)
音源方向がユーザから入力される。
---> finest mesh 上の近傍点へ割り当てる
---> wavelet transform で SWF 係数へ変換する
---> level で truncation してチャンネル数を制御する
---> SWF データとして保存・伝送する
---> 再生時に decoder で実スピーカ信号へ変換する
6.1:多重解像度メッシュ上で音響信号を分解する
6.2:音源をどうエンコードするか
1. Source interpolation
2. Wavelet encoding
3. Wavelet truncation
6.3:Spherical Wavelet Format, SWF の定義
6.4:SWF をどうスピーカーへデコードするか
第7章:Building Spherical Wavelets via Numerical Optimization
第7章は、SWF で使う球面ウェーブレットフィルタを、既存の lifting scheme だけで作るのではなく、空間音響にとって望ましい性質を満たすように数値最適化で設計する章だ。
7.1:なぜ最適化が必要か
第5章までで、lifting scheme によって球面ウェーブレットを作れることは示されている。
しかし、それは一般的な信号処理の構成であって、空間音響にとってよいフィルタかどうかは別問題。
7.2:A と P のフィルタ設計の最適化
7.3:最適化されたフィルタの例
著者は、得られたフィルタを butterfly / interpolating / optimized で比較している。
既存の interpolating / butterfly 系のフィルタと比較可能な、しかし空間音響向けに少し性質を調整した optimized filters が得られる。
第6章が「新フォーマットの文法」
第7章が「その文法で使う語彙を、音響的に聞こえが悪くなりにくいように調整する方法」