モノラル音源のステレオ化を数式で
この記事で最終的に扱う事柄は次のようなことである:
モノラルの波形があったときに, それを2chにコピーし,
片方のchにだけエフェクト(ディレイなど)を掛け, 各chそれぞれパンを振る.
つまり, いわば無理やりステレオ化を行うときの話をする*1.
これを処理*2の観点からきっちりと数式化して*3書き下し理解してやろうという趣旨である.
流れとしては,
- 変換の定式化
- ダブリングによるコーラス効果
- パンの定式化 1,2
- 具体例
という構成になっている.
実は話としては前半のダブリングの部分でほぼ終わってしまっている.
その後はパンに伴う一般化を行なっているが, 直感に反する結果は結局特に出て来ない.
処理を数式で深く理解したいという場合には参考にして戴けたら幸いである*4.
変換の定式化
波形とは時刻を変数とする振幅の関数もしくは数列のこととする.
波形,に対して,を次のように定義する:
.
波形と言ったが, もし一瞬の時刻だけを取り出して考えればこれはただの2次元変換であり,
基底を図示するとこうなる.
つまり見方を変えるとこれはただの基底の変換であり,
本質的には同じもの(ステレオ音声)を異なる軸に射影して見ているのだと言える.
ちなみにベクター・スコープとかリサージュ波形とか呼ばれるものは
この空間に投影されている.
さて, 逆行列などを持ち出すまでもなく逆変換は計算できて,
こうなる. ととは双対的な関係にあることに注意したい.
つまり, の世界で何か処理を行った結果がの世界にどう影響するかを知れば,
同じ処理によるの世界からの世界への影響も同時にわかったことになるのだ.
特に変換行列を正規化して と取ってやればこれは対称直交行列になり,
2回繰り返すと元に戻ることがわかるので, 数学的には変換の行列はこれで取るのが綺麗である.
しかしこの記事では最初に定義したものを用いることとする.
ダブリングによるコーラス効果について
最初にやりたいことはこうである. 1chつまりモノラルの音声しか無いときに,
それをchとchに振って, 片方だけディレイさせたら何が起こるか.
もちろんコーラス効果が生まれるのであるが, それはいったいなんなのか,
特に空間では何が起こっているのか, を見ていきたい.
を波形としよう. さらに波形に対する変換をとし,
と定める. あまりにも一般的な設定だが, ここではは
単に波形を一斉に遅らせたり振幅を一斉に変えたりする程度のものを想像してもらえればよい*5.
これを変換すると
となる.
1つものすごく当たり前のことを確認するが,
もしが何もしない関数, つまり だとすれば である.
逆に言うと, そうでなければ であり, 何らかの拡がりが生まれることになる.
例えばがディレイを与える関数だとすると,
はコムフィルタのことであり,
は逆相のコムフィルタ,
つまりピークとディップとが入れ替わったものになる(特に0Hzがディップになる).
コムフィルタの特性はディレイタイムに依存して変わり,
ディレイがmsであればピークは, , , …
ピークは , , …
で得られる.
1例として, 50Hzのノコギリ波に対して片chに1ms*6のディレイを掛けると
パワースペクトルはこうなる*7. ここで緑がで黄色がである.
このようにして, 低域がに拡がらず,
それより上の音域でまんべんなく拡がる様子が見て取れる.
ただし, 実際にはハース効果があるので
スペクトルで見えるほどセンター寄りには聞こえない.
上でととは双対的と述べたが, そのことを念頭に置けば
例えばをディレイしてやるととに
互い違いのコムフィルタが返ってくることも分かる.
この場合, のディレイと違っての低域は勝手には消えないので,
気になる場合はHPFが必要ということになる.
その代わりハース効果が掛からないので,
定位を寄せずに拡げたい場合は有効な手法と言えるだろう*8.
パンの定式化
1波形の場合
さてパンであるが, 普通は音量(振幅)をで変えることにより定位を表現する.
素直に書けば, 係数, を用いて
のようになる. しかしこれではあまりに自由すぎて
コントロールが面倒くさいので何か制約を入れたい.
ここでは等しいパワーを用いることにする. すなわち とする.
を想定しているので, 三角関数を用いてパラメトライズすると便利である.
以下で, など沢山の変数が出てくるが
最終的に使うのはである.
途中の変数変換は蛇足といえば蛇足なので飛ばして頂いても構わないが,
イメージが掴みやすくなると思い, その導出の過程もひと通り書いている.
さて最初は素直にパラメータを として
とおいてみる. これは が で がということである.
しかしこの記事ではを基準にした話をしたいので,
で, で, でのようなパラメータを取りたい.
それには次のような変数変換を行えばよい*9:
よってによってパンニングされた音声は
と書ける.
2波形の場合
さて上のダブリングの節ではモノラル音声を左右に全振りしてディレイを掛けたが,
実際にはもう少し細かい調整がしたいことも多い.
例えば全振りではなく, それぞれのパンを微調整することを考えよう.
こうすることで, どセンターではなく左右に振りつつ拡がりを得られる(ということになっている).
これをの空間で分析していきたい.
パラメータ, を用いて,
波形をコピーしてそれぞれパンし, 片方にエフェクトを掛ける,
という状況を数式化する.
.
ここで更に次の変数変換をする:
.
Middle(中心)とlength(拡がりの幅)のつもりである.
よく見ると変換の逆変換と同じ形をしていることが分かる.
結局はパラメータ, を用いて
のように書ける*10.
ここで三角関数の中身をよく見ると, どれもが加わった形をしている.
三角関数の合成を思い出して, これを分解する.
.
変換をすると項同士がうまく打ち消し合って,
このようになる. 加法定理を用いて分解し, と でまとめると,
.
をメインにして行列の積の形にすると,
.
さらに, , と置き,
行列の反転をくくり出すと,
.
, が同時にでなければ,
との行列は回転と定数倍を表す*11.
の意味するところが行列なのは明らかだが, その条件は後述する.
パンニングの具体例を検証
さて, ここまで長々と式変形をしてきたが改めて各変数の意味を確認しておこう.
が元の波形, が変換(エフェクト),
は「2本の波形の中心がどこにあるか」,
は「2本の波形の両端がどれくらい拡がっているか」である.
変数の範囲は と で与えられる.*12
例えば とすると,
最初に述べたシンプルなコーラス効果の例になる.
このの範囲でが意味しているものは
かつ である.
これはつまり, はただの振幅反転*13であって
それを幅で重ねているということは
結局のところ恒等的にの波形になるということである.
ここでとし, を定義域内で自由に動かすことにしてみよう.
つまり, 左右に振った2本の音源を, 中心はセンターに据えたまま幅を
拡げたり狭めたりする, という操作に対応する.
先の一般式で言えば行列の第2列が無視されることになり,
と を紐解けば
こうなる.
幅が狭ければ狭いほど成分が小さくなり, 幅で完全にセンターになる.
の音量はこのようにの拡がり具合として効いてくることがわかる.
逆に言うと, にと同程度の音量を与えてやればフルに拡がる, とも言える.
を止めた場合はどうだろうか.
これは実質的には, という単位ベクトルを, 行列 でもって
拡縮・回転していることになる.
つまり本質の部分はで成り立っていて,
あとはの世界で向きを変えているだけ, という構造になっていると読み取れる.
結局, 「左右に振りつつ拡がりを得られる」という経験則そのものになったわけだが,
数式ではこのように表現できるということが分かったわけだ.
言い換えると, 中心をズラすためにはとを複雑に(と言うほどでもないが)絡めた演算が必要ということになる.
裏を返せば, ととを絡めなければ中心はズレない, とも言える.
定位をコントロールしたい場合はの世界が,
定位を変えずに拡がりをコントロールしたい場合はの世界が
向いていると言えるだろう.
*1:海外ではfatteningと呼ばれているらしい
*2:いつもはMid/Sideと表記することが多いが, 本記事では全て変数名として書く.
*3:とか言ってるが波形の扱いが若干雑である.
*5:しかしながら, その後もに何か特別な仮定をおいたりはしないので, 任意のモノラルエフェクトを想定してもらってよい.
*6:正確には50/48000 s
*7:波形生成にはWave Geneを, スペクトル表示にはVoxengo SPANを用いた. 表示の詳細は過去記事参照
*9:導出は, 一次関係だと仮定してパラメータが条件を満たすように連立方程式を立てるだけである.
*10:これが上で予告した, 最終的に使う変数による表示である.
*12:図はFunction Viewを用いた.
*13:位相反転と呼ばれることも多い. の位相遅れと混同しないようにしよう.