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