WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Problem bei eigener FFT-Programmierung

 

domi1993
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 17:15     Titel: Problem bei eigener FFT-Programmierung
  Antworten mit Zitat      
Hallo, ich habe als Aufgabe für meine Facharbeit die Aufgabe bekommen eine eigene FFT (Fast-Fourier-Transformation) zu programmieren und habe anhand eines Pseudcode den Code für Scilab entwickelt.
Code:
% Mein Versuch
N=16;
x=0:1/N:N-(1/N);
y=sin(x*2*%pi)+cos(x*2*%pi);
n=N^2;

function Y=ffte(a,b)
if a==1 then
return(b);
else
for k=1:1:a/2
g(k)=b(2*k-1);
u(k)=b(2*k);
G=ffte(a/2,g);
U=ffte(a/2,u);
Y(k)=G(k)+U(k)*%e^(-2*%pi*%i*k/a);
Y(k+n/2)=G(k)-U(k)*%e^(-2*%pi*%i*k/a);
end
end
endfunction

Die Variable a ist hierbei die Anzahl der Einträge in der Liste/Array b.
Der oberste Teil ist hierbei zur künstlichen Erzeugung der Messwerte und beim ausprobieren gebe ich dann:
ffte(h,y)
Und bekomme dann immer als Fehlermeldung
!--error 21
ungültiger Index.

at line 7 of function ffte called by :
at line 8 of function ffte called by :
ffte(n,y)

Hat jemand eine Idee woran der Fehler liegt?
Hab schon ein paar Sachen versucht, freue mich um jede Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen


Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 18:03     Titel:
  Antworten mit Zitat      
Hallo,
so wie der Code da sethe kann meine Interpreter den ausführen. Aber warum versuchst du in der Funktion, die Funktion selbst aufzurufen? Und vor allem Woher bekommt man die Variable Y?
Grüße
Kevin
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
domi1993
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 18:16     Titel:
  Antworten mit Zitat      
Selber aufrufen muss sich die Funktion aufgrund der Algorithmusses der FFT, hier ein kleiner Pseude-Code damit ihr wisst was ich meine.
http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation unter Implementierung als rekursiver Algorithmus.
Y soll dann das Fouriertransformierte Ergebniss als Array/Liste sein.
Der Code funktioniert auch wenn man ihn eingibt, nur wenn man die dadurch definierte Funktion dann verwendet, kommt es bei mir immer zu der oben genannen Fehlermeldung.

Achja falls jemand vlt. irgendwann meint das es die fft doch auch vorgefertigt gibt, das weiß ich auch muss aber leider sleber eine Programmieren um damit Messungen durch zu führen.
Deshalb auch mein Funktionsname ffte , da ich fft nicht überschreiben konnte/wollte.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.08.2011, 19:16     Titel:
  Antworten mit Zitat      
Das hier ist meiner Meinung nach ein Problem...

Code:
g(k)=b(2*k-1);


Wenn k = 1 ist greifst du dann auf b(0) zu und das geht nicht Wink

Allerdings ist auch die Berechnung mit dem Teil der e-Funktion so nicht richtig.

Code:
e^(-2*%pi*%i*k/a)


Hier ist ja auch das k drin...es hat schon seinen Grund, warum in dem Code das k bei 0 und nicht bei 1 beginnt. In Matlab ist der erste Index aber immer 1 weshalb man das k dort immer erhöhen oder bei der e-Funktion um 1 verringern muss.

Zuletzt bearbeitet von DSP am 18.08.2011, 19:23, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 19:20     Titel:
  Antworten mit Zitat      
Hi,
ich mag einfach keine Rekirsionen, aber egal. Wenn der Fall auftritt, dass G oder U weniger als (a/2) Elemente haben, weil was schief läuft, dann ist G(k) und U(k) nicht mehr möglich für große k. Und dass ist dann ein "invalid index". Den wirklichen Fehler behaupte ich, wirst du nur schwerlich finden, da du ja nicht weißt bei welchem Rekursionsschritt er auftritt.
Gruß
Kevin
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
domi1993
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 19:27     Titel:
  Antworten mit Zitat      
Viele Dank schonmal hab eure Vorschläge mit eingebunden alle glaub ich allerding kommt immernoch genau die selbe Fehlermeldung :
-->ffte(n,y)
!--error 21
ungültiger Index.

at line 7 of function ffte called by :
at line 8 of function ffte called by :
ffte(n,y)

Also liegt der Fehler an den Variablen, allerding weiß ich da nicht wo, da ja wieder wie zu beginn für a ein Skalar und für b ein Vektor/Array, also weiß ich nicht warum Scilab immer Ungüliger Index bei Zeile 7/8 anzeigt. Den Ungültiger Index Fehler kenne ich sonst nur wenn ich z.B. g(0) aufrufen will (den Fehler habe ich behoben
Code:
g(k)=b((2*k)-1)


Gesammter geänderter Code
Code:
N=2;
x=0:1/N:N-(1/N);
y=sin(x*2*%pi)+cos(x*2*%pi);
n=N^2;

function Y=ffte(a,b)
if a==1 then
return(b);
else
for k=1:1:a/2
g(k)=b((2*k)-1);
u(k)=b(2*k);
G=ffte(a/2,g);
U=ffte(a/2,u);
Y(k)=G(k)+U(k)*%e^(-2*%pi*%i*(k-1)/a);
Y(k+n/2)=G(k)-U(k)*%e^(-2*%pi*%i*(k-1)/a);
end
end
endfunction
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 19:32     Titel:
  Antworten mit Zitat      
Gib mal in die Konsole ein:
-->a=[1,2,3]
a =
1. 2. 3.
-->a(4)
und dann guck dir die Fehlermeldung ein, dann hast du auch die Fehlermeldung!

Der Fehler weist eindeutig auf eine Adresse und nicht auf eine Variable hin.

Die Klammer bei 2*k-1 (2*k)-1 ist überflüssig. Punkt vor Strich kennt der Code.
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
domi1993
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 19:38     Titel:
  Antworten mit Zitat      
Ja Kevin das ist mir schon bewusst.
Die Sache die ich an der Sache momentan nicht verstehe ist das der Fehler beim rekursiven Aufrufen der Funktion auftritt. Denn es gibt ja bei der Funktion eigentlich keinen x-ten Eintrag der den Ramen sprengen könnte, sonders es handelt sich a dann um die Variablen der Version und nicht mal um Indizes.
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 12:15     Titel:
  Antworten mit Zitat      
Dein letzter Satz widerspricht der Fehlermeldung.

Aber machs dochmal ganz einfach und gib alle Zwischenergebnisse in die Konsole aus, dann siehste gleich, wo der Schuh klemmt.
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
domi1993
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 12:33     Titel:
  Antworten mit Zitat      
Zwischenergebnisse bekomme ich auch gar keine es kommt immer direkt die ungültiger Index Fehlermeldung in den Zeilen 7,8, also wenn ich mich nicht verzählt habe (Very Happy) in den Zeilen in denen die Funktion ffte wieder neu aufgerufen wird mit a/2 und den in den Zeilen davor erhaltenen Vektoren.

Mein Problem bei dieser Fehlermeldung ist das ich den Fehler ungültiger Index nur von dem aufrufen einer nicht-existenten Stelle eine Matrix/Vektors kenne, aber nicht beim aufrufen von Funktionen, meine einzge Erklärung wäre eine Art Definitionslücke, allerdings würde ich da nicht verstehen woher diese kommt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 12:45     Titel:
  Antworten mit Zitat      
Du kannst auch nur Zwischenergebnisse aus einer Funktion bekommen, wenn du da aktiv nachhilfst. Schreib doch einfach mal hinter jede Zeile:
printf(zeilennummer\n);//zeilennummer ist ein string
Dann kannst du zumindest den Ort lokalisieren, denn die Angabe der Zeile in der Fehlermeldung ist mir immernoch ein Rätsel.
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
Kevin
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 18.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 13:16     Titel:
  Antworten mit Zitat      
Juhuu, Fehler gefunden:
Es ist eine Adressverletzung!

1. Schleife läuft (noch keine Rekursion)
g(2*k-1)==g(1)==b(1) --> nur das erste Element in g exisitiert.
u(2*k)==u(2)==b(2) --> nur das erste Element in u exisitiert.
2. Rekursion durch G=ffte(a/2,g)
g(2*k-1)==b(1) --> nur das erste Element in g exisitiert.
u(2*k)==b(2) -->! Problem: du hast g eingesetzt und g enthält nur ein Element, also wird bei b(2) auf g(2) zugegriffen, und das ist die Adressverletzung.
_________________

1000 Buchstaben? Warum nur 6?
Private Nachricht senden Benutzer-Profile anzeigen
 
domi 1993

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 17:17     Titel:
  Antworten mit Zitat      
Jaaaa, jetzt funktioniert, glaub ich viiiiiiielen Dank Kevin.
Habs mit nem kleinen Trick umgangen das dieser Fehler auftritt.
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.