2016-04-07 21 views
0

Ich möchte FFT (1D) mit Matlab-Arrays implementieren. Upon googling I came across this code. Dies scheint jedoch ein alter Code zu sein, der im Jahr 2007 geschrieben wurde und Matlab 2012 verwendet.Benötigen Sie Hilfe beim Ausführen dieses alten Matlab-Codes

Ich habe Fehler wie "Index überschreitet Matrix Abmessungen". Könnte jemand Änderungen am Code vornehmen, damit ich ihn auf meinem Computer ausführen kann?

PS: Ich weiß Matlab hat eine eingebaute FFT-Routine. Jedoch möchte ich es mit Matlab-Arrays implementieren, da ich diesen Code für einen anderen Zweck in der Zukunft verwenden werde. Auch ich brauche das fft, um für Arrays der Größe 44k zu arbeiten, so dass die grundlegende DFT-Implementierung dann nicht funktionieren wird.

+0

der Code sieht kompatibel, welche Zeile Sie den Fehler zu bekommen? – GameOfThrows

+0

u = Y (:, 1: N2); gibt mir index übersteigt Matrix Dimensionen. Ich habe Eingabe mit Nullen aufgefüllt, um es aus der Form 2^N – pyronic

Antwort

2

Das Problem mit dem Code ist in Zeile 3:

p=ceil(l) 

Der Code Ihr Eingangssignal nimmt mit der Länge in Potenzen von 2 (d.h. 4096 Abtastungen oder 9192 zum Beispiel) zu sein. p hier wird eine Matrix größer als Ihre Eingabe erstellen, wenn Sie Zahlen verwenden weniger als Potenz von 2

Es gibt 2 mögliche Korrekturen:

1, Pad Sie Ihre Eingabe mit zusätzlichen Nullen mit padarray, bis er das erreicht nächste Potenz 2.

2, ändern Sie die ceil in floor, um die ausgewerteten Daten zu reduzieren. Dies bedeutet jedoch, dass nur ein Teil Ihrer Eingabe ausgewertet wird.

Wenn Sie Methode 1 gehen wollen, hier ist das, was Sie tun müssen:

Änderung der Funktion dazu:

size=length(input); 
l=log2(size); 
p=ceil(l); 
input(2^p) = 0; 
Y=input'; %//NOTE HERE!!!!! the `'` is used if your data is a COLUMN vector, if it is a ROW VECTOR remove this `'` 
N = 2^p; 
N2=N/2; 
YY = -pi*sqrt(-1)/N2; 
WW = exp(YY); 
JJ = 0 : N2-1; 
W=WW.^JJ; 
for L = 1 : p-1 
    u=Y(:,1:N2); 
    v=Y(:,N2+1:N); 
    t=u+v; 
    S=W.*(u-v); 
    Y=[t ; S]; 
    U=W(:,1:2:N2); 
    W=[U ;U]; 
    N=N2; 
    N2=N2/2; 
end; 
u=Y(:,1); 
v=Y(:,2); 
Y=[u+v;u-v]; 
Y 
+0

Danke für den Vorsprung zu machen. Ich habe Padding Probleme mit der folgenden Codezeile behoben - Y (N) = 0; aber u = Y (:, 1: N2); gibt mir Index übersteigt Matrix dimensions.error – pyronic

+0

Wieder ist dieser Fehler wegen genau das, was ich sagte, setzen Sie Ihre Eingabegröße (d. h "y") auf eine beliebige Potenz von 2 und der ursprüngliche Code wird funktionieren. (zumindest habe ich keine Fehler). Sie müssen Ihre Eingabe mit Nullen auffüllen und nicht den Funktionsteil berühren - fügen Sie eine Zeile vor Zeile 1 der Funktion hinzu, um die Eingabe mit Nullen zu füllen, so dass sie eine Potenzstärke von 2 erreicht. – GameOfThrows

+0

@pyronic siehe mein Bearbeiten, ändern die Funktion dazu und es sollte für jede Größe Eingabe gut funktionieren. Wo der Eingabevektor ein Spaltenvektor ist (NICHT REIHENVEKTOR) – GameOfThrows

Verwandte Themen