Schnellste Methode zur Berechnung der Faltung

8

Weiß jemand die schnellste Methode zur Berechnung der Faltung? Leider ist die Matrix, mit der ich mich beschäftige, sehr groß (500x500x200) und wenn ich convn in MATLAB verwende, dauert es sehr lange (ich muss diese Berechnung in einer verschachtelten Schleife durchlaufen). Also habe ich Faltung mit FFT verwendet und es ist jetzt schneller. Aber ich suche immer noch nach einer schnelleren Methode. Irgendeine Idee?

    
Nicole 12.12.2013, 21:30
quelle

3 Antworten

14

Wenn Ihr Kernel trennbar ist, werden die größten Geschwindigkeitsgewinne durch die Ausführung mehrerer sequentieller 1D-Faltungen erzielt.

Steve Eddins von MathWorks beschreibt, wie man die Assoziativität von Faltung zur Beschleunigung der Faltung nutzt, wenn der Kernel in einem MATLAB-Kontext auf sein Blog . Für einen P-by-Q -Kernel beträgt der rechentechnische Vorteil der Ausführung von zwei separaten und sequentiellen Faltungen gegenüber der 2D-Faltung PQ/(P+Q) , was 4,5x für einen 9x9-Kernel und ~ 11x für einen 15x15-Kernel entspricht. BEARBEITEN : Eine interessante, unbewusste Demonstration dieses Unterschieds wurde in this Q & A .

Um herauszufinden, ob der Kernel separierbar ist (dh das äußere Produkt von zwei Vektoren), blog beschreibt weiter , wie man überprüft, ob der Kernel mit SVD trennbar ist und wie man die 1D-Kernel bekommt. Ihr Beispiel ist für einen 2D-Kernel. Eine Lösung für N-dimensionale Separable Faltung finden Sie diese FEX-Einreichung .

Eine weitere erwähnenswerte Ressource ist diese SIMD ( SSE3 / SSE4) Implementierung von 3D Convolution von Intel , die beide source und eine Präsentation . Der Code ist für 16-Bit-Ganzzahlen. Wenn Sie nicht zur GPU wechseln (z. B. cuFFT ), ist es wahrscheinlich schwierig, schneller zu werden als Intels Implementierungen, zu denen auch Intel MKL . Es gibt ein Beispiel für eine 3D-Faltung (Float mit einfacher Genauigkeit) am Ende von dieser Seite der MKL-Dokumentation (Link behoben, jetzt in Ссылка gespiegelt).

    
chappjc 12.12.2013, 23:01
quelle
1

Sie könnten die Overlap-Add- und Overlap-Save-Methoden ausprobieren. Sie müssen Ihr Eingangssignal in kleinere Stücke zerlegen und dann eine der oben genannten Methoden anwenden.

Eine FFT ist höchstwahrscheinlich - und ich könnte mich irren - die schnellste Methode, besonders wenn Sie eingebaute Routinen in MATLAB oder eine Bibliothek in C ++ verwenden. Abgesehen davon sollte es sinnvoll sein, das Eingangssignal in kleinere Stücke zu zerlegen.

    
Sriram 12.12.2013 21:34
quelle
0

Ich habe 2 Möglichkeiten, um schnell zu berechnen

und 2 besser als 1

1 Gürteltier Sie können die Armadillo-Bibliothek zum Konvertieren von Conv mit diesem Code verwenden

%Vor%

2-used fftw ans sigpack und armadillo library zum calcieren schneller conv auf diese weise müssen sie inft fft ihres codes in constructor

%Vor%     
javad 18.10.2017 06:38
quelle