ネギのメモ帳

Twitterに書ききれないことをたまに書いたりするかもしれないスペース

モノラル音源のステレオ化を数式で

この記事で最終的に扱う事柄は次のようなことである:
モノラルの波形があったときに, それを2chにコピーし,
片方のchにだけエフェクト(ディレイなど)を掛け, 各chそれぞれパンを振る.
つまり, いわば無理やりステレオ化を行うときの話をする*1.
これを MS処理*2の観点からきっちりと数式化して*3書き下し理解してやろうという趣旨である.
流れとしては,

  •  MS変換の定式化
  • ダブリングによるコーラス効果
  • パンの定式化 1,2
  • 具体例

という構成になっている.


実は話としては前半のダブリングの部分でほぼ終わってしまっている.
その後はパンに伴う一般化を行なっているが, 直感に反する結果は結局特に出て来ない.
MS処理を数式で深く理解したいという場合には参考にして戴けたら幸いである*4.


 MS変換の定式化

波形とは時刻tを変数とする振幅の関数もしくは数列のこととする.
波形L,Rに対してM,Sを次のように定義する:
 \begin{pmatrix} M \\ S \end{pmatrix} :=  \begin{pmatrix} L+R \\ L-R \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} \begin{pmatrix} L \\ R \end{pmatrix}.
波形と言ったが, もし一瞬の時刻だけを取り出して考えればこれはただの2次元変換であり,
基底を図示するとこうなる.

つまり見方を変えるとこれはただの基底の変換であり,
本質的には同じもの(ステレオ音声)を異なる軸に射影して見ているのだと言える.
ちなみにベクター・スコープとかリサージュ波形とか呼ばれるものは
この空間に投影されている.


さて, 逆行列などを持ち出すまでもなく逆変換は計算できて,
 \begin{pmatrix} L \\ R \end{pmatrix} =  \begin{pmatrix} \frac{M+S}{2} \\ \frac{M-S}{2} \end{pmatrix} = \frac{1}{2} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} \begin{pmatrix} M \\ S \end{pmatrix}
こうなる. (L,R)(M,S)とは双対的な関係にあることに注意したい.
つまり, (L,R)の世界で何か処理を行った結果が(M,S)の世界にどう影響するかを知れば,
同じ処理による(M,S)の世界から(L,R)の世界への影響も同時にわかったことになるのだ.
特に変換行列を正規化して  \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} と取ってやればこれは対称直交行列になり,
2回繰り返すと元に戻ることがわかるので, 数学的には MS変換の行列はこれで取るのが綺麗である.
しかしこの記事では最初に定義したものを用いることとする.

ダブリングによるコーラス効果について

最初にやりたいことはこうである. 1chつまりモノラルの音声しか無いときに,
それをLchとRchに振って, 片方だけディレイさせたら何が起こるか.
もちろんコーラス効果が生まれるのであるが, それはいったいなんなのか,
特に MS空間では何が起こっているのか, を見ていきたい.


Aを波形としよう. さらに波形に対する変換をfとし,
 \begin{pmatrix} L \\ R \end{pmatrix} =  \begin{pmatrix} A \\ f(A) \end{pmatrix}
と定める. あまりにも一般的な設定だが, ここではf
単に波形を一斉に遅らせたり振幅を一斉に変えたりする程度のものを想像してもらえればよい*5.
これを MS変換すると
 \begin{pmatrix} M \\ S \end{pmatrix} =  \begin{pmatrix} A + f(A) \\ A - f(A) \end{pmatrix}
となる.


1つものすごく当たり前のことを確認するが,
もしfが何もしない関数, つまり f(A) = A だとすればS = 0 である.
逆に言うと, そうでなければS \neq 0 であり, 何らかの拡がりが生まれることになる.
例えばfがディレイを与える関数だとすると,
A + f(A)はコムフィルタのことであり,
A - f(A)は逆相のコムフィルタ,
つまりピークとディップとが入れ替わったものになる(特に0Hzがディップになる).
コムフィルタの特性はディレイタイムに依存して変わり,
ディレイがtmsであれば Mピークは0, \frac{1000}{t}, 2 \times \frac{1000}{t}, …
 Sピークは  \frac{500}{t}, 3 \times \frac{500}{t}, …
で得られる.


1例として, 50Hzのノコギリ波に対して片chに1ms*6のディレイを掛けると
パワースペクトルはこうなる*7. ここで緑がMで黄色がSである.

このようにして, 低域がSに拡がらず,
それより上の音域でまんべんなく拡がる様子が見て取れる.
ただし, 実際にはハース効果があるので
スペクトルで見えるほどセンター寄りには聞こえない.


上で(M,S)(L,R)とは双対的と述べたが, そのことを念頭に置けば
例えばSをディレイしてやるとLR
互い違いのコムフィルタが返ってくることも分かる.
この場合, LRのディレイと違ってSの低域は勝手には消えないので,
気になる場合はHPFが必要ということになる.
その代わりハース効果が掛からないので,
定位を寄せずに拡げたい場合は有効な手法と言えるだろう*8.

パンの定式化

1波形の場合

さてパンであるが, 普通は音量(振幅)をLRで変えることにより定位を表現する.
素直に書けば, 係数a, bを用いて
 \begin{pmatrix} L \\ R \end{pmatrix} =  \begin{pmatrix} aA \\ bA \end{pmatrix} = A \begin{pmatrix} a \\ b \end{pmatrix}
のようになる. しかしこれではあまりに自由すぎて
コントロールが面倒くさいので何か制約を入れたい.
ここでは等しいパワーを用いることにする. すなわち a^2 + b^2 = 1 とする.
 0 \leq a,b \leq 1 を想定しているので, 三角関数を用いてパラメトライズすると便利である.
以下で,  \theta, \varphi, \varphi_1, \varphi_2, m, lなど沢山の変数が出てくるが
最終的に使うのはm,lである.
途中の変数変換は蛇足といえば蛇足なので飛ばして頂いても構わないが,
イメージが掴みやすくなると思い, その導出の過程もひと通り書いている.


さて最初は素直にパラメータを0 \leq \theta \leq 1 として
 a = \cos(\theta \frac{\pi}{2}), b = \sin(\theta \frac{\pi}{2})
とおいてみる. これは\theta = 0L\theta = 1Rということである.
しかしこの記事では Mを基準にした話をしたいので,
-1L, 0M, 1Rのようなパラメータを取りたい.
それには次のような変数変換を行えばよい*9
 \theta = \frac{\phi + 1}{2}
よって \varphiによってパンニングされた音声は
 \begin{pmatrix} L \\ R \end{pmatrix} = A \begin{pmatrix} \cos(\frac{\varphi + 1}{4}\pi) \\ \sin(\frac{\varphi + 1}{4}\pi) \end{pmatrix}
と書ける.

2波形の場合

さて上のダブリングの節ではモノラル音声Aを左右に全振りしてディレイを掛けたが,
実際にはもう少し細かい調整がしたいことも多い.
例えばLR全振りではなく, それぞれのパンを微調整することを考えよう.
こうすることで, どセンターではなく左右に振りつつ拡がりを得られる(ということになっている).
これを MSの空間で分析していきたい.


パラメータ \varphi_1,  \varphi_2を用いて,
波形Aをコピーしてそれぞれパンし, 片方にエフェクトfを掛ける,
という状況を数式化する.
 \begin{pmatrix} L \\ R \end{pmatrix} = A \begin{pmatrix} \cos(\frac{\varphi_1 + 1}{4}\pi) \\ \sin(\frac{\varphi_1 + 1}{4}\pi) \end{pmatrix} + f(A) \begin{pmatrix} \cos(\frac{\varphi_2 + 1}{4}\pi) \\ \sin(\frac{\varphi_2 + 1}{4}\pi) \end{pmatrix}.
ここで更に次の変数変換をする:
 \begin{pmatrix} m \\ l \end{pmatrix} = \begin{pmatrix} \frac{\varphi_1 + \varphi_2}{2} \\ \frac{\varphi_1 - \varphi_2}{2} \end{pmatrix}.
Middle(中心)とlength(拡がりの幅)のつもりである.
よく見るとMS変換の逆変換と同じ形をしていることが分かる.
結局 (L,R)はパラメータm, lを用いて
 \begin{pmatrix} L \\ R \end{pmatrix} = A \begin{pmatrix} \cos(\frac{m+l+1}{4}\pi) \\ \sin(\frac{m+l+1}{4}\pi) \end{pmatrix} + f(A) \begin{pmatrix} \cos(\frac{m-l + 1}{4}\pi) \\ \sin(\frac{m-l + 1}{4}\pi) \end{pmatrix}
のように書ける*10.
ここで三角関数の中身をよく見ると, どれも \frac{\pi}{4}が加わった形をしている.
三角関数の合成を思い出して, これを分解する.
 \begin{pmatrix} L \\ R \end{pmatrix} = \frac{A}{\sqrt{2}} \begin{pmatrix} \cos(\frac{m+l}{4}\pi) - \sin(\frac{m+l}{4}\pi) \\ \sin(\frac{m+l}{4}\pi) + \cos(\frac{m+l}{4}\pi) \end{pmatrix} + \frac{f(A)}{\sqrt{2}} \begin{pmatrix} \cos(\frac{m-l}{4}\pi) - \sin(\frac{m-l}{4}\pi) \\ \sin(\frac{m-l}{4}\pi) + \cos(\frac{m-l}{4}\pi)\end{pmatrix}.
 MS変換をすると項同士がうまく打ち消し合って,
 \begin{pmatrix} M \\ S \end{pmatrix} = \sqrt{2}A \begin{pmatrix} \cos(\frac{m+l}{4}\pi) \\ -\sin(\frac{m+l}{4}\pi) \end{pmatrix} + \sqrt{2}f(A) \begin{pmatrix} \cos(\frac{m-l}{4}\pi) \\ -\sin(\frac{m-l}{4}\pi) \end{pmatrix}
このようになる. 加法定理を用いて分解し,  A+f(A) A-f(A)でまとめると,
 \begin{pmatrix} M \\ S \end{pmatrix} = \sqrt{2} \begin{pmatrix} (A+f(A))\cos(\frac{m}{4}\pi) \cos(\frac{l}{4}\pi)  - (A-f(A)) \sin(\frac{m}{4}\pi) \sin(\frac{l}{4}\pi) \\ -(A+f(A))\sin(\frac{m}{4}\pi)\cos(\frac{l}{4}\pi) -(A-f(A)) \cos(\frac{m}{4}\pi) \sin(\frac{l}{4}\pi)  \end{pmatrix}.
mをメインにして行列の積の形にすると,
 \begin{pmatrix} M \\ S \end{pmatrix} = \sqrt{2} \begin{pmatrix} (A+f(A)) \cos(\frac{l}{4}\pi), & - (A-f(A)) \sin(\frac{l}{4}\pi) \\ -(A-f(A)) \sin(\frac{l}{4}\pi), & -(A+f(A)) \cos(\frac{l}{4}\pi) \end{pmatrix} \begin{pmatrix} \cos(\frac{m}{4}\pi) \\ \sin(\frac{m}{4}\pi) \end{pmatrix}.
さらに,  \alpha = (A+f(A)) \cos(\frac{l}{4}\pi),  \beta = (A-f(A)) \sin(\frac{l}{4}\pi) と置き,
行列の反転をくくり出すと,
 \begin{pmatrix} M \\ S \end{pmatrix} = \sqrt{2} \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \begin{pmatrix} \alpha & - \beta \\ \beta & \alpha \end{pmatrix} \begin{pmatrix} \cos(\frac{m}{4}\pi) \\ \sin(\frac{m}{4}\pi) \end{pmatrix}.
 \alpha,  \betaが同時に0でなければ,
 \alpha\betaの行列は回転と定数倍を表す*11.
 \alpha = \beta = 0の意味するところが0行列なのは明らかだが, その条件は後述する.

パンニングの具体例を検証

さて, ここまで長々と式変形をしてきたが改めて各変数の意味を確認しておこう.
Aが元の波形, fが変換(エフェクト),
mは「2本の波形の中心がどこにあるか」,
lは「2本の波形の両端がどれくらい拡がっているか」である.
変数の範囲は |m+l| \leq 1 |m-l| \leq 1 で与えられる.*12

例えば(m,l) = (0,-1) とすると,
最初に述べたシンプルなコーラス効果の例になる.


このm,lの範囲で \alpha = \beta = 0が意味しているものは
 f(A) = -A かつ  l = 0 である.
これはつまり,  fはただの振幅反転*13であって
それを幅0で重ねているということは
結局のところ恒等的に0の波形になるということである.


ここでm=0とし, lを定義域内で自由に動かすことにしてみよう.
つまり, 左右に振った2本の音源を, 中心はセンターに据えたまま幅を
拡げたり狭めたりする, という操作に対応する.
先の一般式で言えば行列の第2列が無視されることになり,
 \alpha \beta を紐解けば
 \begin{pmatrix} M \\ S \end{pmatrix} = \sqrt{2} \begin{pmatrix} (A+f(A)) \cos(\frac{l}{4}\pi) \\ -(A-f(A)) \sin(\frac{l}{4}\pi) \end{pmatrix}
こうなる.
幅が狭ければ狭いほどS成分が小さくなり, 幅0で完全にセンターになる.
 Sの音量はこのようにLRの拡がり具合として効いてくることがわかる.
逆に言うと,  S Mと同程度の音量を与えてやればLRフルに拡がる, とも言える.


lを止めた場合はどうだろうか.
これは実質的には,  \begin{pmatrix} \cos(\frac{m}{4}\pi) \\ \sin(\frac{m}{4}\pi) \end{pmatrix}という単位ベクトルを, 行列  \begin{pmatrix} \alpha & - \beta \\ \beta & \alpha \end{pmatrix} でもって
拡縮・回転していることになる.
つまり本質の部分はm=0で成り立っていて,
あとはLRの世界で向きを変えているだけ, という構造になっていると読み取れる.
結局, 「左右に振りつつ拡がりを得られる」という経験則そのものになったわけだが,
数式ではこのように表現できるということが分かったわけだ.
言い換えると, 中心をズラすためには M Sを複雑に(と言うほどでもないが)絡めた演算が必要ということになる.
裏を返せば, MSとを絡めなければ中心はズレない, とも言える.
定位をコントロールしたい場合は(L,R)の世界が,
定位を変えずに拡がりをコントロールしたい場合は(M,S)の世界が
向いていると言えるだろう.

*1:海外ではfatteningと呼ばれているらしい

*2:いつもはMid/Sideと表記することが多いが, 本記事では全て変数名として書く.

*3:とか言ってるが波形の扱いが若干雑である.

*4:例によって独自研究である.

*5:しかしながら, その後も fに何か特別な仮定をおいたりはしないので, 任意のモノラルエフェクトを想定してもらってよい.

*6:正確には50/48000 s

*7:波形生成にはWave Geneを, スペクトル表示にはVoxengo SPANを用いた. 表示の詳細は過去記事参照

*8: Sディレイの具体的なツールについても過去記事参照

*9:導出は, 一次関係だと仮定してパラメータが条件を満たすように連立方程式を立てるだけである.

*10:これが上で予告した, 最終的に使う変数による表示である.

*11:複素数の行列表現の形をしている.

*12:図はFunction Viewを用いた.

*13:位相反転と呼ばれることも多い. \piの位相遅れと混同しないようにしよう.