前節の例を踏襲して、調べてみましょう。
つまり、インパルス応答hは
そして、このインパルス応答の次数の2倍を、基準にする、のでした。
今、離散的な入力信号xを、以下のように、仮定します。
x = | 1 2 3 4 5 6 7 8 |
そして、入力信号も、インパルス応答の次数の2倍で、ブロック化します。
最初のブロック
x = | 1 2 3 4 |
について、
直線たたみ込み(linearconvolution)と、巡回たたみ込み(circularconvolution)を、行ってみますと
linearconvolutioncircularconvolution
については、両方のたたみ込みが、一致します。
次のブロック は、入力信号が、50%重なるように、ブロック化します。
つまり、最初のブロックの、後ろ2つを、前にもってきて、新しいデータは、2つだけ、その後に、並べるのです。
x = | 3 4 5 6 |
linearconvolutioncircularconvolution
同様に、して
x =| 5 6 7 8 |
linearconvolutioncircularconvolution
どうです?たたみ込みの結果の、後ろ2つ分は、いつも、一致していますね。 ( 実は 3つ分や、けんど )
実に、うまいこと、考えてありますね、すごいですね.....
この一致が、偶然でない証に、一般式で、書いてみますと
linearconvolutioncircularconvolution
linearconvolutioncircularconvolution
以上を、一般式に、拡張いたしますと
インパルス応答の次数L の2倍の次数で、入力信号x を、ブロック化し、その入力を、50%重なるようにしてやれば
たたみ込みの結果は、
後ろL 個分は、
直線たたみ込みと、巡回たたみ込みの結果が、一致する!
うーむ、すごい!ナイス!ベリグー!
ここまでが、50% Overlap-Save法です。
ほんで、
巡回たたみ込みの部分は、FFTを使って、高速化できる。
そんで、
IFFTの結果の、後ろL個分を、順次、採用すれば、
信号が連続的に入ってきても、
直線たたみ込みと、同じ結果が得られる、うーん......すんごい。
実際には、どうなんやろ? これから試す所です。
それから
PortAudio
ASIOで、blocking/IOは、不発でした。(ASIO2 SDKを調べると、ASIOの IOは、Callback関数しか、使えない事が、判明しました。 )
H.19.2.9