Schnellste Methode für die Berechnung der Faltung
Jeder weiß, über die Schnellste Methode für die Berechnung der Faltung? Leider ist die matrix, die ich zu tun habe, ist sehr groß (500x500x200) und wenn ich convn
in MATLAB, es dauert eine lange Zeit (ich wiederhole diese Berechnung in einer verschachtelten Schleife). So, ich verwendet Faltung mit FFT und es ist jetzt schneller. Aber, ich bin noch auf der Suche nach einer schnelleren Methode. Irgendeine Idee?
- CUFFT ist ziemlich gut, aber möglicherweise nicht in der Lage zu tun, eine matrix, die nicht Potenz von 2 ausgerichtet. Auch müssen Sie die hardware und ein bisschen wissen, was Sie tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn dein kernel ist teilbar, die größte Geschwindigkeit, die Gewinne werden realisiert durch die Durchführung mehrerer sequenzieller 1D-Faltungen.
Steve Eddins von MathWorks beschreibt, wie man den Vorteil der Assoziativität der Faltung zu beschleunigen, convolution, wenn der kernel ist teilbar in eine MATLAB-Kontext auf in seinem blog. Für eine
P-by-Q
kernel, der rechnerische Vorteil, die mindestens zwei separate und sequentielle Faltung vs. 2D-Faltung istPQ/(P+Q)
, das entspricht 4,5 x für einen kernel der Größe 9x9 und ~11x für ein 15x15 kernel. BEARBEITEN: Eine interessante geplante demonstration dieser Unterschied war in dieses Q&A.Herauszufinden, ob der kernel ist teilbar (d.h. das äußere Produkt zweier Vektoren) der blog geht zu beschreiben, wie Sie überprüfen, ob Ihr kernel ist trennbar mit SVD und wie bekommt man die 1D Kernel. Ihr Beispiel ist für ein 2D-kernel. Eine Lösung für N-dimensionale separierbare Faltung, überprüfen dieser FEX Vorlage.
Andere Ressource hinzuweisen ist diese SIMD (SSE3/SSE4) Umsetzung von 3D-Faltung von Intel, die sowohl Quelle und ein Präsentation. Der code für 16-bit-Integer. Es sei denn, Sie bewegen sich auf GPU (z.B. cuFFT), ist es wahrscheinlich schwer zu bekommen, schneller als der Intel-Implementierungen, die auch Intel MKL. Es ist ein Beispiel von 3D-Faltung (single-precision-float) an der Unterseite der diese Seite von der MKL Dokumentation (link repariert, jetzt gespiegelt in https://stackoverflow.com/a/27074295/2778484).
imfilter
tatsächlich tut dies implizit. Es dauert ein 2d-array für den kernel, aber wird überprüfen, um zu sehen, wenn es separierbar ist, bevor Sie den filter anwenden. Auch, wie bereits erwähnt, wenn Sie dabei kreisförmige Windungen FFT wird schnell als gut.imfilter
ist schneller, wenn in einer Schleife aufgerufen, wenn Sie versuchen, Sie zu filter einen Stapel von 2D-Bildern mit jeweils dem gleichen 2D-kernel anstatt es im Stapel der Bilder, obwohl es unterstützt, das zu tun. Wenn er erkennt, 3D-Daten, erklärt er den kernel nicht trennbar, auch wenn die 2D-kernel ist teilbar (feature oder bug?).Könnten Sie versuchen, die overlap-add und overlap-save-Verfahren. Sie beinhalten das Aufbrechen Ihrer input-signal in kleinere Stücke und dann mit den oben genannten Methoden.
Einer FFT ist wahrscheinlich - und ich könnte falsch sein - die Schnellste Methode, vor allem wenn Sie mit built-in-Routinen in MATLAB oder einer library in C++. Abgesehen davon, breaking the input signal in kleinere Stücke sollte eine gute Wette.
fftfilt
sollte in der Lage sein zu tun, die schweres heben für Sie. mathworks.de/de/help/signal/ref/fftfilt.htmlhabe ich 2 Weg zu calc fastconv
und 2 betther als 1
1 - armadillo
Sie können armadillo-Bibliothek für calcing conv mit diesem code
2-fftw ans sigpack und armadillo-Bibliothek für calcing schnell conv auf diese Weise müssen Sie die init-fft des Codes im Konstruktor