DFTによるconvolution(畳み込み)実験
説明用としてDFTを使った畳み込みプログラムを作ってみた。本来はDFTを高速にしたアルゴリズムであるFFTで作るものだが、流れを確認するために簡単なDFTにしてみた。
式とかはこちらを参考にした。
http://ja.wikipedia.org/wiki/畳み込み
下のプログラムでは、入力サンプルは4つで{1,1,0,0}というもの。フィルタも4つで{0,1,0,0}というもの。これは1サンプル遅れて出力されることを意味する。つまりディレイ。出力結果は{0,1,1,0}となる。この例は単純であるが、実際には周波数成分のコントロールや残響のコントロールなど幅広い応用が考えられる。
これを実現する方法で一番シンプルな方法は時間領域で畳み込むこと。しかし、データ量が増えると処理速度の問題が出てしまう。そこで、下図のように一度DFTで周波数領域に置き換えて、そこで演算を行い、その結果をiDFTで戻して出力をするという一見面倒な処理をするのだが、FFTのおかげで時間領域の畳み込みよりも高速に処理することができる。ここでは学習向けにDFTを使っているが、本来はFFT。FFTによる畳み込みはFIRの各種デジタルフィルター、EQ、HPF、Convolution Reverbなどで広く利用されている。
同じ内容をFFTでもやってみた。
コンパイルして実行すると以下のような結果が表示される。1サンプル遅れているのが確認できる。
sound programming 目次はこちら
式とかはこちらを参考にした。
http://ja.wikipedia.org/wiki/畳み込み
下のプログラムでは、入力サンプルは4つで{1,1,0,0}というもの。フィルタも4つで{0,1,0,0}というもの。これは1サンプル遅れて出力されることを意味する。つまりディレイ。出力結果は{0,1,1,0}となる。この例は単純であるが、実際には周波数成分のコントロールや残響のコントロールなど幅広い応用が考えられる。
これを実現する方法で一番シンプルな方法は時間領域で畳み込むこと。しかし、データ量が増えると処理速度の問題が出てしまう。そこで、下図のように一度DFTで周波数領域に置き換えて、そこで演算を行い、その結果をiDFTで戻して出力をするという一見面倒な処理をするのだが、FFTのおかげで時間領域の畳み込みよりも高速に処理することができる。ここでは学習向けにDFTを使っているが、本来はFFT。FFTによる畳み込みはFIRの各種デジタルフィルター、EQ、HPF、Convolution Reverbなどで広く利用されている。
同じ内容をFFTでもやってみた。
DFT convolution 実験用ソースコード
このプログラムは数式をそのままにして自己流で作ったもの。参考にしているプログラムはないです。ということで間違っている可能性あり。また上から順に説明するために処理を関数にしてないです。複素数計算のところは怪しい。本来はもっとスマートに書くのだろう。またcomplex.hの利用も考えたけど、直接いじっている感じがしなかったのでやめた。またやたらと配列を使っているが、これも実用的なプログラムの場合はポインタを使う。まぁいろいろ突っ込みどころの多そうなサンプルです。そのかわり、とても素直で理解しやすいと思う。
|
N: DFT1 Real DFT1 Imaginary DFT1 Power 0: 2.00000000000 0.00000000000 2.00000000000 1: 1.00000000000 -1.00000000000 1.41421356237 2: 0.00000000000 -0.00000000000 0.00000000000 3: 1.00000000000 1.00000000000 1.41421356237 N: DFT2 Real DFT2 Imaginary DFT2 Power 0: 1.00000000000 0.00000000000 1.00000000000 1: 0.00000000000 -1.00000000000 1.00000000000 2: -1.00000000000 -0.00000000000 1.00000000000 3: -0.00000000000 1.00000000000 1.00000000000 N: convolution R convolution i 0: 2.00000000000 0.00000000000 1: -1.00000000000 -1.00000000000 2: -0.00000000000 0.00000000000 3: -1.00000000000 1.00000000000 N: iDFT Real iDFT Imaginary 0: -0.00000000000 -0.00000000000 1: 1.00000000000 -0.00000000000 2: 1.00000000000 0.00000000000 3: 0.00000000000 0.00000000000 |
sound programming 目次はこちら