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?
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
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.
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%Tags und Links c++ matlab signal-processing convolution template-matching