2016-09-27 5 views
2

Wie kann ich die fft Zero-Padding auf eine bestimmte Länge in Julia berechnen? Natürlich kann ich an meinen Vektor Nullen anhängen, aber das erscheint peinlich.Zero-padded FFT in Julia

Ich kann nichts darüber in den Dokumenten finden, noch Aufruf methods(fft) scheinen alle relevanten Methoden Signaturen. Ich kann auch nichts Relevantes für plan_fft finden.

Antwort

2

Ich glaube nicht, dass es irgendwelche Schlüsselwortargumente gibt, um dies zu tun oder so etwas, wenn das das ist, was Sie gesucht haben?

Die Funktionen nextpow2() und nextprod() sind nützlich, um die Größe des Arrays zur Eingabe in fft() zu erhalten. Dann können Sie entweder ein Array von Nullen mit einer effizienteren Größe erstellen und diese mit Ihren Daten füllen. Oder Sie können den Unterschied zwischen der idealen Größe und Ihrer Array-Größe an Ihr Array anhängen (Ersteres ist besser, wenn Sie viele FFTs berechnen, dann können Sie das Input-Array wiederverwenden, indem Sie es jedes Mal neu füllen).

One-Liner von Kommentaren datpad = [dat; zeros(eltype(dat), nextprod(length(dat)) - length(dat)]

http://docs.julialang.org/en/release-0.5/stdlib/math/?highlight=fft#signal-processing Falls Sie überprüft haben, dass nicht schon aus!

+0

Es ist überraschend, da der Padding-Parameter in Matlab und Numpy sehr vorne und zentriert ist. Das manuelle Auffüllen ist in der REPL umständlich und weist zusätzlichen Speicher zu. Ich denke, meine eigene Wrapper-Methode, die Zero-Pads ist eine Lösung. – DNF

+0

Ja, wenn Sie oft in der REPL verwenden, dann ist das wahrscheinlich der Weg zu gehen. Sie können es in einer Zeile tun, obwohl 'datpad = [dat; Nullen (eltype (dat), nextprod (Länge (dat)) - Länge (dat)] ' –

0

Wenn ich mich nicht irre, verwendet Julia FFTW für FFT. Ich kann mich nicht daran erinnern, dass im FFTW-Handbuch etwas über automatisch gefüllte FFTs zu sehen ist, ohne die Eingabedaten zu manipulieren.

Wenn Sie nicht an Geschwindigkeit interessiert sind und nur FFT als Abkürzung für die diskrete Fourier-Transformation (DFT) verwenden, können Sie die DFT mit einer DFT-Funktion einer beliebigen Frequenz-Bin-Abtastung durchführen oder die Transformation einfach manuell ausführen. Es wird nicht länger eine O (N log N) -Operation sein, aber es vermeidet, den ursprünglichen Datenvektor manuell aufzufüllen, und Sie können die Abtastung der Transformation nach Bedarf spacen, z. Oversampling die Teile des Spektrums, das Sie interessiert sind oder die Teile auslassen, die Sie nicht interessieren.

beispielsweise f die DFT-Matrix, die Proben, die bei Frequenzen zu machen:

M = exp(-2im*pi * f/Fs * (0:N-1)') 

wo Fs der Vektor Abtastrate der Daten ist und N die Länge des Datenvektor ist. f ist auch ein Vektor von Häufigkeitswerten. Übernehmen mit Matrixmultiplikation:

Wenn die DFT-Matrix zu groß wird, wenden Sie einfach jede Zeile davon in einer Schleife an.