2016-11-18 20 views
0

私の理解から、離散フーリエ変換によって畳み込みを行うことが可能です。私がこのプロセスについて読んだところからは、カーネルと入力の両方のDFTをmutliplyingするだけです。しかし、私は、異なるサイズの2つのアレイのDFTが異なるため、スペクトルの実際の乗算をどのように実装するかを理解することができません。擬似コード中のSODFTを使用して畳み込みを実装する方法は?

私は私が行うarrkernの畳み込み取得するには長さ1024と長さ8

のカーネルkernの配列arr持って想像:

IDFT(DFT(arr)*DFT(kern))

しかしDFT(arr)があります長さが1024の配列とDFT(kern)は長さが8の配列です。したがって、それらはどのように乗算されますか?

+1

小さな信号(kern)を大きな信号のサイズにゼロパッドするだけで済みます。 –

+0

@PaulRありがとうございます。 – ACCurrent

答えて

3

DFTの畳み込みを行うには、DFTのサイズは少なくとも畳み込みの結果と同じくらい大きくなければなりません。つまり、カーネルサイズと入力サイズを加えたものです。それらを両方ともこのサイズにゼロパッドし、DFTとIDFTの両方に同じサイズを使用します。

あなたのカーネルが入力よりもはるかに小さい場合、は効率的でないことに注意してください。この(通常の)ケースでは、overlap-addまたはoverlap-saveメソッドを使用して入力を、カーネルとほぼ同じサイズのチャンクに分割できます。例えば

参照は、:https://www.youtube.com/watch?v=FPzZj30hPY4

これはまだ本当に小さなカーネル用効率的ではないです。あなたのカーネルが実際にわずか8サンプルの長さであるなら、あなたはこのようなものを気にするべきではありません。簡単な実装はより高速になります。

+0

2D畳み込みの場合は、その多くの行と列にゼロパッドを追加する必要があります。また、カーネルが大きな入力のサイズになるまで、なぜゼロパッドを使用できないのですか? – ACCurrent

+0

@ACCurrentはい、2Dの場合は、両方の寸法でパッドアウトする必要があります。オーバーラップ加算も2Dで行うことができます。畳み込みの出力はIDFTに収まる必要があり、出力サイズは入力サイズの合計であるため、入力サイズまで入力することはできません。 –

関連する問題