Ich weiß allgemein, FFT and multiplication
ist normalerweise schneller als direkte convolve
Operation, wenn das Array relativ groß ist. Allerdings falte ich ein sehr langes Signal (sagen wir 10 Millionen Punkte) mit einer sehr kurzen Antwort (sagen wir 1 tausend Punkte). In diesem Fall scheint fftconvolve
wenig sinnvoll zu sein, da es eine FFT des zweiten Arrays auf die gleiche Größe wie das erste Array zwingt. Ist es in diesem Fall schneller, direkt zu falten?
Sieh dir den Vergleich an, den ich hier gemacht habe:
Ihr Fall könnte sich in der Nähe des Übergangs zwischen der Verwendung einer einfachen Faltung und der Verwendung der FFT-basierten Faltung befinden. Daher ist Ihre beste Wette (wie von @Dougal in einem Kommentar vorgeschlagen), die Zeit selbst zu bestimmen.
(Beachten Sie, dass ich in diesem Vergleich keine Überlappungsaddition oder Überlappungsspeicherung durchgeführt habe.)
danke für deine Hilfe. Jetzt habe ich den Test selbst gemacht, ich habe Faltung mit 2 Arrays, Größe 2 ^ 20 und 2 ^ 4, und das ist das Ergebnis:
%Vor%So haben wir einen Gewinner, numpy Convolve ist viel schneller als die anderen. Ich weiß immer noch nicht warum.
Jetzt habe ich 2 längere Arrays, Größe von 2 ^ 22 und 2 ^ 10 versucht. Das Ergebnis ist:
%Vor%Der Unterschied wird nur größer.
Eine schnelle FFT-Faltung über die Überlappungsadditions- oder Überlappungssicherungsalgorithmen kann in einem begrenzten Speicher durchgeführt werden, indem eine FFT verwendet wird, die nur ein kleines Vielfaches (wie etwa 2X) größer als die Impulsantwort ist. Es bricht die lange FFT in richtig überlagerte kürzere, aber null-gepolsterte FFTs auf.
Sogar mit dem Überlappungs-Overhead wird O (NlogN) die M * N-Effizienz für genügend große N und M übertreffen.
Tags und Links python fft scipy convolution