一人で合唱する方法の解説

伝搬とインパルス応答について

波の伝搬は,伝搬路の特性に左右されます.伝搬路のインパルス応答h(\tau)と呼ばれる特性を用いると,送信波x(t)と受信波y(t)は,次式のように表すことができます.

\displaystyle{y(t)=h(\tau) \ast x(t)}

ここで,演算子\astは畳み込み演算と呼ばれ,連続時間であれば

\displaystyle{(h \ast x)(t) = \int_0^\infty h(\tau) x(t-\tau) d\tau}

となります.ここで,\tauは遅延時間を表します.この式は何を表しているかというと,波は空間を直進しますが,その速度は音速だったり,光速です.したがって,時刻t=0で波を出したとしても,受信側では遅延して観測できます.また,波は壁などで反射や回折したり,いろいろな影響を受けます.そうすると,h(\tau)とは,受信信号y(t)に含まれている\tau秒遅延した送信信号x(t)の大きさのことです.なので,先ほどの積分の式は「受信波は0秒〜無限秒遅延した送信波の重ねあわせである」ということを表現しています.

本題

さて,本題に入ります.一人で合唱する方法を考えるわけですが,まずはN人の合唱している人たちの声が聞いている人にとってどのように聞こえるかを考えます.単純に,全員分の声を加算すればよいので,次のように表せそうです.ただし,人間には耳が2つありますので,受信波は2つになります.また,伝搬路の特性はすべての伝搬路で異なりますので,そのインパルス応答も異なります.

\displaystyle{y_1(y)= \sum_{i=1}^N h_{1i} (\tau) \ast x_i (t)}
\displaystyle{y_2(y)=\sum_{i=1}^N h_{2i} (\tau) \ast x_i (t)}

x_i(t)は,i番目の人が送信している波です.

ではy_1(t)y_2(t)をそのまま自分の口から発すれば合唱になるかというと,そうでもありません.なぜなら,自分の口から出る波は一つですが,受信波は2つあります.これはひどく致命的です.なので,とりあえず「二人で合唱する」としましょう.このとき,二人が出す送信波は \xi_1(t)及び \xi_2(t)とします.また,この二人が出す波も伝搬路の特性 g_{ij}(\tau)の影響を受けるとします.したがって,受信波は,

\displaystyle{y'_1(t) = g_{11}(\tau)  \ast \xi_1(t) + g_{12}(\tau) \ast \xi_2(t) }
\displaystyle{y'_2(t) = g_{21}(\tau) \ast \xi_1(t) + g_{22}(\tau) \ast \xi_2(t) }

となります.

ここで,一旦目的を整理しておきましょう.
僕たちは「x'_1(t)x'_2(t)を送信して,y'_1(t)y'_2(t)y_1(t)y_2(t)を再現」したいのでした.つまり,「y_1(t)y_2(t)を再現するx'_1(t)x'_2(t)を求めたい」わけです.もし,インパルス応答と送信波が畳み込みh(\tau) \ast x(t)ではなく,単純な積h(\tau) \ast x(t)ならどうなるでしょうか?実はすごく簡単な式に落とし込めます.

 \displaystyle{g'_{11}(\tau) \xi_1(t) + g'_{12}(\tau) \xi_1(t) = \sum_{i=1}^N h'_{1i} (\tau) x_i (t)}
 \displaystyle{g'_{21}(\tau) \xi_1(t) + g'_{22}(\tau) \xi_2(t) = \sum_{i=1}^N h'_{2i} (\tau) x_i (t)}

これを行列で書くと,

 \displaystyle{\mathbf{G}' \mathbf{\xi} = \mathbf{H} \mathbf{x}}

なので,解は次のようになります.

 \displaystyle{\mathbf{\xi} = \mathbf{G}'^{-1}\mathbf{H} \mathbf{x}}

しかしながら,インパルス応答と送信波を単純な積h(\tau) \ast x(t)でかけて受信波 y(t)が得られる場合というのは,反射波などの遅延波が一切なく,すべての波の遅延時間が同一である場合のみですので,このような仮定は不可能です.

周波数軸で考える

では,これでもうお手上げなのでしょうか.私達の置かれている状況は十分絶望的な気がしますが,ここで救世主が登場します.皆さん大好きなフーリエ変換です.フーリエ変換とは,関数 x(t)から関数 X(f)へ変換する変換で,

 \displaystyle{X(f) = \int_{-\infty}^{\infty} x(t) e^{-i2\pi f t} dt}

と表せる変換です.フーリエ変換の物理的な意味は,時間関数 x(t)が持っている周波数成分 X(f)を得る変換です.フーリエ変換を使うと,畳み込みを単純な積にすることができます!

これを証明してみましょう!
畳み込み h(\tau) \ast x(t)フーリエ変換は,次のようになります.
 \displaystyle{Y(f) = \int_{-\infty}^{\infty} \left( \int_0^\infty h(\tau) x(t-\tau) d \tau \right) e^{-i2\pi f t} dt}
ここで,積分の順序を入れ替えることができて,
 \displaystyle{Y(f)=\int_{0}^{\infty} h(\tau) \left( \int_{-\infty}^\infty x(t-\tau) e^{-i2\pi f t} dt \right) d \tau}
さらに,内側の積分フーリエ変換にするために,少し変形して,
 \displaystyle{Y(f)=\int_{0}^{\infty} h(\tau)e^{-i2\pi f \tau} \left( \int_{-\infty}^\infty x(t-\tau) e^{-i2\pi f (t - \tau)} dt \right) d \tau}
すると,内側の積分フーリエ変換になっているので,
 \displaystyle{Y(f)=\int_{0}^{\infty} h(\tau)e^{-i2\pi f \tau} X(f) d \tau}
 X(f)積分の外に出すことができて,
 \displaystyle{Y(f)= X(f) \int_{0}^{\infty} h(\tau)e^{-i2\pi f \tau} d \tau}
遅延時間が負であるような波は存在しないので, h(t) = 0, t<0が成立しますので,
 \displaystyle{Y(f)= H(f)X(f)}
となり,畳み込み積分が単純な積の形になりました.

よって,問題だった式もフーリエ変換することで,

 \displaystyle{G_{11}(f) \Xi_1(f) + G_{12}(f) \Xi_2(f) = \sum_{i=1}^{N} H_{1i}(f) X_i(f) }
 \displaystyle{G_{21}(f) \Xi_1(f) + G_{22}(f) \Xi_2(f) = \sum_{i=1}^{N} H_{2i}(f) X_i(f) }

こうなってしまえば,先ほど導出した逆行列の計算ができて,次のようになります.

 \displaystyle{
\begin{bmatrix}
G_{11}(f) & G_{12}(f) \\
G_{12}(f) & G_{22}(f)
\end{bmatrix}
\begin{bmatrix}
\Xi_1(f) \\
\Xi_2(f)
\end{bmatrix}
=
\begin{bmatrix}
H_{11}(f) & H_{12}(f) & \cdots & H_{1N}(f) \\
H_{21}(f) & H_{22}(f) & \cdots & H_{2N}(f)
\end{bmatrix}
\begin{bmatrix}
X_1(f) \\
X_2(f) \\
\vdots \\
X_N(f)
\end{bmatrix}
}

 \displaystyle{
\begin{bmatrix}
\Xi_1(f) \\
\Xi_2(f)
\end{bmatrix}
=
\begin{bmatrix}
G_{11}(f) & G_{12}(f) \\
G_{12}(f) & G_{22}(f)
\end{bmatrix}^{-1}
\begin{bmatrix}
H_{11}(f) & H_{12}(f) & \cdots & H_{1N}(f) \\
H_{21}(f) & H_{22}(f) & \cdots & H_{2N}(f)
\end{bmatrix}
\begin{bmatrix}
X_1(f) \\
X_2(f) \\
\vdots \\
X_N(f)
\end{bmatrix}
}

これで, \Xi_1(f) \Xi_2(f)が手にはいりましたので,あとはこれを逆フーリエ変換すれば時間領域の送信波となります.

まとめ

では最後にまとめておきます.一人で合唱するのは,人間の耳が2つある状況ではちょっと難しそうだったので,最低二人いる状況で話を進めました.すると,再現を行う全員分の伝搬路特性 h_{ij}(\tau)と,自分の伝搬特性 g_{ij}(\tau)さえわかっていれば,それらのフーリエ変換を使用することで,次のようになんとか計算できそうでした.

 \displaystyle{
\begin{bmatrix}
\Xi_1(f) \\
\Xi_2(f)
\end{bmatrix}
=
\begin{bmatrix}
G_{11}(f) & G_{12}(f) \\
G_{12}(f) & G_{22}(f)
\end{bmatrix}^{-1}
\begin{bmatrix}
H_{11}(f) & H_{12}(f) & \cdots & H_{1N}(f) \\
H_{21}(f) & H_{22}(f) & \cdots & H_{2N}(f)
\end{bmatrix}
\begin{bmatrix}
X_1(f) \\
X_2(f) \\
\vdots \\
X_N(f)
\end{bmatrix}
}

実際にはここから逆フィルタなどの考え方を使うと思うのですが,今回はここまでで止めておきます.
以上です.