8

まず、ここにコードを投稿しなかったことをお詫びします。どういうわけか、私がこのページに持っていたコードを入力しようとすると、すべてのコードが台無しになりました。おそらく、投稿するには多すぎて受け入れられませんでした。これが私のコードです:http://pastebin.com/bmMRehbd

言われていることから、このコードから良い結果が得られない理由は、オーバーラップ加算を使用していないためです。オーバーラップ加算を使用する必要がある理由について、インターネット上のいくつかのソースを読み込もうとしましたが、理解できません。実際のフィルターが機能し、指定されたカットオフを超えるものが発生すると、実際にカットオフが発生するようです。

これはvst2-sdkで機能するように作成されたコードです。

誰かがそれを追加する必要がある理由と、指定されたコードにオーバーラップ加算コードを実装する方法を教えてもらえますか?

また、アルゴリズムと数学に関しては、私はかなり愚かです。私は自分がしていることを視覚的に把握する必要がある人の一人です。それまたはコードで説明されているものを取得する:)そして私は実際の重複を意味します。

Overlad add理論: http: //en.wikipedia.org/wiki/Overlap%E2%80%93add_method

あなたが与えることができるすべての助けをありがとう!

4

4 に答える 4

4

各fftバッファーの境界を処理するには、overlap-addメソッドが必要です。問題は、FFTドメインでの乗算により、時間ドメインで巡回畳み込みが発生することです。これは、IFFTを実行した後、フレームの最後の結果がラップアラウンドし、フレームの最初の出力サンプルが破損することを意味します。

このように考える方が簡単かもしれません。長さのフィルターがあるとしますN。このフィルターとM入力サンプルの線形畳み込みは、実際にはM+N-1出力サンプルを返します。ただし、FFTドメインで行われる巡回畳み込みは、同じ数の入力サンプルと出力サンプルになりますM。線形畳み込みからの余分なN-1サンプルが「ラップ」され、最初のN-1出力サンプルが破損しています。

次に例を示します(matlabまたはoctave):

a = [1,2,3,4,5,6];
b = [1,2,1];
conv(a,b)  %linear convolution

    1    4    8   12   16   20   17    6

ifft(fft(a,6).*fft(b,6))  %circular convolution

    18   10    8   12   16   20

最後の2つのサンプルがラップアラウンドされ、円形の場合の最初の2つのサンプルに追加されていることに注意してください。

オーバーラップ加算/オーバーラップ保存メソッドは、基本的にこのラップアラウンドを処理するメソッドです。巡回畳み込みは、入力サンプルの数よりも破損していない出力サンプルを返すため、FFTバッファーのオーバーラップが必要です。

于 2012-04-04T18:08:19.653 に答える
4

2 つの入力信号の離散フーリエ変換の積の逆離散フーリエ変換を使用して (有限インパルス応答フィルターを使用して) 畳み込みを実行すると、実際には循環畳み込みが実装されます。これを「周波数領域で計算された畳み込み」と呼びます。(循環畳み込みとは何かがわからない場合は、このリンクを参照してください。これは基本的に、ドメインが循環していると想定する畳み込みです。つまり、信号を側面からシフトすると、信号が反対側に「ラップアラウンド」します。ドメイン。)

一般に、計算効率が高いため、大きな信号には高速フーリエ変換を使用して畳み込みを実行します。

オーバーラップ加算 (およびそのいとこであるオーバーラップ保存) は、周波数領域で行われる畳み込みが実際には循環畳み込みであるという事実を回避する方法ですが、実際には循環畳み込みを行うことはめったになく、通常はむしろ線形畳み込みを行います。

オーバーラップ加算は、入力信号のチャンクを「ゼロ パディング」してから、(周波数領域で行われた) 循環畳み込みの一部を適切に使用することによってそれを行います。重複保存は、線形畳み込みに対応する信号の部分のみを保持し、循環シフトによって「破損」した部分を投げることによってそれを行います。

両方の方法について、ウィキペディアからの 2 つのリンクを次に示します。

Overlap-add : これには、何が起こっているかを説明する素晴らしい図があります。

オーバーラップセーブ

Orfanidis によるこの本は、それをよく説明しています。セクション 9.9.2 を参照してください。これは信号処理の「事実上の」標準ではありませんが、非常によく書かれており、他の本よりも優れた入門書だと思います。

于 2012-04-04T17:53:49.273 に答える
0

まず、時間領域での畳み込みは周波数領域での乗算に相当することを理解してください。畳み込みでは、おおよそ O(n*m) になります。ここで、n は FIR の長さ、m はフィルター処理されるサンプルの数です。周波数領域では、FFT を使用して O(n * log n) を実行しています。n が十分に大きい場合、フィルタリングのコストは、周波数ドメインで実行する場合に大幅に少なくなります。ただし、n が比較的小さい場合、時間領域でのフィルタリングがより簡単になる点までメリットが減少します。このブレークポイントは主観的なものですが、50 から 100 の数字が、切り替える可能性のあるポイントです。

于 2012-04-04T17:54:22.960 に答える
0

はい、周波数応答を変更するという点で、畳み込みフィルターは「機能」します。しかし、周波数ドメインでのこの乗算は、一方の端でもう一方の端からのデータで時間ドメイン データを汚染することもあり、その逆も同様です。オーバーラップの追加/保存は、FFT サイズを拡張し、「汚染された」端を切り取ってから、その端のデータを使用して後続の FFT ウィンドウの始まりを修正します。

于 2012-04-04T18:07:10.247 に答える