Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

27.02.2011, 15:29

Ok, ich hab das schnell mal ausprobiert: Medianfilter und anschließender Mittelwertfilter liefern ganz gute Ergebnisse (oberes Diagramm), die Fouriertransformation (nachdem die Daten Mittelwertfrei gemacht wurden) sieht auch vielversprechend aus.

Mastermind

unregistriert

12

27.02.2011, 15:35



Doch wie kann ich nun genau am geschicktesten die Wellenlänge bestimmen?

mfg F-Wölkchen


Fourier Trafo?! Wurde doch jetzt schon x mal gesagt.

13

27.02.2011, 15:37

Das sieht in der Tat sehr gut aus! Was kann man jetzt genau in dem unteren Diagramm ablesen?
Wie kann man daraus die Wellenlänge ablesen?

mfg F-Wölkchen

EDIT:

Zitat

Fourier Trafo?! Wurde doch jetzt schon x mal gesagt.
Das ist mir durchaus klar. Doch ich kann mir unter Furier Trafo nichts vorstellen. Man kann wohl mit ihr das Frequenzspektrum bestimmen... doch wie das genau funktionieren soll... zu hoch für mich.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

27.02.2011, 15:44

Das untere Diagramm ist der Betrag der FFT des mittelwertbefreiten Datensatzes. Im Anhang nochmal eine Version wo mans besser sieht. Deine Wellenlänge (Frequenz) kannst du im Prinzip direkt aus dem Diagramm ablesen, die Maxima dürften die Werte sein die du suchst...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

27.02.2011, 15:54

Zitat

Fourier Trafo?! Wurde doch jetzt schon x mal gesagt.
Das ist mir durchaus klar. Doch ich kann mir unter Furier Trafo nichts vorstellen. Man kann wohl mit ihr das Frequenzspektrum bestimmen... doch wie das genau funktionieren soll... zu hoch für mich.

Naja, also ich würds mit der FFT rechnen aber wenn dir das zu hoch ist kannst du dir auch was andres überlegen. Beispielweise könntest du die Daten eben wie beschrieben mit Median und anschließendem Mittelwert filtern und dann über finite Differenzen die "Ableitung" davon bilden. Dann suchst du dir die Nullstellen dieser Ableitung und bekommst somit die Positionen deiner Extremwerte und daraus die Wellenlänge...

16

27.02.2011, 16:40

Zitat

Fourier Trafo?! Wurde doch jetzt schon x mal gesagt.
Das ist mir durchaus klar. Doch ich kann mir unter Furier Trafo nichts vorstellen. Man kann wohl mit ihr das Frequenzspektrum bestimmen... doch wie das genau funktionieren soll... zu hoch für mich.

Naja, also ich würds mit der FFT rechnen aber wenn dir das zu hoch ist kannst du dir auch was andres überlegen. Beispielweise könntest du die Daten eben wie beschrieben mit Median und anschließendem Mittelwert filtern und dann über finite Differenzen die "Ableitung" davon bilden. Dann suchst du dir die Nullstellen dieser Ableitung und bekommst somit die Positionen deiner Extremwerte und daraus die Wellenlänge...

Könntest du denn den Code zufäälig teilen? Vielleicht kann ich ihn ja nachvollziehen...
(Ich werde natürlich nicht wie Guttenberg das einfach übernehmen ;)).
Das mit der FFT zu machen wäre natürlich in meiner Facharbeit ein Knüller.

mfg F-Wölkchen

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

27.02.2011, 16:48

Ich hab das mit Matlab gemacht, Dinge wie FFT und so sind dort fix eingebaut, der Code schaut so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
L = length(y);

N = 10;

bla = zeros(1,L);
for i = 1:L
    bla(i) = median(y(min(max((i-N):(i+N),1), L)));
end

bli = zeros(1,L);
for i = 1:L
    bli(i) = mean(bla(min(max((i-N):(i+N),1), L)));
end

figure;
subplot(2,1,1);
hold on;
plot(y,'g');
plot(bli,'b');
legend('original', 'median + mean');

subplot(2,1,2);
f = abs(fft(y-mean(y)));
plot(f(1:(length(f)/2+1)));
axis([0 length(f)/2+1 0 1.2 * max(f)]);


Es gibt aber genügend Libraries die dir eine Fouriertransformation rechnen können, tbh würds mich eigentlich wundern wenn OpenCV das nicht eh auch schon mitbringt...

EDIT: Bingo!

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (27.02.2011, 17:07)


xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

18

27.02.2011, 17:11

Zitat

Fourier Trafo?! Wurde doch jetzt schon x mal gesagt.
Das ist mir durchaus klar. Doch ich kann mir unter Furier Trafo nichts vorstellen. Man kann wohl mit ihr das Frequenzspektrum bestimmen... doch wie das genau funktionieren soll... zu hoch für mich.

Naja, also ich würds mit der FFT rechnen aber wenn dir das zu hoch ist kannst du dir auch was andres überlegen. Beispielweise könntest du die Daten eben wie beschrieben mit Median und anschließendem Mittelwert filtern und dann über finite Differenzen die "Ableitung" davon bilden. Dann suchst du dir die Nullstellen dieser Ableitung und bekommst somit die Positionen deiner Extremwerte und daraus die Wellenlänge...

Könntest du denn den Code zufäälig teilen? Vielleicht kann ich ihn ja nachvollziehen...
(Ich werde natürlich nicht wie Guttenberg das einfach übernehmen ;)).
Das mit der FFT zu machen wäre natürlich in meiner Facharbeit ein Knüller.

mfg F-Wölkchen

Ich denke auch dass du damit das beste Ergebnis erzielen wirst. Zumal die Sandbank ja nicht nur eine Wellenlänge hat sondern eine Überlagerung mehrerer Wellen is, daher kannst du in der FT sehr schön ablesen, ebenso wie die Wellenlänge die den größten Anteil ausmacht.

Zur Erklärung der Fouriertransformation. Man kann theoretisch jede Funktion als überlagerung vieler Wellen verschiedener Frequenz darstellen. Hast du eine perfekte Sinusfunktion der Frequenz f wirst du in der FFT nur einen Punkt vorfinden. Überlagerst du 2 Sinusfunktionen hast du 2 Punkte in der FFT usw. D.h. die FFT zeigt dir welche Frequenzen welchen Anteil an deiner Funktion haben. Das Maximum der FT ist dann bei der Wellenlänge/Frequenz die den größten Anteil an deiner Funktion hat und damit auch die Wellenlänge die du suchst.

PS: Der Canny Edge Detector hat echt super Ergebnisse geliefert! Tolles Projekt, ich wünschte ich hätte sowas interessantes in der Schule damals für die Facharbeit gemacht *g*

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »xardias« (27.02.2011, 17:19)


19

27.02.2011, 18:44

Zitat

Zur Erklärung der Fouriertransformation. Man kann theoretisch jede Funktion als überlagerung vieler Wellen verschiedener Frequenz darstellen. Hast du eine perfekte Sinusfunktion der Frequenz f wirst du in der FFT nur einen Punkt vorfinden. Überlagerst du 2 Sinusfunktionen hast du 2 Punkte in der FFT usw. D.h. die FFT zeigt dir welche Frequenzen welchen Anteil an deiner Funktion haben. Das Maximum der FT ist dann bei der Wellenlänge/Frequenz die den größten Anteil an deiner Funktion hat und damit auch die Wellenlänge die du suchst.
Ok. Soweit verstanden.

Zitat

tbh würds mich eigentlich wundern wenn OpenCV das nicht eh auch schon mitbringt...

EDIT: Bingo!
Das OpenCV das hat ist natürlich genial. Doch ich bekomme es nicht zum laufen. Soweit ich verstanden habe verlangt die Funktion zwei Parameter. Einmal eine Matrix als Input und einmal als Output.
In die Input-Matrix packe ich einfach alle meine Y-Werte der Sandwelle und als Output bekomme ich dann die Frequenzanteile (?).
Doch wie müssen die Daten in die Matrix eingegeben werden und was kommt dann genau wieder zurück?

Kennt sich jemand zufällig ein bisschen mit OpenCV aus?

mfg F-Wölkchen

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

20

27.02.2011, 19:05

Du willst in diesem Fall keine 2D FT sondern nur 1D. Folglich sind die Matrizen auch nur Vektoren, d.h. 1xN oder Nx1 Matrizen.

Als Eingabe brauchst du ein Vektor mit allen Funktionswerten, d.h. die Höhe der Pixel für jede x-position in deinem Bild. Als ausgabe solltest du einen Vektor mit dem Spektrum bekommen. Ich hab mit der Bibliothek nie gearbeitet, daher kann ich da nur raten ;) Sieht jedoch recht ähnlich zu Matlab aus.

Werbeanzeige