landau - DGZfP
Transcription
landau - DGZfP
ZfP-Sonderpreis der DGZfP beim Regionalwettbewerb Jugend forscht LANDAU Geschwindigkeitsmessung mittels akustischem Dopplereffekt David Wander Schule: Gymnasium im Alfred-Grosser-Schulzentrum Bad Bergzabern Jugend forscht 2013 Der Dopplereffekt KURZFASSUNG Kurzfassung Ziel der vorliegenden Arbeit ist es, ein vollautomatisches Messsystem zu entwickeln, welches anhand der Geräusche eines vorbeifahrenden Messobjektes dessen Geschwindigkeit bestimmt. Eine solche passive Messmethode wäre zum Beispiel für die Verkehrskontrolle von enormem Vorteil, da Anlagen dieser Art von Verkehrsteilnehmern nicht detektierbar sind. Zuerst wird der dazu verwendete Dopplereffekt theoretisch erklärt und die aus der Literatur bekannte Formel weiterentwickelt. Nähert sich ein Sender dem Beobachter, so hat ein später ausgestendeter Ton einen kürzeren Weg zurückzulegen, als der vorhergehende. Dadurch verkürzt sich die Wellenlänge, die Frequenz steigt also. Der Beobachter nimmt einen höheren Ton wahr. Entfernt sich der Sender, wird der Weg länger, die Wellenlänge steigt und der wahrgenommene Ton wird tiefer. Durch die allgemein gehaltene Herleitung eröffnet sich die Möglichkeit, neben der Geschwindigkeit, auch den Abstand des Messobjektes beim Passieren des Messgerätes zu ermitteln. Anschließend wird ein Versuch unter kontrollierten Bedingungen durchgeführt und manuell ausgewertet, um erste Erfahrungen zur Messmethode und eventuellen Problemen zu sammeln und die Theorie praktisch zu bestätigen. Bei diesem Experiment wurde ein mobiler Lautsprecher, der dauerhaft einen Ton von 5500Hz aussandte, an einem Fahrrad befestigt. Dieses wurde mit möglichst konstanter Geschwindigkeit entlang einer Geraden an einem Mikrofon vorbeigefahren. Die damit aufgenommenen Audiodateien wurden bei der Auswertung in 0, 25s-Intervalle aufgeteilt und im Anschluss eine FFT angewendet, um die Frequenz der maximalen Amplitude zu bestimmen. In einem letzten Schritt wurden diese Frequenzen in einem Diagramm aufgetragen und mit der theoretisch berechneten Kurve verglichen. Bei diesen Versuchen, die mit verschiedenen Geschwindigkeiten und Abständen durchgeführt wurden, konnten trotz des einfachen Aufbaus sehr gute Ergebnisse erzielt werden, die mit der Theorie im Einklang stehen. Aufbauend auf diesen ersten Erfahrungen, wurde eine Automatisierung der Auswertung angestrebt. Zur Realisierung wurde ein C++ Programm entwickelt, welches eigenständig die Daten des Mikrofons aufzeichnet und den oben erläuterten Analyseprozess durchführt. Als nächstes wurde dieses Programm mit den Aufnahmen des ersten Experimentes getestet. Das Resultat war dabei qualitativ mit der manuellen Analyse gleichwertig. Darüber hinaus, konnte die Berechnungsdauer jedoch so weit reduziert werden, dass sie in Echtzeit abgeschlossen werden kann. Zum Schluss wurden andere, reale Messobjekte, wie Formel-1-Wagen, PkW, Motorräder und Modellflugzeuge getestet. Die Ergebnisse dabei fielen unterschiedlich aus. Während bei dem Modellflugzeug noch sehr gute Ergebnisse erzielt werden konnten, erschwerten die hohen Geschwindigkeiten bei dem Formel1-Wagen und dem Motorrad die automatische Analyse. Durch manuelles Eingreifen konnten jedoch auch hier plausible Resultate festgestellt werden. Einzig der PkW ließ keine sinnvollen Ergebnisse zu, da er im Gegensatz zu den anderen Testobjekten ein Rauschen auf vielen Frequenzen aussandte und damit die Vorraussetzungen des Versuchsaufbaus nicht erfüllte. Abschließend lässt sich feststellen, dass das Messsystem in dieser Form für den Einsatz im Straßenverkehr nicht mit ausreichender Zuverlässigkeit verwertbare Ergebnisse liefert. Unter kontrollierten Bedingungen arbeitet es jedoch sehr stabil und mit geringem Fehler. David Wander 2012 Der Dopplereffekt INHALTSVERZEICHNIS Inhaltsverzeichnis 1 Einleitung 1 2 Theorie 2.1 Wellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Dopplereffekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Die Schallgeschwindigkeit in Luft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 4 3 Bestätigungsversuch 3.1 Zielsetzung . . . . . . . . . . . 3.2 Aufbau . . . . . . . . . . . . . 3.2.1 Material . . . . . . . . . 3.2.2 Vorbereitungen . . . . . 3.3 Durchführung . . . . . . . . . . 3.4 Auswertung . . . . . . . . . . . 3.4.1 Das Auswerteverfahren 3.4.2 Ergebnisse . . . . . . . . 3.5 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 6 6 7 7 8 10 4 Automatische Geschwindigkeitsmessung 4.1 Das Auswerteprogramm . . . . . . . . . 4.2 Messergebnisse . . . . . . . . . . . . . . 4.2.1 Fahrrad mit Lautsprecher . . . . 4.2.2 Formel-1-Wagen . . . . . . . . . 4.2.3 Serienmäßiger PkW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 11 13 13 13 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Diskussion 15 A Bilder des Experimentes 17 B Fehlerrechnung B.1 Fehlerbetrachtung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 C Weitere getestete Messobjekte C.1 Modellflugzeug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C.2 Motorrad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 24 D Quellcode D.1 main.cpp . . . . . . D.2 AnalyseFunktionen.h D.3 AudioFunktionen.h . D.4 Einstellungen.h . . . D.5 GrafikFunktionen.h . D.6 Konstanten.h . . . . D.7 Menu.rc . . . . . . . 25 25 34 38 39 40 41 41 David Wander 2012 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Dopplereffekt 1 1. Einleitung Einleitung Jeder kennt es aus dem Alltag und selbst kleine Kinder können es schon nachahmen: Das Geräusch eines vorbeifahrenden (Renn-)Autos - genauer: die Änderung des Tones beim Vorbeifahren. Den Wenigsten ist aber bewusst, dass es sich dabei um den sogenannten Dopplereffekt handelt und wie dieser zustande kommt. Da der Dopplereffekt also in unserem Alltag ständig vorkommt und auch in der Technik seine Anwendung findet, lohnt es sich durchaus sich mit ihm zu beschäftigen. 1842 wurde er von Christian Doppler, einem österreichischen Physiker theoretisch vorrausgesagt und drei Jahre später von Christoph Buys-Ballot experimentell bestätigt. Doch wie entsteht der Dopplereffekt und wie kann er technisch genutzt werden? Dies wird im ersten Teil dieser Arbeit theoretisch erklärt. Die hergeleitete Theorie soll dann praktisch durch ein Experiment überprüft werden. Im zweiten Teil wird dieses Experiment aufgegriffen und ein Programm zur automatischen Analyse der Messwerte entwickelt. Somit entsteht ein fast vollautomatisch funktionierendes Geschwindigkeitsmessgerät. Dieses könnte zum Beispiel zur Verkehrskontrolle durch die Polizei verwendet werden. Der große Vorteil dabei wäre, dass dieses System nur mit den Geräuschen arbeitet, die jedes Auto von sich gibt. Es sendet also nicht wie herkömmliche Geschwindigkeitsmessgeräte elektromagnetischen Wellen oder Töne aus, anhand derer es bemerkt werden könnte. Folglich ist es für jede Art von Radarwarner oder ähnlichem unsichtbar. Damit gäbe es für Raser kein Entkommen mehr. [3] 2 2.1 Theorie Wellen Für das Verständnis des Dopplereffektes sind die Grundlagen der Wellenlehre unabdingbar. Dieses Unterkapitel führt daher kurz in die Wellenlehre ein und erklärt dabei einige Grundbegriffe, die später immer wieder verwendet werden. Eine Welle ist allgemein eine Schwingung oder Zustandsänderung, die sich mit einer endlichen Geschwindigkeit ausbreitet. Im allgemeinen Sprachgebrauch spricht man meist von Schallwellen in Luft, sie kommen aber auch in anderen Gasen, Flüssigkeiten und Feststoffen vor. Beim Erzeugen von Schallwellen bewegt sich meist eine Membran und regt dadurch die Moleküle der Luft zum Schwingen an. Durch diese Schwingung entstehen, wie bei allen Longitudinalwellen Verdünnungen und Verdichtungen, also Stellen niedrigeren und höheren Luftdrucks. Diese breiten sich dann, sofern sie nicht durch Hindernisse gestört werden, kugelförmig aus. Abbildung 1: Die Welle. Wie Abbildung 1 verdeutlicht besitzen Wellen eine bestimmte Frequenz f , die vom Sender festgelegt wird. Die Frequenz drückt aus, wie oft eine Welle pro Sekunde schwingt, also wie viele Phasendurchläufe sie in einer Sekunde absolviert. Wenn sich die Frequenz der Welle nicht ändert wiederholen sich die Elongationen(=Auslenkungen) in regelmäßigen Abständen. Den Abstand zwischen zwei benachbarten Punkten gleicher Phase nennt man die Wellenlänge λ, also z.B. den Abstand zwischen zwei benachbarten Wellenbergen. Die maximale Elongation einer Welle nennt man auch Amplitude A. Abbildung 1 sieht zwar aus, wie das Momentbild einer Transversalwelle, die eben erklärten begrifflichkeiten gelten aber sowohl für Transversal als auch für Longitudinalwellen. Wellen breiten sich in einem Medium immer mit einer konstanten, vom Träger abhängigen Geschwindigkeit c aus. Diese Geschwindigkeit lässt sich ermitteln, indem man die Wellenlänge λ einer Frequenz f David Wander 2012 1 Der Dopplereffekt 2.2 Dopplereffekt bestimmt. Aus allgemein v = s t folgt für c für den Abstand von zwei Wellenbergen: c= λ ∆s = ∆t T ist T die Zeit, die von einem Wellenberg zum nächsten vergeht, so gilt T = f1 . Somit erhält man für den Zusammenhang von c, f , und λ die Formel: c = λf (1) [1] [2] 2.2 Dopplereffekt Beim Dopplereffekt des Schalls sind grundsätzlich zwei Fälle zu unterscheiden: 1. der Sender bewegt sich und der Empfänger ruht 2. der Sender ruht und der Empfänger bewegt sich Für das in dieser Arbeit angestrebte Ziel eine Geschwindigkeitsmessung mittels Dopplereffekt zu realisieren ist jedoch bloß der erste Fall relevant, da sich ein Geschwindigkeitsmesser im Normalfall stationär am Straßenrand befindet. Aus Platzgründen wird deshalb nur diese Konstellation theoretisch erklärt. In den meisten Büchern wird nur der Spezialfall behandelt, in dem sich der Sender direkt auf den Empfänger zu bewegt, hier soll allerdings eine allgemeine Herleitung durchgeführt werden, da der Sender in der Praxis schließlich nicht durch den Beobachter hindurch fährt, sondern an ihm vorbei. Diese Situation mit bewegtem Sender und ruhendem Empfänger, ist die im Alltag wohl häufiger bemerkbare Konstellation. Jeder kennt sie aus dem Straßenverkehr: Das Martinshorn eines Krankenwagens hört sich höher an, solange er auf den Beobachter zufährt, beim Vorbeifahren wird der Ton dann plötzlich tiefer, obwohl das Horn immer die gleichen Töne aussendet. Dies liegt daran (wie Abbildung 2 verdeutlicht), dass der Krankenwagen zum Zeitpunkt t1 im Punkt Abbildung 2: bewegter Sender, ruhender Beobachter. M1 beispielsweise einen Wellenberg aussendet. Dieser breitet sich dann von diesem Punkt aus mit der Schallgeschwindigkeit c in alle Richtungen gleichförmig aus. Zum Zeitpunkt t2 im Punkt M2 startet der nächste Wellenberg, nun hat sich allerdings auch der Sender bewegt, somit verkürzt sich der Weg, den die Schallwellen vom Sender zu einem vor ihm liegenden Beobachter zurücklegen müssen. Da sich alle Wellen mit der konstanten Schallgeschwindigkeit c ausbreiten benötigt die Welle, die zum Zeitpunkt 2 ausgesendet wurde weniger Zeit als die zum Zeitpunkt 1 ausgesendete Welle, um beim Beobachter anzukommen. Da die Abstände zwischen den Wellenbergen also kürzer werden, nimmt der Beobachter eine höhere Frequenz wahr. Analog verhält es sich, wenn sich der Sender vom Empfänger wegbewegt. In diesem Fall muss der Wellenberg der zum Zeitpunkt 2 ausgesendet wurde einen längeren Weg zurücklegen, als der zum Zeitpunkt 1 ausgesandte. Somit hat Wellenberg 2 einen längeren Laufweg zum Beobachter und kommt daher später an, die Abstände zwischen den Wellenbergen werden also länger. Deshalb nimmt der Beobachter eine niedrigere Frequenz wahr. David Wander 2012 2 Der Dopplereffekt 2.2 Dopplereffekt Abbildung 3: Abstand Sender - Empfänger in Abhängigkeit von t. Bei einer geradlinigen, unbeschleunigten Bewegung des Senders spannt sich ein, wie in Abbildung 3 dargestelltes, rechtwinkliges Dreieck zwischen der Position des Senders zum Zeitpunkt t, dem Punkt P des geringsten Abstandes vom Beobachter und dem Beobachter selbst auf. Der Abstand von P zum Sender beträgt vt, mit v der Geschwindigkeit des Senders und t der Zeit die seit dem Passieren des Punktes P vergangen ist. Die Zeit t ist also negativ solange sich der Sender annähert und positiv solange er sich entfernt. Mit Hilfe dieses Dreiecks kann man den Abstand des Senders vom Beobachter in Abhängigkeit von t bestimmen. Nach dem Satz des Pythagoras gilt: p d(t) = d2 + (vt)2 Von dieser Funktion wird nun die Ableitung nach t gebildet, um die momentane Abstansänderungsrate des Senders zum Beobachter bestimmen zu können. Die ‘Abstandsänderungsrate’ ist genau die momentane Geschwindigkeit des Senders, mit der er sich vom Beobachter entfernt, da v = ∆s ∆t , die Geschwindigkeit also nur ein Maß für die Strecken- √bzw. Entfernungsänderung pro Zeit ist. Da die Funktion d(t) eine Verkettung der Funktionen p(x) = x und q(t) = d2 + (vt)2 darstellt, gilt für die Ableitung d′ (t) nach der Kettenregel: d′ (t) = p′ (q(t)) · q ′ (t) Für p′ gilt: 1 p′ (x) = √ 2 x und für q ′ : q ′ (t) = 2v 2 t Durch Einsetzen ergibt sich also: durch Kürzen erhält man schließlich: 1 · 2v 2 t d′ (t) = p 2 d2 + (vt)2 v2 t (2) d 2 + v 2 t2 d′ (t) drückt also die momentane Abstandsänderungsrate zum Zeitpunkt t aus. Daher gilt für die Strecke mit der sich der Sender in einem Intervall I auf den Beobachter zubewegt bzw. von ihm entfernt näherungsweise: s = d′ (t)I d′ (t) = √ Der Sender entfernt sich also im Intervall T = f1 um näherungsweise s = d′ (t)T Meter. Diese Strecke muss die Welle also zusätzlich zurücklegen. Daher erhöht sich ihre Wellenlänge λ auf: λ′ = λ + s Durch Einsetzen von s also auf: λ′ = λ + d′ (t)T Wegen λ = c f (1) gilt: c′ = λ + d′ (t)T f′ David Wander 2012 3 Der Dopplereffekt 2.3 Die Schallgeschwindigkeit in Luft Da die Schallgeschwindigkeit c′ = c konstant ist und T = 1 f folgt daraus: c d′ (t) = λ + f′ f Wegen λ = c f (1) wird daraus: c + d′ (t) c = f′ f In dem wir durch c teilen und den Kehrwert bilden erhalten wir: f f′ = ′ 1 + d c(t) Durch Einsetzen von d′ (t) gemäß Gleichung 2 ergibt sich schließlich die wahrgenommene Dopplerfrequenz zum Zeitpunkt t in Abhängigkeit von der Geschwindigkeit v mit der sich der Sender bewegt und dem minimalen Abstand d des Beobachters von der imaginären Geraden auf der sich der Sender bewegt: f′ = f 1 1+ 2 √ v t c d2 +v 2 t2 (3) Wichtig ist, dass t = 0 in dieser Gleichung als der Punkt des geringsten Abstandes zwischen Sender und Empfänger definiert ist(siehe Abb. 3). Wenn sich der Sender also auf den Beobachter zu bewegt ist t < 0, daher wird der Bruch aus Gleichung 3 größer als 1, die wahrgenommene Frequenz ist also höher, als die ausgesendete. Umgekehrt verhält es sich, wenn sich der Sender vom Beobachter weg bewegt. Dann ist t > 0, der Bruch wird also kleiner als 1, die wahrgenommene Frequenz ist also kleiner als die vom Sender ausgesendete. Abbildung 4 verdeutlicht diesen Verlauf der Frequenzänderung für eine Geschwindigkeit v von 5m/s und Abbildung 4: Frequenzverschiebung bei v = 5 m s u. d = 2m. einem Abstand d von 2m, bei einer Schallgeschwindigkeit c von 343m/s, also der Schallgeschwindigkeit von Luft bei 20◦ C. Auf der x-Achse ist die Zeit im Bereich von -2,5 bis 2,5 Sekunden abgetragen, in y-Richtung kann man somit ablesen wie vielfach höher oder niedriger die wahrgenommene Frequenz ist. Also f ′ = f [y − W ert]. Eine Erhöhung der Geschwindigkeit v entspricht einer Streckung der Kurve in Y-Richtung, da durch die höhere Geschwindigkeit die Wellen stärker gestaucht beziehungsweise gedehnt werden, die Frequenzverschiebung also größer ausfällt. Erhöht man den Abstand d, so wird die Kurve in X-Richtung gestreckt, da sich dann der Winkel der Bewegungsrichtung des Senders zum Beobachter langsamer ändert, der ganze Passiervorgang also länger dauert. 2.3 Die Schallgeschwindigkeit in Luft Da in der Formel für die Frequenzverschiebung die Schallgeschwindigkeit c vorkam, ist es interessant zu betrachten, wie sich die Schallgeschwindigkeit in Luft mit der Temperatur, dem Luftdruck oder der Luftfeuchtigkeit verändert. Allgemein gilt nach der Laplaceschen Gleichung für die Schallgeschwindigkeit in Luft: r p κ (4) c= ρ David Wander 2012 4 Der Dopplereffekt 3. Bestätigungsversuch mit c der Schallgeschwindigkeit, p dem Luftdruck, ρ der Dichte und κ(1, 4) dem Adiabatenexponent der Luft. Die ideale Gasgleichung lautet: pV = nRT bzw. p n V = RT J mit R(8, 314472 Kmol ) der universellen Gaskonstante, T der Temperatur des Gases in Kelvin, p dem Druck, n der Molekülzahl und V dem Volumen. Da Vn gerade der Teilchenzahl pro Volumeneinheit entspricht, erhält man durch Multiplizieren mit der molaren Masse M des Stoffes die Dichte ρ. Wir 1 erweitern die Gleichung also um M und erhalten damit: p R = T ρ M R nennt man auch spezifische Gaskonstante RS . Durch Einsetzen in die Laplacesche Den Quotienten M Gleichung (4) erhält man: r R Tκ (5) c= M Da R, M und κ Konstanten sind, ist T die einzige Variable der Gleichung. Daran erkennt man, dass die Schallgeschwindigkeit von der Temperatur T des Gases abhängt. Bei steigender Temperatur, steigt also auch die Schallgeschwindigkeit. Der Druck p spielt hingegen keine Rolle. Die Schallgeschwindigkeit ist also sowohl auf Meereshöhe, als auch auf einer Bergspitze gleich, vorausgesetzt die Temperatur sei konstant. Eine Erhöhung der Luftfeuchtigkeit verusacht zwei entgegenwirkende Effekte. Einerseits verringert sich die Dichte der Luft, andererseits sinkt ihr Adiabatenexponent κ mit zunehmender Luftfeuchtigkeit. Insgesamt überwiegt der Dichteeffekt, weshalb die Schallgeschwindigkeit steigt. Dieser Effekt ist im Vergleich zum Einfluss der Temperatur jedoch vernachlässigbar, weshalb er hier nicht genauer erklärt wurde. [5] [6] 3 Bestätigungsversuch 3.1 Zielsetzung Im Folgenden wird ein Experiment durchgeführt, um die oben hergeleitete Theorie zu bestätigen. 3.2 Aufbau Es werden zwei Teilversuche durchgeführt. Erstens um den Einfluss der Geschwindigkeit und zweitens um den Einfluss des Abstandes auf die wahrgenommene Frequenz zu analysieren. Für beide Versuche ist der Aufbau jedoch fast identisch. 3.2.1 Material Es wurde folgendes Material benötigt: • mobiler Lautsprecher (Typ: TechnaXX MusicMan MA Soundstation) • Fahrrad • GPS-Geschwindigkeitsmesser (Typ: Garmin Forerunner 101) • Mikrofon mit Kugelcharakteristik (Typ: AVL920) • Pc/Laptop • Thermometer + Feuchtigkeitsmesser (Typ: Testo 625) • Gliedermaßstab 2m (Marke: Stabila) • Maßband 50m + Kreide David Wander 2012 5 Der Dopplereffekt 3.2.2 3.3 Durchführung Vorbereitungen Zuerst wurde auf einem etwa 100m langen geraden und möglichst ebenen Abschnitt eines Feldweges mit Hilfe des Maßbandes und der Kreide eine etwa 60m lange, gerade Linie gezogen. In der Mitte der markierten Strecke wurde im Abstand d das Mikrofon und der Pc aufgebaut. Der mobile Lautsprecher und der Geschwindigkeitsmesser wurden am Fahrrad angebracht, wobei darauf geachtet wurde, dass sich das Mikrofon und der Lautsprecher etwa in gleicher Höhe befanden, um den Abstand von Sender und Beobachter dadurch nicht zu verfälschen. Desweiteren wurden zur Dokumentation Bilder gemacht und eine Videokamera aufgestellt. Abbildung 5 verdeutlicht diesen Aufbau. Das Fahrrad Abbildung 5: Skizze des Aufbaus. und somit auch der Lautsprecher, wurden nun mit möglichst konstanter Geschwindigkeit v entlang der markierten Gerade bewegt, das Fahrrad wirkte also als bewegter Sender. Dabei spielte der Lautsprecher einen konstanten Ton der Frequenz 5500Hz ab. Der Laptop nahm den vom Lautsprecher ausgesendeten Ton mit Hilfe des Mikrofons auf, stellte also den ruhenden Beobachter dar. Hierbei betrug die Abtastrate 44100Hz, es wurden also 44100 Messwerte pro Sekunde aufgenommen. Der Computer erstellte aus den Daten des Mikrofons Audiodateien, die später ausgewertet wurden. 3.3 Durchführung Wie oben erwähnt, sollen zwei Teilversuche durchgeführt werden, um den Einfluss der Geschwindigkeit und des Abstandes auf den Frequenzverlauf zu untersuchen. Zuerst wurde der konstante Abstand d = 2m gewählt und der Versuch mit verschiedenen Geschwindigkeiten v, wie sie die folgende Tabelle zeigt, durchgeführt. Zu Beginn des Experimentes betrug die Abbildung 6: Geschwindigkeiten bei den Durchgängen. d [m] v [km/h] 2 11,5 2 11,9 2 15,7 2 17,7 2 19,8 2 21,4 2 21,5 2 24,8 2 26,8 2 28,3 2 31,7 2 36,0 Luftfeuchtigkeit 40% bei einer Temperatur von 18, 3◦ C. Nach dem Versuch herrschte eine Temperatur von 18, 5◦ C und eine Luftfeuchtigkeit von 38, 5%. Die Werte änderten sich also praktisch nicht. Die durchschnittliche Windgeschwindigkeit betrug anfangs etwa 3, 3m/s, später 2, 8m/s.[4] David Wander 2012 6 Der Dopplereffekt 3.4 Auswertung Beim zweiten Teilversuch, der an einem anderen Tag durchgeführt wurde, war nun die Geschwindigkeit die konstante Größe. Da sich diese allerdings nicht so gut kontrollieren ließ, wie der Abstand beim ersten Teilversuch, wurden hier jeweils drei Durchgänge durchgeführt. Für die Auswertung wurden die Werte der ersten Spalte gewählt, da diese am dichtesten beieinander liegen und daher am besten miteinander vergleichbar sind. An diesem Versuchstag betrug die Temperatur zu Beginn 5, 4◦ C bei 45% Luftfeuchtigkeit. Abbildung 7: Geschwindigkeiten bei den verschiedenen Abständen. d [m] v1 [km/h] v2 [km/h] v3 [km/h] 1 19,9 20,5 20,7 2 19,9 20,1 20,6 3 19,8 20,2 20,5 4 20,0 20,3 20,6 5 20,0 20,1 20,3 Sie stieg auf 6, 6◦ C, die relative Luftfeuchtigkeit sank auf 41, 2%. Die durchschnittliche Windgeschwindigkeit betrug dabei etwa 2, 2m/s [4]. Die bei den Versuchen in Audiodateien aufgezeichneten einzelnen Messwerte sind jedoch nicht das Endprodukt. Sie repräsentieren den momentanen Luftdruck an der Membran des Mikrofons, sagen also nicht direkt etwas über die vorhandenen Frequenzen aus. Erst durch Verbingen der einzelnen Werte, ergeben Abbildung 8: Auszug einer aufgenommenen Audiodatei. sich wellenartige Muster, wie sie in Abbildung 8 auf der rechten Seite zu sehen sind. Mit deren Auswertung beschäftigt sich das folgende Kapitel. 3.4 Auswertung Durch das Verbinden der einzelnen Messwerte erhält man, wie oben erklärt, wellenartige Muster. Ziel des Experimentes ist es jedoch nicht zu zeigen, dass sich Schall wellenartig ausbreitet, sondern den theoretisch hergeleiteten Verlauf der Frequenzveränderung aus Abbildung 4 zu bestätigen. Es müssen also die wahrgenommenen Frequenzen zu verschiedenen Zeitpunkten der Aufnahme aus den Messwerten abgelesen und in einer Grafik abgetragen werden. Um die Frequenz der Wellen zu bestimmen könnte man die Zeit T eines Phasendurchlaufes ablesen und dadurch auf die Frequenz schließen. Dieses Verfahren wäre aber mühsam und relativ ungenau, da die Messwerte durch Störgeräusche und ein gewisses Rauschen beim Digitalisieren verfälscht werden können. Um diese Probleme zu umgehen bietet sich ein mathematisches Hilfsmittel an, die Fourier-Transformation. Diese Ermöglicht eine Transformation aus dem Zeit- in den Frequenzbereich. Aus den zeitabhängigen Messwerten werden also die darin enthaltenen Frequenzen bestimmt. Wie dies mathematisch funktioniert kann an dieser Stelle leider nicht erklärt werden, da dies den Rahmen der Arbeit übersteigen würde. 3.4.1 Das Auswerteverfahren Die aufgenommenen Messwerte liegen, wie oben erwähnt, als Audiodateien, genauer gesagt als .wavDateien vor. Zuerst werden diese Dateien auf etwa acht Sekunden länge gekürzt, dabei wird darauf geachtet, dass der Zeitpunkt des Vorbeifahrens am Mikrofon etwa in der Mitte der resultierenden Datei liegt. Diese Dateien werden dann in das Analyseprogramm Origin 6.0 Professional importiert. Dort werden sie in einzelne 0, 25s-Intervalle unterteilt. Auf jedes dieser Intervalle wird dann die FFT angewendet, David Wander 2012 7 Der Dopplereffekt 3.4 Auswertung um das Frequenzspektrum zu bestimmen. In Abbildung 9 ist das Ergebnis einer solchen FFT abgebildet. Abbildung 9: Frequenzspektrum eines 0, 25s-Intervalls. Man erkennt sehr gut den starken Ausschlag bei etwas mehr als 5000Hz, der Sendefrequenz des Lautsprechers. Ein weiterer Peak findet sich bei etwa 11000Hz, also genau dem doppelten der Senderfrequenz, es handelt sich hierbei also vermutlich um eine Oberwelle. Bei sehr niedrigen Frequenzen von wenigen Hertz ist eine letztere größere Auslenkung zu finden, die auf das Rauschen des Windes zurückzuführen ist. Die Amplituden der anderen Frequenzen sind um Größenordnungen geringer, das Ergebnis ist also sehr eindeutig und lässt sich sehr gut auswerten. Aus dem Frequenzspektrum wird anschließend das Maximum im Bereich von 5000 bis 6000Hz bestimmt um zu ermitteln, wie sich die ausgesendete Frequenz von 5500Hz verschoben hat. Hierzu wird jedoch die von der FFT produzierte Tabelle mit Werten herangezogen, da ein Ablesen aus der Grafik sehr ungenau wäre. Andere Frequenzbereiche werden ignoriert, um das Ergebnis nicht durch das niederfrequente Rauschen des Windes oder durch höherfrequente Oberwellen zu verfälschen. Die Intervalllänge wurde auf 0, 25s festgelegt, da man so noch genug Ergebnisse erhält, um den Kurvenverlauf gut abzubilden. Eine kürzere Intervalldauer wäre zwar wünschenswert, da man so mehr Messwerte erhalten würde und die Kurve ’runder’ würde, allerdings verschlechtert sich die Auflösung der FFT bei kleineren Intervallen, sodass der Messfehler steigt. Zuletzt werden die so erhaltenen Frequenzen in einem t-f-Diagramm abgetragen. 3.4.2 Ergebnisse Im Laufe dieses Unterkapitels werden die Ergebnisse der Versuche gezeigt und mit der Theorie verglichen. 1. Erstes Ziel des Experimentes ist die Bestätigung der theoretisch hergeleiteten Kurve aus Gleichung 3. Dazu wurde in Abbildung 10 zufällig eine Messung ausgewählt, ihr Messfehler berechnet (siehe Anhang), der etwa 10, 5% beträgt, die Fehlerbalken eingezeichnet und die theoretische Kurve darüber gelegt. Man erkennt, dass die meisten Messwerte sehr nahe an der theoretischen Kurve liegen und nur ein Messwert größere Abweichungen zeigt, die wahrscheinlich auf eine starke Böe oder ein Fehler des auswertenden Programmes zurück zu führen ist, da die anderen Werte in seiner Umgebung nahe bei der theoretischen Kurve liegen. Die Ergebnisse der anderen Durchgänge sehen diesem Beispiel prinzipiell sehr ähnlich. Es gibt, wie auch hier teilweise Ausreißer, die wahrscheinlich durch Böen, ein starkes Abweichen des Fahrrades von der Gerade oder Fehler des Auswerteprogrammes entstehen. Bei fast allen Messwerten liegt die theoretische Kurve jedoch im Bereich des Fehlerbalken, womit gezeigt ist, dass die Theorie mit großer Wahrscheinlichkeit zutrifft. David Wander 2012 8 Der Dopplereffekt 3.4 Auswertung Abbildung 10: Vergleich der Messwerte und der Theorie. 2. Als nächstes wird der Einfluss der Geschwindigkeitsänderung auf den Kurvenverlauf analysiert. Dazu werden mehrere Messungen mit konstantem Abstand d = 2m und unterschiedlichen Geschwindigkeiten verglichen. Abbildung 11 zeigt fünf Durchläufe, von 11, 5km/h bis 36, 0km/h, in Abbildung 11: Einfluss der Geschwindigkeit. möglichst gleichmäßen Abständen. Man erkennt, wie erwartet, dass bei steigender Geschwindigkeit die Frequenzverschiebung zunimmt und dass sich die Kurven eigentlich nur im Nullpunkt schneiden. Auf Grund kleiner Abweichungen schneiden sich in der Grafik zwar doch zwei Kurven ein wenig, aber das Prinzip ist daran erkennbar. 3. Zuletzt wird betrachtet, welche Rolle der Abstand d, mit dem der Sender am Empfänger vorbeifährt, spielt. Zu diesem Zweck werden fünf Messungen mit unterschiedlichen Abständen d verglichen. Dabei ist die Geschwindigkeit v möglichst konstant. In der Praxis ist es, bei dem hier gewählten Aufbau, nicht möglich, die Geschwindigkeit exakt konstant zu halten. Es treten Unterschiede von bis zu 0, 2km/h zwischen den einzelnen Kurven auf, obwohl aus mehreren Durchgängen jedes Abstandes jeweils derjenige ausgewählt wurde, dessen Geschwindigkeit am besten mit den anderen vergleichbar ist. Da in Abbildung 12 nur ein Ausschnitt von −2s bis 2s abgebildet ist, sieht man nicht eindeutig, dass alle Kurven gegen einen gemeinsamen Grenzwert streben, es lässt sich aber erahnen. Sieht man alle Messwerte von −4s bis 4s wird dies deutlicher. Diese Beobachtung ist theoretisch auch zu erwarten, da die maximale Frequenzverschiebung unabhängig vom Abstand d ist. Sie wird erreicht, wenn die volle Geschwindigkeit v des Senders direkt auf den Beobachter zu oder von ihm weg David Wander 2012 9 Der Dopplereffekt 3.5 Fazit Abbildung 12: Einfluss des Abstandes. gerichtet ist. Betrachtet man Gleichung 3: f′ = f 1 1+ c 2 √ v t d2 +v 2 t2 so erkennt man auch hier dass der Grenzwert unabhängig von d ist. Der Grenzfall tritt nämlich für t → ∞ beziehungsweise t → −∞ ein. In diesem Fall geht v 2 t2 gegen unendlich, der Abstand d2 spielt also keine große Rolle mehr. Man erkennt außerdem, dass sich auch hier die Kurven, außer im Mittelpunkt, kaum schneiden. Je kleiner der Abstand, desto abrupter findet auch der Übergang von hoch nach tief statt. 3.5 Fazit Zusammenfassend erkennt man, dass die Messwerte, bis auf wenige Ausnahmen, sehr dicht bei der theoretisch erwarteten Kurve liegen. Die Ausreißer sind wahrscheinlich auf besonders starke Böen oder ein stärkeres Abweichen von der Geraden zurück zu führen. Ein anderes großes Problem ist die Ungenauigkeit der Geschwindigkeit und die langsame Reaktion des GPS, die das Ablesen erschwert. Dies verursacht, vorallem bei geringen Geschwindigkeiten, große Unsicherheiten. Betrachtet man die Ergebnisse der Fehlerrechnung (siehe Anhang), stellt man außerdem fest, dass Abweichungen in der Geschwindigkeit besonders starken Einfluss auf den Gesamtfehler haben. Für genauere Messergebnisse bietet es sich daher an, das Fahrrad durch eine andere Konstruktion zu ersetzten, die am besten von einem Motor gleichmäßig angetrieben wird. Wie man sieht, gibt es also einige Punkte, die am Versuchsaufbau verbessert werden könnten. Daher ist es um so bemerkenswerter, dass trotz des sehr einfachen Aufbaus sehr gute Ergebnisse erzielt werden konnten. Dies ist wahrscheinlich hauptsächlich der FFT zu verdanken, die sehr zuverlässig jegliche Störgeräusche ausfiltert und die Frequenz sehr genau bestimmt. Insgesamt kann also gesagt werden, dass die Theorie bestätigt werden konnte. 4 Automatische Geschwindigkeitsmessung Das eigentliche Ziel der Arbeit ist es, eine automatische Geschwindigkeitsmessung anhand des akustischen Dopplereffektes durchzuführen. Nach den oben durchgeführten theoretischen und praktischen Vorarbeiten widmet sich dieses Kaptiel schließlich diesem Ziel. Das im vorangehenden Kapitel durchgeführte Experiment geht schon stark in die gewünschte Richtung, die größten Probleme dabei sind jedoch, dass die Auswertung manuell durchgeführt werden muss und dass die Berechnung der Fouriertransformation in Origin 6.0 Professional für eine etwa 8 Sekunden lange Audiodatei etwa 30 Minuten Benötigt. Wünschenswert wäre also ein Programm, welches möglichst in Echtzeit und vollautomatisch die Geschwindigkeit und wenn möglich auch den Abstand eines vorbeifahrenden Senders beliebiger Frequenz bestimmt. David Wander 2012 10 Der Dopplereffekt 4.1 4.1 Das Auswerteprogramm Das Auswerteprogramm In diesem Unterkapitel wird die Entwickung eines solchen Programmes beschrieben. Dabei wird jedoch nur das Funktionsprinzip grob erklärt, die detaillierte Umsetzung wird nicht weiter ausgeführt, da dies nicht Thema dieser Arbeit ist und deren Rahmen sprengen würde. Als Programmiersprache wurde C + + aus verschiedenen Gründen gewählt: Ich kenne mich am besten damit aus, man hat Zugriff auf elementare Betriebsystemfunktionen, wie den Mirkofoneingang, C + + Programme sind sehr schnell in ihrer Ausführung und für C + + gibt es eine große Auswahl an externen Libraries (Bibliotheken) die das Programmieren erleichtern. Zuerst müssen die vom Mikrofon aufgenommenen Töne aufgezeichnet werden. Diesmal werden die Messwerte jedoch nicht in .wav-Dateien gespeichert, sondern in Puffer der für die Analyse gewünschten Länge von 0, 25s geladen. Sobald ein Puffer gefüllt ist wird ein neuer Thread1 gestartet, der sich um die Analyse dieser Aufnahme kümmert. Das angewendete Auswerteverfahren ist prinzipiell das gleiche wie beim obigen Versuch. Zunächst wird auf das 0, 25s-Intervall eine FFT angewendet. Dafür wurde die für nicht kommerzielle Projekte kostenlose Bibliothek ‘FFTW’ [7] verwendet. Anschließend sucht das Programm die Frequenz mit der größten Amplitude innerhalb eines einstellbaren Frequenzbereiches und stellt sie in einem f-t-Diagramm dar. Jeder Thread liefert also einen Messwert als Ergebnis. In der Aufnahme können jedoch sowohl vor als auch nach dem verwertbaren Teil der Aufnahme Rauschen oder ähnliches sein. Deshalb muss als nächstes der charakteristische Kurvenverlauf des Dopplereffekts erkannt werden. Charakteristisch für den Verlauf der Dopplerverschiebung ist, dass die aufgenommene Frequenz am Anfang und am Ende der Messung - wenn sich der Sender fast direkt auf den Beobachter zu- oder von ihm wegbewegt - auf einem längeren Intervall näherungsweise konstant sind. Der gewählte Ansatz zur Erkennung der eigentlichen Kurve besteht daher darin, diese zwei Geraden ausfindig zu machen. Das Programm sucht deshalb nach mindestens x Messwerten in Folge, die jeweils nur um höchstens y Hertz vom ersten Messwert abweichen, wobei standartmäßig x = 3 und y = 4 gewählt wurde. Findet das Programm eine solche Gerade, sucht es als nächstes nach einer zweiten Gerade, die die gleichen Kriterien erfüllen muss. Desweiteren muss die zweite Gerade eine tiefere Frequenz besitzen als die erste, da die Frequenz bei der Vorbeifahrt immer von hoch nach tief verläuft. Sollte die automatische Auswahl fehlschlagen, besteht die Möglichkeit dies manuell durchzuführen. Nach erfolgter Auswahl folgt nun die Berechnung der Geschwindigkeit. Dazu wird von folgender Näherung ausgegangen: für t → ±∞ in Gleichung 3 spielt der Abstand d praktisch keine Rolle mehr. Physikalisch gesehen bedeutet dies, dass der Sender fast direkt auf den Beobachter zu- bzw. von ihm wegfährt. Da v als konstant angenommen wurde, ist deshalb auch die Dopplerverschiebung für große Beträge von t näherungsweise konstant, wodurch die oben erwähnten charakteristischen ´Geraden’ entstehen, die man auch in Abbildung 4 erkennen kann. In Gleichung 3 kann deshalb d = 0 einsetzt werden. Es wird dadurch folgende, von d unabhängige und wesentlich einfachere Gleichung erhalten: f′ = f 1 1+ (6) v c Hierbei ist jedoch darauf zu achten, dass v nun die Geschwindigkeit darstellt, mit der sich der Sender vom Beobachter entfernt. Für eine Bewegung auf den Beobachter zu muss v also negativ sein. Dank dieser Überlegungen und nach dem oben beschriebenen Auswahlvorgang kann für den ersten Messwert der Auswahl in guter Näherung angenommen werden, dass er dem Wert für t → −∞ entspricht. Daher darf er zur Berechnung von v in Gleichung 6 eingesetzt werden. Da aber sowohl v als auch f unbekannt sind, ist diese Gleichung nicht lösbar. Deshalb wird zusätzlich der letzte Punkt der Auswahl herangezon, der analog zum ersten Punkt dem Wert für t → +∞ entspricht. Somit wird folgendes eindeutig bestimmte Gleichungssystem mit zwei Variablen erhalten: fM ax = f 1 1− fM in = f 1 1+ v c v c 1 Ein Thread ist ein ausgelagerter Programmteil. Er ermöglicht es einem Programm verschiedene Rechnungen parallel durchzuführen. David Wander 2012 11 Der Dopplereffekt 4.1 Das Auswerteprogramm Ob zuerst nach f oder nach v aufgelöst wird, ist prinzipiell egal. Ich habe mich dazu entschieden zuerst f zu bestimmen: Zuerst wird die untere Gleichung nach vc umgestellt: v f −1 = c fM in Nun wird in die obere Gleichung eingesetzt: fM ax = f 1 − ( fMfin − 1) f = 2fM ax − f fM ax fM in ax 1 + ffM 1 M in = f 2fM ax f= 2fM ax fM in 2fM ax = ax fM ax + fM in 1 + ffM M in Somit kann die Senderfrequenz anhand des oberen und unteren Grenzwertes der Dopplerverschiebung bestimmt werden. Als nächstes wird mittels Gleichung 5 die Schallgeschwindigkeit in Abhängigkeit von der momentanen Temperatur bestimmt. Nun sind alle Werte bekannt, um die gesuchte Geschwindigkeit v zu berechnen. Dazu wird wieder die gleichen Formel, wie oben für die Grenzwerte der Verschiebung verwendet und diese nach v umgestellt: fM in = f v= 1 1+ fc fM in v c −c In einem letzten Schritt wird ein Näherungswert für den Abstand d der Vorbeifahrt berechnet. Dafür muss zuerst der Zeitpunkt t0 bestimmt werden, an dem die gemessene Frequenz der der Senderfrequenz entspricht, also der Zeitpunkt des geringsten Abstandes. Da dieser meist zwischen zwei Messwerten liegt, wird er näherungsweise mit Hilfe eines Steigungsdreiecks bestimmt. Danach wird ein neuer Thread gestartet, der sich um die Auswertung kümmert. Um d zu bestimmen fängt dieser bei d = 0m an und bestimmt dann die Abweichung der Messwerte von der theoretischen Kurve gemäß folgender Formel: Abweichung = N X i=1 (xi − µi )2 wobei N die Anzahl der Messwerte ist, xi der Messwert an Stelle i und µi der zum Messwert gehörige theoretisch errechnete Wert. d wird so lange um einen einstellbaren Wert erhöht, bis die Abweichung zum ersten Mal wieder zunimmt. Der Wert für d mit der niedrigsten Abweichung wird dann als beste Näherung angenommen. David Wander 2012 12 Der Dopplereffekt 4.2 4.2 Messergebnisse Messergebnisse Im Laufe dieses Kapitels wird das Programm mit verschiedenen Messobjekten getestet. Zusätzlich zu den drei hier aufgeführten Objekten, wurden noch ein Modellflugzeug und ein Motorrad getestet. Da diese aber keine grundlegend neuen Erkenntnisse ergaben, wurden sie an dieser Stelle weggelassen. Die Ergebnisse dazu sind im Anhang zu finden. 4.2.1 Fahrrad mit Lautsprecher Zuerst wird eine Aufnahme aus dem oben durchgeführten Experiment analysiert. Die Messung bei einem Abstand von 3m und einer Geschwindigkeit von etwa 20, 2km/h wurde zufällig ausgewählt. Abbildung 13: Analyseergebnis Fahrrad mit Lautsprecher. Das Ergebnis bei dieser Analyse ist genauso präzise, wie das mit Origin berechnete. Mein Programm benötigt jedoch lediglich die etwa 8s der Aufnahme, führt alle Berechnungen also in Echtzeit aus, wohingegen Origin etwa 20 Minuten rechnet. 4.2.2 Formel-1-Wagen Bei der Formel-1 ist der Dopplereffekt dank der hohen Geschwindigkeiten und der lauten Motoren sehr gut hörbar. Vermutlich sollte sich daraus dann auch sehr gut auf die gefahrene Geschwindigkeit schließen lassen. Dazu wurde das unter [1] aufgeführte Video analysiert. Abbildung 14: Analyseergebnis Formel-1. David Wander 2012 13 Der Dopplereffekt 4.2 Messergebnisse Wie man an Abbildung 14 erkennen kann, birgt die hohe Geschwindigkeit zwei Probleme. Einerseits dauert der Passiervorgang nur einen Bruchteil einer Sekdunde. Dadurch ergibt sich wegen der Intervallbreite von 0, 25s keine Kurve mehr, sondern ein Sprung von Hoch nach Tief. Insgesamt ist das Fahrzeug auch nach etwa 3s schon wieder außer Höhrweite, es liegen also wenig Daten für die Analyse vor. Dies hat zur Folge, dass das Ergebnis (vorallem der Abstandsberechnung) ungenauer und fehleranfälliger wird. Außerdem hat der Algorythmus, der den richtigen Bereich der Aufnahme für die Analyse auswählen soll oft Schwierigkeiten, weshalb dann manuell nachgeholfen werden muss. Der zweite Effekt verschlimmert dies zusätzlich. Da die Schallwellen wegen der hohen Geschwindigkeit dem Auto in Fahrtrichtung nur langsam entkommen können hört man es auch erst kurz bevor es den Beobachter erreicht. Somit ist es schwierig fM ax , die maximal wahrgenommene Frequenz zu bestimmen, die zur Berechnung der Geschwindigkeit benötigt wird. Problematisch ist auch, dass die Fahrer meist beschleunigen, bremsen oder schalten und sich daher die Drehzahl des Motors und damit auch die ausgesendete Frequenz ständig ändert. Betrachtet man nun die Ergebnisse der Analyse, stellt man fest, dass trotz all dieser Schwierigkeiten die berechnete Geschwindigkeit durchaus realistisch ist. Die Werte für den Abstand schwankten bei verschiedenen Aufnahmen teilweise deutlich, sie sind also wie erwartet nicht sehr aussagekräftig. 4.2.3 Serienmäßiger PkW In diesem Unterkapitel sollen serienmäßige PkW analysiert werden, wie sie im normalen Straßenverkehr unterwegs sind. Dies ist das interessanteste Messobjekt, da hier die Anwendungsmöglichkeiten, zum Beispiel als Geschwindigkeitsmessgerät für die Verkehrskontrolle, am größten sind. Dazu wurde eine Aufnahme des Straßenverkehrs in Oberotterbach analysiert. Die Temperatur am Tag der Aufnahme betrug etwa 7◦ C. Abbildung 15: Analyseergebnis PkW. Die tatsächliche Geschwindigkeit des Messobjekts wird auf etwa 50km/h geschätzt. Das Ergebnis des Programms ist mit 291, 61km/h absolut unbrauchbar. Der Abstand von etwa 3, 80m erscheint realistisch, allerdings ist dies ein reiner Zufall, denn bei anderen Messungen wurden deutlich abweichende Ergebnisse festgestellt. Man erkennt, dass das Programm bei PkW keine vernünftigen Ergebnisse liefert, denn auch durch Anpassung des zu analysierenden Frequenzbereiches, konnten die Werte nicht verbessert werden. Den Hauptgrund für die falschen Ergebnisse sehe ich darin, dass ein Auto nicht nur auf einer festen Frequenz sendet, wie es bei den vorangegangenen Beispielen der Fall war, sondern dass es auf sehr vielen Frequenzen verteilt Töne von sich gibt. Dies erkennt man, wenn man sich das in Abbildung 16 dargestellte Frequenzspektrum eines Autos ansieht. Im Gegensatz zu Abbildung 9 gibt es hier sehr viele Frequenzen ähnlich großer Amplitude, die Frequenz mit der größten Amplitude kann sich also durchaus ändern. Da der relativ primitive Algorythmus jedoch immer die Frequenz der größten Amplitude auswählt, kommt er bei einem PkW zu keinem verwertbaren Ergebnis. David Wander 2012 14 Der Dopplereffekt 5. Diskussion Abbildung 16: Frequenzspektrum eines 0,25s Intervalls eines PkW. 5 Diskussion Anhand des ersten Experimentes erkennt man, dass die zu Beginn der Arbeit hergeleitete Theorie den praktischen Beobachtungen sehr gut entspricht. Bei den meisten Teilversuchen lag der relative Fehler im einstelligen Prozentbereich, was angesichts des sehr einfachen Aufbaus und der Menge an Störfaktoren ein beachtliches Ergebnis ist. Durch die Entwicklung eines eigenen Programms, welches die Analyse automatisch vornimmt, konnte außerdem die Berechnungsdauer so weit minimiert werden, dass die Ergebnisse nun in Echtzeit zur Verfügung stehen. Das Programm funktioniert auch bei Formel-1-Autos, Modellflugzeugen und Motorädern, es ist also nicht auf die idealisierten Bedingungen des Experimentes angewiesen. Es gibt jedoch auch verschiedene Problemquellen, die manuelles Eingreifen nötig machen, oder gar zu unbrauchbaren Ergebnissen führen. Ersteres ist vorallem bei sehr hohen Geschwindigkeiten und geringen Abständen der Fall, da dann der charakteristische Kurvenverlauf der Frequenzverschiebung verloren geht und das Programm dann den zu analysierenden Teil nicht mehr erkennt. Um dieses Problem zu beheben, könnte man eventuell zusätzlich zu den Frequenzen auch die größe der Amplituden, sprich den Lautstärkepegel in die Berechnung mit einbeziehen. Zum Zeitpunkt des geringsten Abstandes ist nämlich üblicherweise auch die Lautstärke am größten. Somit könnte man anhand der Lautstärke diesen Zeitpunkt ermitteln und somit den zu analysierenden Teil besser bestimmen. Das größte Problem für eine praktische Anwendung des entwickelten Messverfahrens ist, dass die Sendefrequenz konstant bleiben muss. Dies ist bei manchen realen Messobjekten jedoch nicht der Fall. Vorallem bei Autos liegen zum einen eine Mischung aus vielen Frequenzen vor, zum anderen verändern sich diese je nach Drehzahl, beim Beschleunigen, Bremsen oder Schalten. Da sie also die Grundvoraussetzung des Messystems nicht erfüllen, kann man für sie mit dieser Technik keine zuverlässigen Aussagen treffen. Nichts desto trotz, kann man als Mensch auch beim Auto die Frequenzverschiebung wahrnehmen. Deshalb gehe ich davon aus, dass es mit einem optimierten Algorythmus möglich wäre, daraus die Geschwindigkeit des Autos zu berechnen. Für die angestrebte Nutzung als passives Geschwindigkeitsmessgerät für die Verkehrskontrolle ist diese Technik zumindest in der jetzigen Form nicht nutzbar. Durch die Optimierung der Software könnte es allerdings trotzdem möglich sein verlässliche Ergebnisse zu erhalten. Unabhängig davon ist das System aber schon jetzt für Hobbyanwendungen, wie die Geschwindigkeitsmessung eines Modellflugzeuges oder ähnliches sehr gut verwendbar. Dabei zeichnet es sich vorallem dadurch aus, dass nur haushaltsübliche Gegenstände wie ein Computer und ein Mirkofon benötigt werden. David Wander 2012 15 Der Dopplereffekt LITERATUR Literatur [1] Prof. Dr.-Ing. H. Gobrecht: Bergmann-Schaefer Experimentalphysik Band I. 9. Auflage. Berlin: Walter de Gruyter, 1974. S.443-447 [2] Prof. Dr. Franz Bader(Hg.)/Prof. Friedrich Dorn: Physik Gymnasium Gesamtband Sek II. Braunschweig: Schroedel, 2007. S.298f., S.304, S.320f., S.324-327 [3] Wikipedia: ‘Dopplereffekt’. URL: http://de.wikipedia.org/wiki/Dopplereffekt#Entdeckung [Stand:10.04.2012] [4] Agrarmeteorologie Rheinland-Pfalz: ‘Station Schweigen-Rechtenbach’. URL: http://www.am.rlp.de/Internet/AM/NotesAM.nsf/amweb/ 3e353d94206d717fc1257171002e8a8a?OpenDocument&TableRow=2.2#2.[Stand:23.03.2012] [5] Dennis A. Bohn: ‘Environmental Effects on the Speed of Sound’ URL: http://www.rane.com/pdf/eespeed.pdf [Stand:03.04.2012] [6] Mira Prior: ‘Schallwellen und die Schallgeschwindigkeit in verschiedenen Medien’ URL: https://lp.uni-goettingen.de/get/text/5138 [Stand:03.04.2012] [7] Matteo Frigo und Steven G. Johnson am Massachusetts Institute of Technology: ‘FFTW’ URL: http://www.fftw.org/ [Stand:13.10.2012] [8] W. Walcher: Praktikum der Physik. 4. neubearb. u. erw. Aufl. Stuttgart: Teubner Studienbücher, 1979. S.28-39. [9] Dipl.-Phys.-Ing. Bernd Schmiler: ‘Physikpraktikum - Fehlerrechnung’ URL: http://www.fh-gelsenkirchen.de/fb02/homepages/schmiler/Vordrucke/Fehlerrechnung.pdf S.7 [Stand:05.04.2012] [10] Wolfram Research: ‘Wolfram|Alpha’ URL: http://www.wolframalpha.com/ [Stand:05.04.2012] Videoquellen [1] ‘jujuteux’: ‘BEST F1 Sound exhaust V8 Redbull Ferrari McLaren Spa Francorchamps 2009’ URL: http://www.youtube.com/watch?v=seget3zOj 8&list=PL9D4B37C554D1218B [Minute 00:34] [Stand:29.12.2012] [2] ‘ready2flych’: ‘XB-70 Valkyrie Bomber RC - www.ready2fly.eu’ URL: http://www.youtube.com/watch?v=3AXc9LW31Ao&feature=relmfu [Minute 01:18] [Stand:29.12.2012] [3] ‘FrenchBuzzz’: ‘Ghost Rider - The come back ! | 353 Km/h | Wheeling’ URL: http://www.youtube.com/watch?v=YTdStgg0x8w&feature=related [Minute 02:17] [Stand:29.12.2012] David Wander 2012 16 Der Dopplereffekt A A. Bilder des Experimentes Bilder des Experimentes Abbildung 17: Der Versuchsaufbau. Abbildung 18: Das Fahrrad mit montiertem Lautsprecher und GPS-Geschwindigkeitsmesser. David Wander 2012 17 Der Dopplereffekt A. Bilder des Experimentes Abbildung 19: Vorbereitung der Fahrtstrecke. David Wander 2012 18 Der Dopplereffekt B B.1 B. Fehlerrechnung Fehlerrechnung Fehlerbetrachtung Wie bei jeden Experiment, so sind selbstverständlich auch beim hier durchgeführten Versuch Messfehler unterlaufen. Das folgende Unterkapitel beschäftigt sich damit, Überlegungen über die Ursache und eine Abschätzung der Messfehler zu treffen. Grundsätzlich ist zwischen systematischen und zufälligen beziehungsweise statistischen Fehlern zu unterscheiden. Systematische Fehler verfälschen die Messwerte in eine eindeutige Richtung. Sie können auftreten, wenn man ein falsch geeichtes Messgerät, also zum Beispiel ein ‘Metermaß’, das nur 1998mm statt 2000mm lang ist, verwendet. Systematische Messfehler können aber auch durch das angewendete Messverfahren auftreten. Misst man beispielsweise den Durchmesser eines Gummischlauches mit Hilfe einer Schieblehre, so wird dieser dabei gestaucht, das Messergebnis fällt also kleiner aus, als der tatsächliche Wert. Statistische Fehler führen dazu, dass selbst wenn man alle systematischen Fehler eliminieren könnte, die Messwerte immer noch streuen würden. Sie sind eine zufällige Komponente, die das Messergebnis in alle Richtungen verfälschen können. Ihre Ursache können Schätzungen sein, die notwendig werden, wenn zum Beispiel ein zu messender Gegenstand nicht genau an einem Strich des Maßstabes aufhört oder wenn man sich bei einem schwankenden Spannungsmessgerät für einen der angezeigten Werte entscheiden muss. Beim im Rahmen dieser Arbeit durchgeführten Experiment ist bei den systematischen Fehlern in erster Linie der Wind zu nennen. Dieser wehte zur Zeit des ersten Teilversuches mit einer Geschwindigkeit von etwa 3, 3m/s aus Richtung Nord-Ost. Bei der Messung bewegte sich das Fahrrad etwa in Richtung Osten. Es herrschte also mehr oder weniger Gegenwind. Das bewegte Medium trägt die Schallwellen also mit sich, was zur Folge hat, dass sich die Schallwellen, die nach vorne ausgesendet werden langsamer und die nach hinten ausgesendeten schneller fortbewegen. Solange der Lautsprecher auf das Mikrofon zufährt (t < 0), nimmt das Mikrofon die vom Lautsprecher nach vorne ausgestrahlen Wellen wahr, die sich um die Windgeschwindigkeit langsamer ausbreiten. Die Schallgeschwindigkeit ct<0 ist also um die Windgeschwindigkeit niedriger. Ab dem Zeitpunkt des Passierens nimmt das Mikrofon die Schallwellen auf, die der Lautsprecher nach hinten aussendet und die sich daher um die Windgeschwindigkeit schneller als c ausbreiten. Daher ist ct>0 , wenn der Lautsprecher vom Mirkofon weg fährt (t > 0), um die Windgeschwindigkeit höher als c. Abbildung 20 bestätigt diese Vermutung. In der Messkurve wurden zwei theoretische Abbildung 20: Auswirkung des Windes. Kurvenverläufe der Frequenz, einmal mit c = 338m/s, also 4m/s niedriger als die Schallgeschwindigkeit bei etwa 18◦ C in ruhiger Luft und einmal mit c = 346m/s, also 4m/s höher, gezeichnet (es wurden absichtlich 4m/s Windgeschwindigkeit gewählt, um den Effekt zu verdeutlichen). Wie erwartet liegt die rote Kurve mit der niedrigeren Schallgeschwindigkeit bei t < 0 näher an den Messwerten, bei t > 0 liegt jedoch die blaue Kurve näher bei ihnen. Doch nicht nur der Wind birgt Ungenauigkeiten, auch beim Lautsprecher ist es nicht garantiert, dass er konstant mit exakt 5500Hz sendet. Durch eine Referenzmessung und eine anschließende FFT konnte festgestellt werden, dass er mit etwa 5501, 99Hz sendet. Dabei wird angenommen, dass die Soundkarte David Wander 2012 19 Der Dopplereffekt B.1 Fehlerbetrachtung wesentlich genauere Ergebnisse liefert, als der preisgünstige Lautsprecher, der Fehler also wirklich beim Lautsprecher und nicht bei der Aufnahme des Laptops liegt. Im Gegensatz zum Wind kann man diesen Fehler jedoch leicht korrigieren, so wird bei der folgenden Auswertung also nicht eine Frequenz von exakt 5500Hz, sondern von 5502Hz angenommen. Auch beim Abstand des Mikrofones von der Geraden, auf der das Fahrrad bewegt wird, können Fehler auftreten. So lässt sich der Abstand auf dem Boden zwar relativ gut messen, da das Mikrofon jedoch auf der gleichen Höhe wie der Lautsprecher platziert werden muss, ist man bei diesem Aufbau auf eine Schätzung angewiesen, um das Mikrofon senkrecht über dem Maßstab auszurichten. In Folge dieser Schätzung kommt es zu einer Abweichung des Abstandes von etwa 5cm. Als weitere systematische Fehlerquellen kommen der GPS-Geschwindigkeitsmesser und der Gliedermaßstab, die durch falsche Eichung Messfehler verursachen können, in Frage. Ob solche Eichfehler vorliegen, ist schwer zu überprüfen, es ist jedoch davon auszugehen, dass diese sehr gering sind. Neben den systematischen sind auch einige statistische Fehler festzustellen. Auch hier spielt der Wind eine Rolle, so kann durch Böen kurzzeitig die Schallgeschwindigkeit um geschätzt 10m/s verändert wer10m/s ≈ 0, 029, also etwa den. Dadurch können sich für einzelne Messwerte Abweichungen von bis zu 343m/s 2, 9% ergeben. Ebenso ist es schwierig mit dem Fahrrad eine konstante Geschwindigkeit zu halten und auch das Ablesen der momentanen Geschwindigkeit ist wegen der langsamen Reaktion des GPS-Gerätes fehlerbehaftet. Daraus ergibt sich eine geschätzte Abweichung von ±0, 5m/s. Dies entspricht bei der 0,5m/s ≈ 0, 157 also im schlechtesten Fall niedrigsten Geschwindigkeit von 11, 5km/h ≈ 3, 19m/s etwa 3,19m/s etwa 15, 7%. Bei höheren Geschwindigkeiten wird der relative Fehler jedoch geringer, so ist er bei der höchsten gemessenen Geschwindigkeit von 36km/h = 10m/s nurnoch 0,5m/s 10m/s = 0, 05 also noch 5%. Des weiteren ist es unmöglich mit dem Fahrrad exakt der geraden Linie zu folgen. Es kommt zu Abweichungen von etwa 0, 1m in beide Richtungen. Wie sehr diese Abweichungen die Messwerte beeinflussen ist jedoch schwer zu sagen, da dies von der Entfernung vom Mikrofon und der gefahrenen Geschwindigkeit abhängt. Der daraus entstehende Fehler sollte aber geringer sein als der durch die Geschwindigkeitsschwankungen entstehende. Als letztes treten durch die Analyse Ungenauigkeiten auf. Die FFT löst bei einer Intervalldauer von 0, 25s nur auf 2, 7Hz genau auf. Das bedeutet, dass hier die maximale Abweichung 1, 35Hz beträgt. Diese Auflösungsgrenze verursacht auch, dass mehrere Messwerte nebeneinander den gleichen Wert besitzen, obwohl er in Wirklichkeit immer etwas unterschiedlich ist. Im Folgenden soll nun der Größtfehler an einem Beispiel vorgerechnet werden. Es wird die Messung mit der größten relativen Ungenauigkeit gewählt. Dies ist beim Versuch mit der geringsten Geschwindigkeit, also 11, 5km/h der Fall, da bei dieser der relative Fehler der Geschwindigkeit am höchsten ist. Um den Größtfehler zu bestimmen muss zuerst die Summe der einzelnen statistischen Fehler errechnet werden. Diese kann man jedoch nicht einfach addieren, man muss viel mehr Gleichung 3 partiell nach allen Variablen ableiten, die einen Fehler enthalten. Gleichung 3 muss also nach v, d und c abgeleitet werden (die partiellen Ableitungen werden mit einem ∂ gekennzeichnet). Diese partiellen Ableitungen werden dann jeweils mit dem relativen Fehler der jeweiligen Variable multipliziert und die Beträge dieser Produkte schließlich addiert. Somit erhält man den absoluten statistischen Fehler. Es gilt also: ∂f ∂f ∂f ′ ∆fstat = · ∆v + · ∆d + · ∆c ∂v ∂d ∂c Errechnet man nun für diese Beispiel die partiellen Ableitungen, so erhält man: (cf (2d2 tv + t3 v 3 )) ′ √ ∆fstat = − √ · ∆v + 2 2 2 2 2 2 2 2 ( d + t v (tv + c d + t v ) ) √ 2 (f tv 2 d2 + t2 v 2 ) d) (cf tv √ ( t2 v 2 + d2 (tv 2 + c√t2 v 2 + d2 )2 ) · ∆d + (tv 2 + √d2 + t2 v 2 c)2 · ∆c (7) In diese Gleichung wird nun für v = 11, 5km/h ≈ 3, 194m/s, ∆v = 0, 5km/h ≈ 0, 1389m/s, d = 2m, ∆d = 0, 1m, c = 342m/s, ∆c = 10m/s und t = 4s eingesetzt. Dies ergibt einen absoluten statistischen Fehler von: ′ ≈ 3, 74Hz ∆fstat Dieser wird nun in einen relativen Fehler umgerechnet: ′ ∆fstat 3, 74Hz = ≈ 0, 07 ′ f −f 53, 5Hz David Wander 2012 20 Der Dopplereffekt B.1 Fehlerbetrachtung Um den Gesamtfehler zu erhalten werden nun alle systematischen Fehler und der relative statistische Fehler addiert, da sie sich im schlechtesten Fall alle überlagern: ′ ∆fGes = 0, 01 + 0, 025 + 0, 025 + 0, 005 + 0, 07 = 0, 135 Die Werte stehen hierbei in dieser Reihenfolge für den nicht ausgeglichenen Fehler, der durch den konstanten Gegenwind entsteht, für denjenigen, der durch die Auflösungsgrenze der FFT zustandekommt, den ungenauen Abstand des Mikrofones von der Fahrtstrecke, 0, 5% sonstige Fehler, die nicht berücksichtigt wurden und schließlich der statistische Fehler. Somit kommt man schließlich auf einen relativen Gesamtfehler von 13, 5%. Die Fehlerrechnung für die anderen Versuche wurde analog zu diesem Beispiel durchgeführt. [8] [9] [10] Im Folgenden werden die angenommenen Werte und der daraus resultierende Fehler für die verschiedenen oben ausgewerteten Experimente tabellarisch dargestellt. Die Rechnung wurde analog zu obigem Beispiel durchgeführt. Abbildung 21: Rechnung mit dem Beispiel aus Kapitel ‘Fehlerbetrachtung’ und des ersten Ergebnisgrafen (Vergleich der Messkurve mit der Theorie - Abb. 10). Die Fehlerrechnung des zweiten Ergebnisses (Grenzfall Bewegung direkt auf den Beobachter zu - Abb. ??) muss etwas anders durchgeführt werden als das Beispiel. Dies ist notwendig, da hier Formel ??: f′ = f 1 1+ v c betrachtet wird. Prinzipiell wird der Größtfehler hier genauso wie oben erklärt berechnet. Es werden also die partiellen Ableitungen nach v und c gebildet und mit dem jeweiligen Fehler multipliziert: ∂f ∂f ∆fstat = · ∆v + · ∆c ∂v ∂c Setzt man die partiellen Ableitungen ein, erhält man: fv f · ∆v + · ∆c ∆fstat = − v 2 2 c( c + 1) (v + c) David Wander 2012 21 Der Dopplereffekt B.1 Fehlerbetrachtung Um nun den absoluten systematischen Größtfehler bei v = 11, 5km/h zu bestimmen wird f = 5502Hz, v = 3, 194m/s, c = 342m/s, ∆v = 0, 139m/s und ∆c = 10m/s eingesetzt. Somit erhält man: ∆fstat ≈ 3, 67Hz. Bei einer Verschiebung von 53, 6Hz, die bei dieser Geschwindigkeit gemessen wurde, entspricht das 3,67Hz 53,6Hz ≈ 0, 068 also etwa 6, 8%. Zu diesem statistischen Fehler müssen nun noch die systematischen Fehler addiert werden, um den Gesamtfehler zu bestimmen. Hierbei spielt jedoch der systematische Abstandsfehler des Mikrofones von der Geraden keine Rolle. Es gilt also: ∆fGes = 0, 068 + 0, 01 + 0, 025 + 0, 005 = 0, 108 Mit 1% Fehler durch den Wind, 2, 5% durch die Auswertung und 0, 5% sonstige Fehler. Der relative Fehler beträgt also etwa 10, 8%, der absolute Fehler beläuft sich also auf 53, 6Hz ·0, 108 ≈ 5, 8Hz. Für die Grafik wurde außerdem der Größtfehler bei v = 36km/h bestimmt. Setzt man die entsprechenden Werte in die Rechnung von eben ein, erhält man für v = 36km/h einen absoluten statistischen Größtfehler von 6, 55Hz 6,55Hz ≈ 0, 039 also etwa 3, 9% entspricht. Somit erhält man welcher einem relativen Größtfehler von 169,3Hz für den Gesamtfehler ∆fGes = 0, 039 + 0, 01 + 0, 008 + 0, 005 = 0, 062, also 6, 2%. Dies entspricht einem absoluten Größtfehler von 169, 3Hz · 0, 062 ≈ 10, 5Hz. Für die anderen beiden Experimente (Einfluss der Geschwindigkeit - Abb. 11 - und des Abstandes - Abb. 12 - auf die Kurvenform) muss wieder die im Unterkapitel ‘Fehlerbetrachtung’ vorgestellte Rechnung durchgeführt werden. Die Ergebnisse der verschiedenen Berechnungen sind in den folgenden zwei Tabellen dargestellt. Abbildung 22: Fehlerrechnung für den Einfluss der Geschwindigkeit - Abb. 11. David Wander 2012 22 Der Dopplereffekt C. Weitere getestete Messobjekte Abbildung 23: Fehlerrechnung für den Einfluss des Abstandes - Abb. 12. C C.1 Weitere getestete Messobjekte Modellflugzeug Als nächstes Messobjekt wurde ein Modellflugzeug ausgewählt, da dieses einen markanten und konstanten Ton aussendet. Da ich selbst jedoch keines besitze, dient das unter [2] aufgeführte Video als Quelle. Abbildung 24: Analyseergebnis Modellflugzeug. Wegen der erheblich niedrigeren Senderfrequenz (etwa 400Hz im Vergleich zu 5500Hz bei dem Vorexperiment) sieht man hier schon deutliche Stufen im Kurvenverlauf. Diese sind auf die begrenzte Auflösung David Wander 2012 23 Der Dopplereffekt C.2 Motorrad der FFT (etwa 2, 7Hz) zurückzuführen. Je geringer die Frequenz, desto größer wird folglich also der relative Fehler der dadurch zustande kommt. Des weiteren stehen bei dem Video keine Informationen zur tatsächlichen Geschwindigkeit des Flugzeugs zum Vergleich zur verfügung und auch die Temperatur ist unbekannt. Es kann daher keine genaue Aussage zur Qualität des Messergebnisses gemacht werden, in etwa scheinen die Messwerte jedoch plausibel. C.2 Motorrad Einige kennen ihn vielleicht aus dem Internet, den Ghost Rider, der mit seinem Motorrad angeblich unvorstellbare Geschwindigkeiten von über 300km/h erreicht. Doch ist er wirklich so schnell wie er behauptet? Es war nicht leicht für die Analyse geeignete Szenen zu finden, da die meisten Videos per OnboardKamera gefilmt wurden und somit keine auswertbare Information enthalten oder mit Musik unterlegt sind, sodass man das Motorgeräusch nicht mehr hört. Nach einiger Suche konnte ich jedoch das unter [3] aufgeführte Video finden. Abbildung 25: Analyseergebnis Motorrad. Hier konnte trotz beträchtlicher Störgeräusche der Autos sowie unterlegter Musik ein verwertbares Signal ermittelt werden. Die errechnete Geschwindigkeit scheint realistisch zu sein. Für die Berechnung des Abstandes liegen wegen der hohen Geschwindigkeit wieder die gleichen Probleme wie bei der Formel-1 vor, das Ergebnis ist also nur eine sehr grobe Näherung. Die gemessenen 253, 47km/h liegen deutlich unter den angegebenen Höchstgeschwindigkeiten des Ghost Riders, wegen der hohen Verkehrsdichte bei dieser Aufnahme halte ich es jedoch für wahrscheinlich, dass er hier nicht die Möglichkeiten seiner Maschine ausgereizt hat. David Wander 2012 24 Der Dopplereffekt D D. Quellcode Quellcode Im Folgenden wird der Quellcode des Analyseprogrammes gezeigt. D.1 main.cpp Listing 1: main.cpp 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 # include # include # include # include # include < windows .h > < mmsystem .h > < vector > < math .h > < algorithm > # include < iostream > # include " fftw3 . h " # include " Konstanten . h " struct Puffer { CHAR Puf [ static_cast < int >( PUFFERGROESSE ) ]; WAVEHDR Header ; }; struct ThreadData { double Data [ static_cast < int >( PUFFERGROESSE *8/ BITSPROSAMPLE ) ]; HWND hwnd ; unsigned int ID ; }; struct FitData { std :: vector < double > * MaxFreq ; std :: vector < int > * Auswahl ; double F ; double VMS ; double C ; double Nullpkt ; double D ; HWND hwnd ; }; # include # include # include # include " A ud io Fu n kt io ne n . h " " AnalyseFunktionen .h" " GrafikFunktionen .h" " Einstellungen . h " /* Declare Windows p r o c e d u r e */ LRESULT CALLBACK Wi n do wP ro c ed ur e ( HWND , UINT , WPARAM , LPARAM ) ; /* Make the class name into a global variable char szClassName [ ] = " Dopplerradar " ; */ HINSTANCE hInst ; int WINAPI WinMain ( HINSTANCE hThisInstance , HINSTANCE hPrevInstance , LPSTR lpszArgument , int nCmdShow ) { HWND hwnd ; /* This is the handle for our window */ MSG messages ; /* Here messages to the a p p l i c a t i o n are saved */ WNDCLASSEX wincl ; /* Data s t r u c t u r e for the w i n d o w c l a s s */ /* The Window s t r u c t u r e */ David Wander 2012 25 Der Dopplereffekt 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 D.1 main.cpp hInst = hThisInstance ; wincl . hInstance = hThisInstance ; wincl . lpszClassName = szClassName ; wincl . lpfnWndProc = Wi nd ow P ro ce du r e ; wincl . style = CS_DBLCLKS ; wincl . cbSize = sizeof ( WNDCLASSEX ) ; /* This function is called by windows */ /* Catch double - clicks */ /* Use default icon and mouse - pointer */ wincl . hIcon = LoadIcon ( NULL , I DI _ AP PL IC A TI ON ) ; wincl . hIconSm = LoadIcon ( NULL , ID I_ A PP LI CA T IO N ) ; wincl . hCursor = LoadCursor ( NULL , IDC_ARROW ) ; wincl . lpszMenuName = szClassName ; /* No menu */ wincl . cbClsExtra = 0; /* No extra bytes after the window class */ wincl . cbWndExtra = 0; /* s t r u c t u r e or the window instance */ /* Use Windows ’s default colour as the b a c k g r o u n d of the window */ wincl . hbrBackground = ( HBRUSH ) COLOR_3DFACE ; /* Register the window class , and if it fails quit the program */ if (! R eg is te r Cl as sE x (& wincl ) ) return 0; // / Einstellungs - Klasse r e g i s t r i e r e n wincl . lpszMenuName = NULL ; wincl . lpszClassName = TEXT ( " Einstellungen " ) ; wincl . lpfnWndProc = E i n s t e l l u n g e n P r o c e d u r e ; Re gi s te rC la s sE x (& wincl ) ; /* The class is registered , hwnd = Cr eateWind owEx ( 0, szClassName , " Dopplerradar " , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT , CW_USEDEFAULT , 1000 , 550 , HWND_DESKTOP , NULL , hThisInstance , NULL ); let ’s create the program */ /* Extended p o s s i b i l i t e s for v a r i a t i o n */ /* C l a s s n a m e */ /* Title Text */ /* default window */ /* Windows decides the position */ /* where the window ends up on the screen */ /* The programs width */ /* and height in pixels */ /* The window is a child - window to desktop */ /* No menu */ /* Program Instance handler */ /* No Window Creation data */ /* Make the window visible on the screen */ ShowWindow ( hwnd , nCmdShow ) ; /* Run the message loop . It will run until G e t M e s s a g e () returns 0 */ while ( GetMessage (& messages , NULL , 0 , 0) ) { /* T r a n s l a t e virtual - key messages into c h a r a c t e r messages */ T r a n s l a t e M e s s a ge (& messages ) ; /* Send message to W i n d o w P r o c e d u r e */ Di sp at c hM es s ag e (& messages ) ; } /* The program return - value is 0 - The value that P o s t Q u i t M e s s a g e () gave */ return messages . wParam ; } /* This function is called by the Windows function D i s p a t c h M e s s a g e () */ LRESULT CALLBACK Wi nd o wP ro ce d ur e ( HWND hwnd , UINT message , WPARAM wParam , LPARAM lParam ) { static HWND hwndButStart , hwndButStop , hwndReset , hwndTemp , hwndAnalyse ; static HWND h w n d E i n s t e l l u n g e n ; static HWAVEIN inHandle ; static std :: vector < ThreadData > AudioPuffer ; static std :: vector < double > MaxFreq ; David Wander 2012 26 Der Dopplereffekt 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 static static static static D.1 main.cpp unsigned int ct ; bool Aufnahme ; Puffer Puffer1 , Puffer2 ; bool bPuffer1 ; static std :: vector < int > Auswahl ; static bool bZeigeMinMax ; static bool bZeigeF ; static bool bZeigeTheorie ; static bool bZeigeC ; static bool bZ eigeRaus chen ; static bool bZeigeAuswahl ; static bool b A u t o m a t i s c h A n a l y s i e r e n ; static bool * bZeige [] = {& bZeigeMinMax ,& bZeigeF ,& bZeigeTheorie ,& bZeigeC ,& bZeigeRauschen ,& bZeigeAuswahl ,& b A u t o m a t i s c h A n a l y s i e r e n }; static double Min ; static double Max ; static double F ; static double VMS , VKMH ; static double D ; static double C ; static double Nullpkt ; static FitData fd ; static HMENU hMenu ; static HFONT hFontX , hFontY ; static bool b M a n u e l l e A u s w a h l ; static int iStart , iStop ; HDC hdc ; PAINTSTRUCT ps ; switch ( message ) /* handle the messages */ { case WM_CREATE : { hwndButStart = CreateWindow ( " button " ," Start " , WS_VISIBLE | WS_CHILD ,10 ,40 ,180 ,30 , hwnd ,( HMENU ) IDM_START , NULL , NULL ) ; hwndButStop = CreateWindow ( " button " ," Stop " , WS_VISIBLE | WS_CHILD ,10 ,80 ,180 ,30 , hwnd ,( HMENU ) IDM_STOP , NULL , NULL ) ; hwndAnalyse = CreateWindow ( " button " ," Analyse " , WS_VISIBLE | WS_CHILD ,10 ,120 ,180 ,30 , hwnd ,( HMENU ) IDM_ANALYSE , NULL , NULL ) ; hwndReset = CreateWindow ( " button " ," Reset " , WS_VISIBLE | WS_CHILD ,10 ,160 ,180 ,30 , hwnd ,( HMENU ) IDM_RESET , NULL , NULL ) ; hwndTemp = CreateWindow ( " edit " ," 20 " , WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_BORDER ,83 ,230 ,36 ,20 , hwnd , NULL , NULL , NULL ) ; hMenu = GetMenu ( hwnd ) ; // Init V a r i a b l e n ct = 0; F = -1; Min = -1; Max = -1; VMS = -1; VKMH = -1; D = -1; C = -1; Aufnahme = false ; bZeigeAuswahl = true ; bZeigeMinMax = true ; bZeigeF = true ; bZeigeTheorie = true ; bZeigeC = false ; bZe igeRaus chen = true ; b A u t o m a t i s c h A n a l y s i e r e n = true ; b M a n u e l l e A u s w a h l = false ; iStart = -1; iStop = -1; David Wander 2012 27 Der Dopplereffekt 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 D.1 main.cpp // 90 ◦ G e d r e h t e n Font erstellen , für B e s c h r i f t u n g der Y - Achse LOGFONT lf ; lf . lfHeight =16; lf . lfWidth =9; lf . lfEscapement =0; lf . lfOrientation =3; lf . lfWeight = FW_SEMIBOLD ; lf . lfItalic = false ; lf . lfUnderline = false ; lf . lfStrikeOut = false ; lf . lfCharSet = H A NG EU L_ C HA RS E T ; lf . lfOut Precisio n = O U T _ T T _ O N L Y _ P R E C I S ; lf . l fC l ip Pr ec i si on = CLIP_MASK ; lf . lfQuality = PROOF_QUALITY ; lf . l f P i t c hA n d F a m i l y = DEFAULT_PITCH ; lf . lfFaceName [ LF_FACESIZE ]= ’D ’; hFontX = C r e a t e F o n t I n d i r e c t ( & lf ) ; lf . lfEscapement =900; hFontY = C r e a t e F o n t I n d i r e c t ( & lf ) ; break ; } case WM_COMMAND : { switch ( LOWORD ( wParam ) ) { case IDM_START : { if ( Aufnahme ) break ; if (! InitAudio ( hwnd ,& inHandle ) ) { MessageBox ( hwnd , " Es kann nicht auf das Mikrofon zugegriffen werden ! " ," Fehler " ,0) ; break ; } 228 229 230 231 232 233 if (! A u d i o P u f f e r H i n z f g ( inHandle ,& Puffer1 ) ) { MessageBox ( hwnd , " Beim I nitialis ieren des Audiopuffers ist ein Fehler aufgetreten . " ," Fehler " ,0) ; S chliesse Audio ( inHandle ,& Puffer1 ,& Puffer2 ) ; break ; } if (! A u d i o P u f f e r H i n z f g ( inHandle ,& Puffer2 ) ) { MessageBox ( hwnd , " Beim I nitialis ieren des Audiopuffers ist ein Fehler aufgetreten . " ," Fehler " ,0) ; S chliesse Audio ( inHandle ,& Puffer1 ,& Puffer2 ) ; break ; } 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 if ( waveInStart ( inHandle ) != M M S Y S E R R_ N O E R R O R ) { MessageBox ( hwnd , " Die Aufnahme konnte nicht gestartet werden . " ," Fehler " ,0) ; S chliesse Audio ( inHandle ,& Puffer1 ,& Puffer2 ) ; } Aufnahme = true ; break ; } case IDM_STOP : { waveInStop ( inHandle ) ; Aufnahme = false ; Auswahl . clear () ; if (! Ku rv e Au sw ae h le n (& MaxFreq ,& Auswahl ) ) break ; // Wenn nichts a u s g e w ä h l t werden konnte -> a b b r e c h e n David Wander 2012 28 Der Dopplereffekt 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 D.1 main.cpp if (! b A u t o m a t i s c h A n a l y s i e r e n ) { break ;} } case IDM_ANALYSE : { Min = -1; Max = -1; F = -1; VMS = -1; VKMH = -1; D = -1; In validat eRect ( hwnd , NULL , true ) ; if ( Auswahl . size () <1) { break ;} Max = MaxAusAuswahl (& MaxFreq ,& Auswahl ) ; Min = MinAusAuswahl (& MaxFreq ,& Auswahl ) ; F =2* Max * Min /( Max + Min ) ; // B e s t i m m u n g der S e n d e r f r e u q e n z // Berechne C anhand der T e m p e r a t u r char TMP [ G e t W i n d o w T e x t L e n g t h ( hwndTemp ) +1]; GetWindowText ( hwndTemp , TMP , G e t W i n d o w T e x t L e n g t h ( hwndTemp ) +1) ; double Temp = static_cast < double >( atof ( TMP ) ) ; if ( Temp == 0) { SetWindowText ( hwndTemp , " 20 " ) ; Temp = 20;} C = sqrt ( RSLUFT *( Temp +273.15) * KAPPA ) ; VMS = F * C / Min - C ; // G e s c h w i n d i g k e i t in m / s VKMH = VMS *3.6; // G e s c h w i n d i g k e i t in km / h Nullpkt = Nullpunkt (& MaxFreq ,& Auswahl , F ) ; if ( Nullpkt < 0) { break ;} fd . Auswahl = & Auswahl ; fd . C = C ; fd . F = F ; fd . hwnd = hwnd ; fd . MaxFreq = & MaxFreq ; fd . Nullpkt = Nullpkt ; fd . VMS = VMS ; if ( CreateThread ( NULL , NULL , ThreadFit , & fd , NULL , NULL ) == NULL ) { MessageBox ( hwnd , " Fehler beim Erstellen des Threads zum Berechnen des Abstandes " ," Fehler " ,0) ; break ; } In validat eRect ( hwnd , NULL , true ) ; break ; } case IDM_RESET : { AudioPuffer . clear () ; MaxFreq . clear () ; Auswahl . clear () ; Min = -1; Max = -1; F = -1; VMS = -1; VKMH = -1; D = -1; ct = 0; In validat eRect ( hwnd , NULL , true ) ; break ; } case IDM_BEENDEN : { DestroyWindow ( hwnd ) ; break ; } case IDM_MINMAX : case IDM_F : David Wander 2012 29 Der Dopplereffekt 328 329 330 331 332 333 334 D.1 main.cpp case case case case case { * bZeige [ LOWORD ( wParam ) - IDM_MINMAX ]= !* bZeige [ LOWORD ( wParam ) IDM_MINMAX ]; if (* bZeige [ LOWORD ( wParam ) - IDM_MINMAX ]) { CheckMenuItem ( hMenu , LOWORD ( wParam ) , MF_CHECKED ) ;} else { CheckMenuItem ( hMenu , LOWORD ( wParam ) , MF_UNCHECKED ) ;} In validat eRect ( hwnd , NULL , true ) ; break ; 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 IDM_THEORIE : IDM_C : IDM_RAUSCHEN : IDM_AUSWAHL : I DM _A N AL YS IE R EN : } case I D M _ E I N S T E L L U N G E N : { h w n d E i n s t e l l u n g e n = CreateWindow ( " Einstellungen " ," Erweiterte Einstellungen " , WS_VISIBLE ,150 ,200 ,400 ,330 , hwnd , NULL , NULL , NULL ) ; break ; } case IDM_MANUELL : { b M a n u e l l e A u s w a h l = true ; SetFocus ( hwnd ) ; In validat eRect ( hwnd , NULL , true ) ; break ; } } break ; } case WIM_DATA : { Puffer * PufferTMP ; if ( bPuffer1 ) { PufferTMP = & Puffer2 ; } else { PufferTMP = & Puffer1 ; } if (! A u d i o P u f f e r H i n z f g ( inHandle , PufferTMP ) ) { MessageBox ( hwnd , " Beim In itialis ieren des Audiopuffers ist ein Fehler aufgetreten . " ," Fehler " ,0) ; Sc hliesseA udio ( inHandle ,& Puffer1 ,& Puffer2 ) ; break ; } ThreadData tdTMP ; tdTMP . hwnd = hwnd ; tdTMP . ID = ct ; AudioPuffer . push_back ( tdTMP ) ; double dtmp =0; MaxFreq . push_back ( dtmp ) ; for ( int i = 0; i < PUFFERGROESSE *8/ BITSPROSAMPLE ; i ++) { AudioPuffer . at ( ct ) . Data [ i ] = static_cast < double >( PufferTMP - > Puf [ i ]) ; } if ( CreateThread ( NULL , NULL , ThreadFFT , & AudioPuffer . at ( ct ) , NULL , NULL ) == NULL ) { MessageBox ( hwnd , " Fehler beim Erstellen des Threads " ," Fehler " ,0) ; Sc hliesseA udio ( inHandle ,& Puffer1 ,& Puffer2 ) ; break ; } ct ++; David Wander 2012 30 Der Dopplereffekt 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 D.1 main.cpp break ; } case T H R E A D F F T _ E R G E B N I S : { MaxFreq . at ( wParam ) = ( double ) lParam ; Inv alidate Rect ( hwnd , NULL , true ) ; break ; } case T H R E A D F I T _ E R G E B N I S : { D = fd . D ; Inv alidate Rect ( hwnd , NULL , true ) ; break ; } case WM_PAINT : { hdc = BeginPaint ( hwnd ,& ps ) ; // T h e o r e t i s c h e Kurve HGDIOBJ objDavor = SelectObject ( hdc , CreatePen ( PS_SOLID ,1 , RGB (200 ,100 ,0) ) ) ; if ( bZeigeTheorie && D >0) { for ( int i = 0; i < GRAFIKSY ; i ++) { double t = i * PAKETLAENGE /5 - Nullpkt ; double Theorie = F /(1+ pow ( VMS ,2) * t /( C * sqrt ( pow (D ,2) + pow ( VMS ,2) * pow (t ,2) ) ) ) ; int YBildschirm = GRAFIKY - GRAFIKSY *(( Theorie - F R EQ UN TE R GR EN ZE ) /( FREQOBERGRENZE - FR E QU NT ER G RE NZ E ) ) ; // U m r e c h n u n g der Frequenz in Y - K o o r d i n a t e des B i l d s c h i r m e s if ( i ==0) { MoveToEx ( hdc , GRAFIKX , YBildschirm , NULL ) ;} else { LineTo ( hdc , GRAFIKX +i , YBildschirm ) ; } } } SelectObject ( hdc , objDavor ) ; // Balken für Minimum und Maximum der Auswahl if ( bZeigeMinMax && Max >=0&& Min >=0) { // Max ZeichneBalken ( hdc , Max , RGB (0 ,0 ,170) ) ; // Min ZeichneBalken ( hdc , Min , RGB (170 ,0 ,0) ) ; } // Balken für die S e n d e f r e q u e n z if ( bZeigeF && F >=0) { ZeichneBalken ( hdc ,F , RGB (50 ,50 ,50) ) ; } // / Legende // Achsen MoveToEx ( hdc , GRAFIKX , GRAFIKY , NULL ) ; LineTo ( hdc , GRAFIKX + GRAFIKSX , GRAFIKY ) ; MoveToEx ( hdc , GRAFIKX , GRAFIKY , NULL ) ; LineTo ( hdc , GRAFIKX , GRAFIKY - GRAFIKSY ) ; // B e s c h r i f t u n g Y - Achse for ( int i = 0; i < 11; i ++) { MoveToEx ( hdc , GRAFIKX , GRAFIKY - i * GRAFIKSY /10 , NULL ) ; LineTo ( hdc , GRAFIKX -5 , GRAFIKY - i * GRAFIKSY /10) ; char TMP [10]; itoa ( FR E QU NT ER G RE NZ E +( FREQOBERGRENZE - FR EQ U NT ER GR E NZ E ) /10* i , TMP ,10) ; TextOut ( hdc , GRAFIKX -50 , GRAFIKY - i * GRAFIKSY /10 -10 , TMP , strlen ( TMP ) ) ; } SIZE size ; HGDIOBJ hDavor = ( HFONT ) SelectObject ( hdc , hFontY ) ; David Wander 2012 31 Der Dopplereffekt 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 D.1 main.cpp G e t T e x t E x t e n t P o i n t 3 2 ( hdc , " Frequenz [ Hz ] " ,13 ,& size ) ; // Länge auf B i l d s c h i r m ermitteln TextOut ( hdc , GRAFIKX -70 , GRAFIKY - GRAFIKSY /2+ size . cx /2 , " Frequenz [ Hz ] " ,13) ; SelectObject ( hdc , hDavor ) ; // B e s c h r i f t u n g X - Achse for ( int i = 0; i <11; i ++) { MoveToEx ( hdc , GRAFIKX + i * GRAFIKSX /10 , GRAFIKY , NULL ) ; LineTo ( hdc , GRAFIKX + i * GRAFIKSX /10 , GRAFIKY +5) ; char TMP [10]; if ( PAKETLAENGE <0.25) { sprintf ( TMP , " %5.1 f " ,12* PAKETLAENGE * i ) ;} else { itoa (12* PAKETLAENGE *i , TMP ,10) ;} TextOut ( hdc , GRAFIKX + i * GRAFIKSX /10 -10 , GRAFIKY +10 , TMP , strlen ( TMP ) ) ; } hDavor = ( HFONT ) SelectObject ( hdc , hFontX ) ; G e t T e x t E x t e n t P o i n t 3 2 ( hdc , " Zeit [ s ] " ,8 ,& size ) ; // Länge auf B i l d s c h i r m e r m i t t e l n TextOut ( hdc , GRAFIKX + GRAFIKSX /2 - size . cx /2 , GRAFIKY +30 , " Zeit [ s ] " ,8) ; SelectObject ( hdc , hDavor ) ; // / Ausgabe der Daten if ( MaxFreq . size () >0) MoveToEx ( hdc , GRAFIKX , YBILDSCHIRM ( MaxFreq . at (0) ) , NULL ) ; for ( int i = 1; i < MaxFreq . size () ; i ++) { MoveToEx ( hdc , GRAFIKX +( i -1) *5 , YBILDSCHIRM ( MaxFreq . at (i -1) ) , NULL ) ; if ( Auswahl . size () >0) { if (! bZeigeAuswahl && i > Auswahl . front () && i <= Auswahl . back () ) { continue ;} if (! bZe igeRaus chen && ( i <= Auswahl . front () || i > Auswahl . back () ) ) { continue ;} int iv1 = E nthaeltV ector (& Auswahl ,i -1) ; int iv2 = E nthaeltV ector (& Auswahl , i ) ; if ( iv1 >=0&& iv2 >=0) { SelectObject ( hdc , CreatePen ( PS_SOLID ,1 , RGB (0 ,170 ,20) ) ) ;} else { SelectObject ( hdc , CreatePen ( PS_SOLID ,1 , RGB (0 ,0 ,0) ) ) ;} } LineTo ( hdc , GRAFIKX + i *5 , YBILDSCHIRM ( MaxFreq . at ( i ) ) ) ; } // T e m p e r a t u r E i n g a b e f e l d B e s c h r i f t u n g RECT rc ; rc . left = 0; rc . right = 200; rc . top = 212; rc . bottom = rc . top +20; DrawText ( hdc , " Temperatur [ ◦ C ] " ,14 ,& rc , DT_SINGLELINE | DT_CENTER ) ; rc . top = 330; rc . bottom = rc . top +20; DrawText ( hdc , " Ge sc h wi nd ig k ei t [ m / s ] " ,20 ,& rc , DT_SINGLELINE | DT_CENTER ) ; char TMP [20]; sprintf ( TMP , " %5.2 f " , VMS ) ; if ( VMS < 0) { strcpy ( TMP , " --" ) ;} rc . top = 352; rc . bottom = rc . top +20; DrawText ( hdc , TMP , strlen ( TMP ) ,& rc , DT_SINGLELINE | DT_CENTER ) ; rc . top = 390; rc . bottom = rc . top +20; DrawText ( hdc , " Ge sc h wi nd ig k ei t [ km / h ] " ,21 ,& rc , DT_SINGLELINE | DT_CENTER ) ; sprintf ( TMP , " %5.2 f " , VKMH ) ; if ( VKMH < 0) { strcpy ( TMP , " --" ) ;} rc . top = 412; rc . bottom = rc . top +20; DrawText ( hdc , TMP , strlen ( TMP ) ,& rc , DT_SINGLELINE | DT_CENTER ) ; rc . top = 440; rc . bottom = rc . top +20; DrawText ( hdc , " Abstand [ m ] " ,10 ,& rc , DT_SINGLELINE | DT_CENTER ) ; sprintf ( TMP , " %5.2 f " ,D ) ; David Wander 2012 32 Der Dopplereffekt 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 D.1 main.cpp if ( D < 0) { strcpy ( TMP , " --" ) ;} rc . top = 462; rc . bottom = rc . top +20; DrawText ( hdc , TMP , strlen ( TMP ) ,& rc , DT_SINGLELINE | DT_CENTER ) ; if ( bZeigeC ) { rc . top = 260; rc . bottom = rc . top +20; DrawText ( hdc , " S c h a l l g e s c h w i n d i g k e i t [ m / s ] " ,26 ,& rc , DT_SINGLELINE | DT_CENTER ) ; sprintf ( TMP , " %5.1 f " ,C ) ; if ( C < 0) { strcpy ( TMP , " --" ) ;} rc . top = 282; rc . bottom = rc . top +20; DrawText ( hdc , TMP , strlen ( TMP ) ,& rc , DT_SINGLELINE | DT_CENTER ) ; } if ( b M a n u e ll e A u s w a h l ) { TextOut ( hdc ,600 ,20 , " Manueller Auswahlmodus : " ,23) ; TextOut ( hdc ,600 ,37 , " Linksklick um Start festzulegen " ,31) ; TextOut ( hdc ,600 ,54 , " Rechtsklick um Ende festzulegen " ,32) ; TextOut ( hdc ,600 ,71 , " Enter zum Bestätigen " ,20) ; TextOut ( hdc ,600 ,88 , " Escape zum Abbrechen " ,20) ; if ( iStart > 0) { HGDIOBJ objDavor = SelectObject ( hdc , CreatePen ( PS_SOLID ,1 , RGB (0 ,150 ,200) ) ) ; MoveToEx ( hdc , GRAFIKX + iStart *5 , GRAFIKY -1 , NULL ) ; LineTo ( hdc , GRAFIKX + iStart *5 , GRAFIKY - GRAFIKSY ) ; SelectObject ( hdc , objDavor ) ; } if ( iStop > 0) { HGDIOBJ objDavor = SelectObject ( hdc , CreatePen ( PS_SOLID ,1 , RGB (80 ,0 ,0) ) ); MoveToEx ( hdc , GRAFIKX + iStop *5 , GRAFIKY -1 , NULL ) ; LineTo ( hdc , GRAFIKX + iStop *5 , GRAFIKY - GRAFIKSY ) ; SelectObject ( hdc , objDavor ) ; } } EndPaint ( hwnd ,& ps ) ; break ; } case WM_LBUTT ONDOWN : { if (! b M a n u e l l e A u s wa h l ) break ; POINTS pt = MAKEPOINTS ( lParam ) ; int xPos = pt . x ; if ( xPos > GRAFIKX && ( xPos - GRAFIKX ) /5 < MaxFreq . size () && ( iStop < 0 || ( xPos - GRAFIKX ) /5 < iStop ) ) { iStart = ( xPos - GRAFIKX ) /5; } Inv alidate Rect ( hwnd , NULL , true ) ; break ; } case WM_RBUTT ONDOWN : { if (! b M a n u e l l e A u s wa h l ) break ; POINTS pt = MAKEPOINTS ( lParam ) ; int xPos = pt . x ; if ( xPos > GRAFIKX && ( xPos - GRAFIKX ) /5 < MaxFreq . size () && ( iStart < ( xPos GRAFIKX ) /5) ) { iStop = ( xPos - GRAFIKX ) /5; } Inv alidate Rect ( hwnd , NULL , true ) ; David Wander 2012 33 Der Dopplereffekt 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 D.2 AnalyseFunktionen.h break ; } case W M _ L B U T T O N D B L C L K : { POINTS pt = MAKEPOINTS ( lParam ) ; int xPos = pt . x ; if ( xPos > GRAFIKX && ( xPos - GRAFIKX ) /5 < MaxFreq . size () ) { int i = Entha eltVecto r (& Auswahl ,( xPos - GRAFIKX ) /5) ; if (i <0) { Auswahl . push_back (( xPos - GRAFIKX ) /5) ;} else { Auswahl . erase ( Auswahl . begin () + i ) ;} } Inv alidate Rect ( hwnd , NULL , true ) ; break ; } case WM_KEYDOWN : { switch ( wParam ) { case VK_RETURN : { if (! b M a n u e l l e A u s w a h l ) break ; Auswahl . clear () ; for ( int i = iStart ; i <= iStop ; i ++) { Auswahl . push_back ( i ) ; } b M a n u e l l e A u s w a h l = false ; iStart = -1; iStop = -1; In validat eRect ( hwnd , NULL , true ) ; WPARAM wpar ; wpar = LOWORD ( IDM_ANALYSE ) & HIWORD (0) ; SendMessage ( hwnd , WM_COMMAND , wpar , NULL ) ; break ; } case VK_ESCAPE : { if (! b M a n u e l l e A u s w a h l ) break ; b M a n u e l l e A u s w a h l = false ; iStart = -1; iStop = -1; In validat eRect ( hwnd , NULL , true ) ; break ; } } break ; } case WM_DESTROY : Sch liesseA udio ( inHandle ,& Puffer1 ,& Puffer2 ) ; Po st Q ui tM es s ag e (0) ; /* send a WM_QUIT to the message queue */ break ; default : /* for messages that we don ’t deal with */ return DefWindowProc ( hwnd , message , wParam , lParam ) ; } return 0; } D.2 AnalyseFunktionen.h Listing 2: main.cpp 1 2 3 4 5 6 DWORD WINAPI ThreadFFT ( LPVOID lpParams ) // ü bergebe { ThreadData * td = ( ThreadData *) lpParams ; David Wander 2012 34 Der Dopplereffekt 7 8 9 10 11 int N = PUFFERGROESSE *8/ BITSPROSAMPLE ; double * in ; // Pointer auf Input - Array double * out ; // Pointer auf Output - Array in = ( double *) fftw_malloc ( sizeof ( double ) * N ) ; vorbereiten out = ( double *) fftw_malloc ( sizeof ( double ) * N ) ; 12 13 14 for ( int i = 0; i < N ; i ++) // kopiere Daten ins Input - Array { in [ i ] = td - > Data [ i ]; } fftw_execute ( plan ) ; // FFT a u s f ü h r e n double FFTSchritt = SAMPLERATE for ( int i = 1; i < N /2; i ++) // In A m p l i t u d e n u m r e c h n e n { Amplitude [ i ] = sqrt ( pow ( out [ i ] ,2) + pow ( out [N - i ] ,2) ) ; // out [ i ] = reeler Teil ; out [N - i ] = i m a g i n ä r e r Teil } // finde Frequenz mit der m a x i m a l e n A m p l i t u d e double maxAmplitude = 0; int Index = 0; int Obergrenze = (( FRE QOBERGRE NZE / FFTSchritt ) <( N /2) ?( F REQOBER GRENZE / FFTSchritt ) :( N /2) ); int Untergrenze = (( FR E QU NT ER G RE NZ E / FFTSchritt ) <( FREQOBE RGRENZE / FFTSchritt ) ?( F RE QU NT E RG RE NZ E / FFTSchritt ) :(0) ) ; for ( int i = Untergrenze ; i < Obergrenze ; i ++) { if ( Amplitude [ i ] > maxAmplitude ) { maxAmplitude = Amplitude [ i ]; Index = i ;} } 35 59 60 61 62 63 64 65 66 67 68 69 / N; double Amplitude [ N /2]; 29 30 31 32 33 34 52 53 54 55 56 57 58 // Input - und Output - Arrays fftw_plan plan = f ft w _ p l a n _ r 2 r _ 1 d (N , in , out , FFTW_R2HC , FFTW_ESTIMATE ) ; // P a r a m e t e r für die FFT e i n s t e l l e n 15 16 17 18 19 20 21 22 23 24 25 26 27 28 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 D.2 AnalyseFunktionen.h float MaxFreq =( float ) Index * FFTSchritt ; SendMessage ( td - > hwnd , THREADFFT_ERGEBNIS ,( WPARAM ) td - > ID ,( LPARAM ) MaxFreq ) ; // Sende dem // a u f r ä u m e n f f t w _ d e s t r o y _ p l a n ( plan ) ; fftw_free ( in ) ; fftw_free ( out ) ; return 0; } bool SucheGerade ( std :: vector < double > * Data , std :: vector < int > * Ergebnis , int StartIndex , int Laenge , double Abweichung ) { for ( unsigned int i = StartIndex ; i < Data - > size () ; i ++) { int ilaenge =0; for ( int j = i +1; j < Data - > size () ; j ++) { if ( Data - > at ( j ) > Data - > at ( i ) + Abweichung || Data - > at ( j ) < Data - > at ( i ) Abweichung ) { ilaenge = j - i ; break ;} } if ( ilaenge >= Laenge ) { if ( Ergebnis - > size () >0) { ilaenge += i - Ergebnis - > back () -1; i = Ergebnis - > back () +1;} for ( int j = 0; j < ilaenge ; j ++) { Ergebnis - > push_back ( i + j ) ; } return true ; } } David Wander 2012 35 Der Dopplereffekt 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 D.2 AnalyseFunktionen.h return false ; } int G e r a d e G r o e s s e r A l s ( std :: vector < double > * MaxFreq , std :: vector < int > * Auswahl , double GroesserAls ) { double d = -1; for ( int i = 0; i < Auswahl - > size () ; i ++) { double dtmp = MaxFreq - > at ( Auswahl - > at ( i ) ) ; if ( dtmp == d ) { return i ;} if ( dtmp > GroesserAls ) { d = dtmp ;} } return -1; } bool K ur ve Au s wa eh le n ( std :: vector < double > * MaxFreq , std :: vector < int > * Auswahl ) { int Index = 0; std :: vector < int > ZweiteGerade ; while ( Index < MaxFreq - > size () ) { if (! SucheGerade ( MaxFreq , Auswahl , Index , MINGERADENLAENGE , ABWEICHUNG ) ) return false ; ZweiteGerade . clear () ; if (! SucheGerade ( MaxFreq ,& ZweiteGerade , Auswahl - > back () +1 , MINGERADENLAENGE , ABWEICHUNG ) ) return false ; if ( MaxFreq - > at ( Auswahl - > at (0) ) > MaxFreq - > at ( ZweiteGerade . at (0) ) + 2* ABWEICHUNG ) // zweite Gerade ist mehr als 2* A b w e i c h u n g n i e d r i g e r als die Erste -> Kurve { for ( int i = Auswahl - > back () +1; i <= ZweiteGerade . back () ; i ++) { Auswahl - > push_back ( i ) ; } ZweiteGerade . clear () ; Index = Auswahl - > back () +1; while ( Index < MaxFreq - > size () ) { if (! SucheGerade ( MaxFreq ,& ZweiteGerade , Index , MINGERADENLAENGE , ABWEICHUNG ) ) { return true ;} if ( MaxFreq - > at ( Auswahl - > back () ) >= MaxFreq - > at ( ZweiteGerade . at (0) ) && MaxFreq - > at ( ZweiteGerade . at (0) ) > MaxFreq - > at ( Auswahl - > back () ) -2* ABWEICHUNG ) { for ( int i = 0; i < ZweiteGerade . size () ; i ++) { Auswahl - > push_back ( ZweiteGerade . at ( i ) ) ; } ZweiteGerade . clear () ; Index = Auswahl - > back () +1; } int ind = G e r a d e G r o e s s e r A l s ( MaxFreq ,& ZweiteGerade , MaxFreq - > at ( Auswahl - > back () ) -2* ABWEICHUNG ) ; // wenn das erste Element der zweiten Gerade kleiner ist als Auswahl - > back () -2* A B W E I C H U N G if ( ind >= 0) // / { Index = ZweiteGerade . front () + ind ; ZweiteGerade . clear () ; } // aber es weiter hinten in der Gerade einen Teil gibt , der größer ist als Auswahl - > back () -2* ABWEICHUNG , dann suche Gerade ab diesem Punkt else { return true ;} } return true ; } else if ( MaxFreq - > at ( Auswahl - > at (0) ) > MaxFreq - > at ( ZweiteGerade . at (0) ) ) // wenn die zweite Gerade nur etwas tiefer ist { // hänge zweite Gerade an erste an : for ( int i = 0; i < ZweiteGerade . size () ; i ++) { Auswahl - > push_back ( ZweiteGerade . at ( i ) ) ; David Wander 2012 36 Der Dopplereffekt 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 D.2 AnalyseFunktionen.h } ZweiteGerade . clear () ; Index = Auswahl - > back () +1; } else { Index = Auswahl - > back () +1; Auswahl - > clear () ; } } Auswahl - > clear () ; return false ; } double MaxAusAuswahl ( std :: vector < double > * MaxFreq , std :: vector < int > * Auswahl ) { double max =0; for ( int i = 0; i < Auswahl - > size () ; i ++) { if ( MaxFreq - > at ( Auswahl - > at ( i ) ) > max ) { max = MaxFreq - > at ( Auswahl - > at ( i ) ) ;} } return max ; } double MinAusAuswahl ( std :: vector < double > * MaxFreq , std :: vector < int > * Auswahl ) { double min = MaxFreq - > at ( Auswahl - > at (0) ) ; for ( int i = 1; i < Auswahl - > size () ; i ++) { if ( MaxFreq - > at ( Auswahl - > at ( i ) ) < min ) { min = MaxFreq - > at ( Auswahl - > at ( i ) ) ;} } return min ; } double Nullpunkt ( std :: vector < double > * MaxFreq , std :: vector < int > * Auswahl , double F ) { double Nullpunkt =0; for ( int i = Auswahl - > front () ;i < Auswahl - > back () ; i ++) { if ( MaxFreq - > at ( i ) <F ) { Nullpunkt = i ; break ; } } if ( Nullpunkt <1) { return -1;} return ( Nullpunkt -1) * PAKETLAENGE + PAKETLAENGE *( MaxFreq - > at ( Nullpunkt -1) -F ) /( MaxFreq - > at ( Nullpunkt -1) - MaxFreq - > at ( Nullpunkt ) ) ; } double Varianz ( std :: vector < double > * MaxFreq , std :: vector < int > * Auswahl , double F , double Nullpkt , double VMS , double C , double D ) { double Var = 0; if ( Auswahl - > size () <1) { return -1;} for ( int i = 0; i < Auswahl - > size () ; i ++) { double t = Auswahl - > at ( i ) * PAKETLAENGE - Nullpkt ; double Theorie = F /(1+ pow ( VMS ,2) * t /( C * sqrt ( pow (D ,2) + pow ( VMS ,2) * pow (t ,2) ) ) ) ; Var += pow ( MaxFreq - > at ( Auswahl - > at ( i ) ) - Theorie ,2) ; } return Var ; } double Fit ( FitData * fd , double DStart , double FitSchritt ) { double D = DStart ; double Var = Varianz ( fd - > MaxFreq , fd - > Auswahl , fd - >F , fd - > Nullpkt , fd - > VMS , fd - >C , D ) ; double VarDavor = 0; do David Wander 2012 37 Der Dopplereffekt 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 D.3 AudioFunktionen.h { VarDavor = Var ; D += FitSchritt ; Var = Varianz ( fd - > MaxFreq , fd - > Auswahl , fd - >F , fd - > Nullpkt , fd - > VMS , fd - >C , D ) ; } while ( Var < VarDavor ) ; D -= FitSchritt ; return D ; } DWORD WINAPI ThreadFit ( LPVOID lpParams ) { FitData * fd = ( FitData *) lpParams ; double D = Fit ( fd ,D , FITSCHRITT *10) ; // Grobes Fitten mit 10 Facher A u f l ö s u n g D = Fit ( fd ,D - FITSCHRITT *10 , FITSCHRITT ) ; // feines Fitten fd - > D = D ; SendMessage ( fd - > hwnd , THREADFIT_ERGEBNIS , NULL , NULL ) ; return 0; } int Ent haeltVe ctor ( std :: vector < int >* vec , int i ) { for ( int j = 0; j < vec - > size () ; j ++) { if ( vec - > at ( j ) == i ) return j ; } return -1; } D.3 AudioFunktionen.h Listing 3: main.cpp 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 26 27 28 29 30 31 32 33 34 35 bool InitAudio ( HWND hwnd , HWAVEIN * inHandle ) { unsigned long result ; WAVEFORMATEX waveFormat ; /* I n i t i a l i z e the W A V E F O R M A T E X for 16 - bit , 44 KHz , mono */ waveFormat . wFormatTag = W AV E _F OR MA T _P CM ; waveFormat . nChannels = CT_KANAELE ; waveFormat . nSamples PerSec = SAMPLERATE ; waveFormat . wBitsPer Sample = BITSPROSAMPLE ; waveFormat . nBlockAlign = waveFormat . nChannels * ( waveFormat . wB itsPerSa mple /8) ; waveFormat . n Av gB yt e sP er Se c = waveFormat . n SamplesP erSec * waveFormat . nBlockAlign ; waveFormat . cbSize = 0; /* Open the p r e f e r r e d Digital Audio In device */ result = waveInOpen ( inHandle , WAVE_MAPPER , & waveFormat , ( DWORD ) hwnd , 0 , C AL LB AC K _W IN DO W ) ; if ( result ) { return false ; } return true ; } bool A u d i o P u f f e r H i n z f g ( HWAVEIN inHandle , Puffer * puf ) { puf - > Header . lpData = puf - > Puf ; puf - > Header . dwBuff erLength = PUFFERGROESSE ; puf - > Header . d wB yt e sR ec o rd ed = 0; puf - > Header . dwFlags = 0; puf - > Header . dwLoops = 0; puf - > Header . dwUser = 0; if ( w a v e I n P r e p a r e H e a d e r ( inHandle ,& puf - > Header , sizeof ( puf - > Header ) ) == M M S Y S E R R _ N O E R R O R ) { David Wander 2012 38 Der Dopplereffekt 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 D.4 Einstellungen.h if ( w av e In Ad dB u ff er ( inHandle ,& puf - > Header , sizeof ( puf - > Header ) ) == M M SY S E R R _ N O E R R O R ) { return true ; } } return false ; } void Schliess eAudio ( HWAVEIN inHandle , Puffer * Puf1 , Puffer * Puf2 ) { w a v e I n U n p r e p a r e H e a d e r ( inHandle ,& Puf1 - > Header , sizeof ( WAVEHDR ) ) ; w a v e I n U n p r e p a r e H e a d e r ( inHandle ,& Puf2 - > Header , sizeof ( WAVEHDR ) ) ; waveInClose ( inHandle ) ; } D.4 Einstellungen.h Listing 4: main.cpp 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 26 27 28 29 30 31 32 33 34 35 36 37 38 LRESULT CALLBACK E i n s t e l l u n g e n P r o c e d u r e ( HWND hwnd , UINT message , WPARAM wParam , LPARAM lParam ) { static HWND hwndFreqUntergrenze , h w n d F r e q O b e r g r e n z e ; static HWND hwndMinGeradenLaenge , hwndAb weichun g ; static HWND hw ndFitsch ritt ; static HWND hwndOk , hwndAbbrechen ; static HWND * hwndData []={& hwndFreqUntergrenze ,& hwndFreqObergrenze ,& hwndMinGeradenLaenge ,& hwndAbweichung ,& hwndFi tschritt }; static int iFitschritt = static_cast < int >( FITSCHRITT *100) ; static int * Einstellungen []= {& FREQUNTERGRENZE ,& FREQOBERGRENZE ,& MINGERADENLAENGE ,& ABWEICHUNG ,& iFitschritt }; HDC hdc ; PAINTSTRUCT ps ; switch ( message ) { case WM_CREATE : { hwndOk = CreateWindow ( " button " ," Ok " , WS_VISIBLE | WS_CHILD ,87 ,260 ,100 ,25 , hwnd ,( HMENU ) IDM_OK , NULL , NULL ) ; hwndAbbrechen = CreateWindow ( " button " ," Abbrechen " , WS_VISIBLE | WS_CHILD ,213 ,260 ,100 ,25 , hwnd ,( HMENU ) IDM_ABBRECHEN , NULL , NULL ) ; h w n d F r e q U n t e r g r e n z e = CreateWindow ( " edit " ," " , WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_BORDER ,25 ,40 ,140 ,20 , hwnd , NULL , NULL , NULL ) ; h w n d F r e q O b e r g r e n z e = CreateWindow ( " edit " ," " , WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_BORDER ,215 ,40 ,140 ,20 , hwnd , NULL , NULL , NULL ) ; h w n d M i n G e r a d e n L a e n g e = CreateWindow ( " edit " ," " , WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_BORDER ,25 ,90 ,140 ,20 , hwnd , NULL , NULL , NULL ) ; hw ndAbweic hung = CreateWindow ( " edit " ," " , WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_BORDER ,25 ,135 ,140 ,20 , hwnd , NULL , NULL , NULL ) ; hw ndFitsch ritt = CreateWindow ( " edit " ," " , WS_VISIBLE | WS_CHILD | ES_NUMBER | WS_BORDER ,25 ,190 ,140 ,20 , hwnd , NULL , NULL , NULL ) ; for ( int i = 0; i < sizeof ( Einstellungen ) / sizeof ( int *) ; i ++) // Trage Daten in die E d i t f e l d e r ein { char TMP [20]; wsprintf ( TMP , " % d " ,* Einstellungen [ i ]) ; SetWindowText (* hwndData [ i ] , TMP ) ; } break ; } case WM_COMMAND : { switch ( LOWORD ( wParam ) ) { case IDM_OK : David Wander 2012 39 Der Dopplereffekt 39 40 41 D.5 GrafikFunktionen.h { // E i n s t e l l u n g e n auslesen for ( int i = 0; i < sizeof ( Einstellungen ) / sizeof ( int *) ; i ++) // Trage Daten in die E d i t f e l d e r ein { char TMP [20]; GetWindowText (* hwndData [ i ] , TMP ,20) ; * Einstellungen [ i ] = atoi ( TMP ) ; } if ( iFitschritt ==0) { iFitschritt =1;} // 0 ist nicht zulässig und würde das Programm zum A b s t ü r z e n bringen double dtmp = iFitschritt ; FITSCHRITT = dtmp /100; if ( FREQOBERGRENZE <= F RE QU NT E RG RE NZ E ) { FRE QOBERGRE NZE = 10* F RE QU NT E RG RE NZ E ;} if ( FREQ OBERGREN ZE ==0) FREQO BERGREN ZE = 1000; DestroyWindow ( hwnd ) ; break ; 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 } case IDM_ABBRECHEN : { DestroyWindow ( hwnd ) ; break ; } } } case WM_PAINT : { hdc = BeginPaint ( hwnd ,& ps ) ; TextOut ( hdc ,25 ,25 , " Fr e qu en zb e re ic h von : " ,20) ; TextOut ( hdc ,182 ,40 , " bis " ,3) ; TextOut ( hdc ,360 ,40 , " Hz " ,2) ; TextOut ( hdc ,25 ,75 , " Minimale Geradenlänge : " ,22) ; TextOut ( hdc ,25 ,120 , " Maximale Abweichung : " ,20) ; TextOut ( hdc ,25 ,175 , " Auflösung der A b s t a n d s b e r e c h n u n g : " ,33) ; TextOut ( hdc ,170 ,190 , " cm " ,2) ; EndPaint ( hwnd ,& ps ) ; break ; } default : { return DefWindowProc ( hwnd , message , wParam , lParam ) ; } } } D.5 GrafikFunktionen.h Listing 5: main.cpp 1 2 3 4 5 6 7 8 9 10 11 12 void ZeichneBalken ( HDC hdc , double Freq , COLORREF color ) { HGDIOBJ objDavor = SelectObject ( hdc , CreatePen ( PS_SOLID ,1 , color ) ) ; int YBildschirm = GRAFIKY - GRAFIKSY *(( Freq - F R EQ UN T ER GR EN Z E ) /( FREQOBERGRENZE F RE QU NT E RG RE NZ E ) ) ; // U m r e c h n u n g der Frequenz in Y - K o o r d i n a t e des B i l d s c h i r m e s MoveToEx ( hdc , GRAFIKX , YBildschirm , NULL ) ; LineTo ( hdc , GRAFIKX + GRAFIKSX , YBildschirm ) ; char TMP [20]; sprintf ( TMP , " %5.1 f Hz " , Freq ) ; TextOut ( hdc , GRAFIKX + GRAFIKSX +5 , YBildschirm -7 , TMP , strlen ( TMP ) ) ; SelectObject ( hdc , objDavor ) ; } David Wander 2012 40 Der Dopplereffekt D.6 D.6 Konstanten.h Konstanten.h Listing 6: main.cpp 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 # define # define # define # define CT_KANAELE 1 SAMPLERATE 44100 BITSPROSAMPLE 8 PAKETLAENGE 0.25 # define PUFFERGROESSE CT_KANAELE * SAMPLERATE * BITSPROSAMPLE /8 * PAKETLAENGE # define YBILDSCHIRM ( a ) GRAFIKY - GRAFIKSY *( a - F RE Q UN TE RG R EN ZE ) /( FREQOBERGRENZE F RE QU NT E RG RE NZ E ) int FR EQOBERGR ENZE = 6000; int FR EQ U NT ER GR E NZ E = 5000; int M I N G E R A D E N L A E N G E = 3; int ABWEICHUNG = 4; double FITSCHRITT = 0.1; int int int int GRAFIKX = 300; GRAFIKY = 445; GRAFIKSX = 600; GRAFIKSY = 400; # define RSLUFT 287.058 # define KAPPA 1.4 // B e n u t z e r d e f i n i e r t e Messages # define T H R E A D F F T _ E R G E B N I S 40000 # define T H R E A D F I T _ E R G E B N I S 40001 // IDs # define # define # define # define # define # define # define # define # define # define IDM_START IDM_STOP IDM_RESET IDM_MINMAX IDM_F IDM_THEORIE IDM_C IDM_RAUSCHEN IDM_AUSWAHL ID M_ AN A LY SI ER E N # define # define # define # define # define # define IDM_BEENDEN 40101 I D M _ E I N S T E L L U N G E N 40102 IDM_OK 40103 IDM_ABBRECHEN 40104 IDM_MANUELL 40105 IDM_ANALYSE 40106 D.7 40002 40003 40004 40005 40006 40007 40008 40009 40010 40011 Menu.rc Listing 7: main.cpp 1 2 3 4 5 6 7 8 9 10 # include " Konstanten . h " DOPPLERRADAR MENU DISCARDABLE BEGIN POPUP " & Datei " BEGIN MENUITEM " St & art " , IDM_START MENUITEM " St & op " , IDM_STOP MENUITEM " & Reset " , IDM_RESET MENUITEM " Man & uelle Auswahl " , IDM_MANUELL David Wander 2012 41 Der Dopplereffekt 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 D.7 Menu.rc MENUITEM SEPARATOR MENUITEM " B & eenden " , IDM_BEENDEN END POPUP " & Einstellungen " BEGIN MENUITEM " Zeige Min / Max - Balken " , MENUITEM " Zeige Se nderfreq uenz " , MENUITEM " Zeige theoretische Kurve " , MENUITEM " Zeige S c h a l l g e s c h w i n d i g k e i t " , MENUITEM " Zeige Auswahl " , MENUITEM " Zeige Rauschen " , MENUITEM " Automatisch Analysieren " , MENUITEM " mehr " , END IDM_MINMAX , CHECKED IDM_F , CHECKED IDM_THEORIE , CHECKED IDM_C IDM_AUSWAHL , CHECKED IDM_RAUSCHEN , CHECKED IDM_ANALYSIEREN , CHECKED IDM_EINSTELLUNGEN END David Wander 2012 42