• .
  • Willkommen im Forum!
  • Alles beim Alten...
  • Du hast kaum etwas verpasst ;-)
  • Jetzt noch sicherer mit HTTPS
Hallo, Gast! Anmelden Registrieren


RTA - Grundlagenwissen (für 3eepoint)
#1
(1) Programmierung
(1.1) Geschichte
Die Befehle, die ein Prozessor ausführen kann (sein sog. Befehlssatz) werden seit jeher durch binäre Zahlen bestimmter Länge dargestellt. Auf einen Befehl folgen die zu verarbeitenden Daten, ebenfalls in binärer Form. Diese Nullen und Einsen in einer sinnvollen Wiese im Arbeitssprecher angelegt ergeben ein Programm.

In den Anfangstagen der Computergeschichte hat man nun diese Befehle mittels Lochstreifen, Steckverbindungen oder Kippschaltern dem Rechenwerk zugeführt. Ein entspreche langes Programm war allerdings nur sehr schwer zu verstehen und Entwicklung bzw. Fehlersuche besonders mühsam.

So begann man den einzelnen Befehlen Buchstabenkürzel zuzuordnen, die sog. Mnemonics. Die Buchstabenkürzel erinnerten an die Funktion des zugehörigen Befehls und erhöhten so die Lesbarkeit des Codes drastisch. Die Kürzel gefolgt von den Daten gab man nun in einen Texteditor ein, von dort wurden sie mit einem speziellen Programm, dem sog. assembler, wieder in Maschinensprache übersetzt. Die "Programmierumgebung" war geboren.

Aber auch diese Methode ist nicht besonders flexibel und umständlich. So begann man höhere Programmiersprachen zu entwickeln, die mit ihren syntaktischen (=Satzbau) und logischen (=z.B. Verzweigungen: WENN->DANN) Konstrukten stark der Menschlichen Sprache, bzw. Denkweise ähneln.
Der hochsprachliche Code wird nun von einem Compiler wieder in Maschinenbefehle übersetzt.

Wir arbeiten hier mit vb.net, einer Programmiersprache, die auf BASIC (Beginners All Purpose Symbolic Instruction Code) basiert. Sie ist besonders einfach zu verstehen, da sie der englischen Sprache auffallend nahe kommt. Auf die Bedeutung elementarer Codewörter wie z.B. "As" oder "New" werde ich daher nicht eingehen.

(1.2.1) Codewörter
Codewörter sind die "Anweisungen" der Programmiersprache. Sie "sagen" dem Compiler, was getan werden soll. Variablen oder Funktionen dürfen in ihrem Namen nicht mit vordefinierten Codewörtern übereinstimmen.
Biespiele
Code:
Dim
Private
Inherits
Function

(1.2.2) Variablen, Konstanten und Operatoren
Dies sind die elementaren Werkzeuge innerhalb eines Programmcodes. Variablen & Konstanten können verschiedene Informationen tragen: Ganzzahlen, Kommazahlen, Text, "Wahr/Falsch"
Daher unterscheidet man verschiedene Variablentypen:

-Integer (Byte, Int16, Int32, Int64): Vorzeichenbehaftete Ganzzahlen
-String: Alphanumerische Zeichen
-Boolean: True oder False
-Single/Double/Float: Vorzeichenbehaftete Kommazahlen, bestehend aus Mantisse und Exponent

Eine Variable kann in ihrem Wert geändert werden, eine Konstante nicht. Beide müssen jedoch vor ihrer Verwendung definiert werden (d.h. im Speicher wird entsprechender Speicherplatz reserviert):
Code:
Dim myVariable As Int32 'oder auch mit direkter Wertzuweisung:
Dim myVariable As Int32 = 12
Alle Zeichen innerhalb einer Zeile, die nach einem einfachen Anführungszeichen kommen, werden vom Compiler als Kommentar betrachtet.

Variablen unterschiedlichen Datentyps können in der Regel nicht direkt ineinander überführt werden. Entsprechende Wertzuweisungen sind unzulässig. Es existierten aber Funktionen zur Konversion der Datentypen.
Code:
Dim myStr As String
Dim myInt As Int32
Dim myDbl As Double = 2.5

'Falsch:
myInt = myDbl
myStr = myInt

'Richtig:
myInt = CInt(myDbl)
myStr = myInt.ToString()

Operatoren dienen nun dazu Variablen miteinander zu "verrechnen". Im einfachsten Fall kann man zwei Zahlen addieren:
Code:
Dim a, b, c As Int32
a = 5
b = 7
c = a + b  'Es folgt: c = 12
Wobei "+" hier den Operator darstellt.

Code:
i *= 4
ist eine Kurzschreibweise für:
Code:
i = i * 4

(1.2.3)Arrays
Ein Array ist eine Ansammlung von Variablen eines Datentyps. Es hat eine fest definierte Länge.
Code:
Dim i(2) As Double 'Länge = 3
i(0) = 2.3
i(1) = 7.978
i(2) = i(0) / i(1)

(1.3) Strukturen
(1.3.1) Verzweigungen
Verzweigungen werden verwendet, um Entscheidungen zu treffen:
Code:
If schoenesWetter = True Then
  MsgBox("lass uns rausgehen")
Else
  MsgBox("Mist!")
End If
Code:
Select Case hausnummer
Case 666
  MsgBox("The Number of the Beast")
Case 668
  MsgBox("Der Nachbar vom Biest")
Case 667
  MsgBox("Andere Straßenseite")
End Select

(1.3.2) Schleifen
Schleifen werden verwendet, um Anweisungen öfters als einmal auszuführen.
Code:
Dim i As Int
For i = 0 To 100
....
Next i
Diese Schleife wird durchlaufen, bis i den Wert 100 erreicht hat. Nach jedem Durchlauf wird i um den Wert 1 erhöht.

Code:
Do While myTester = True
...
Loop
Diese Schleife wird solange ausgeführt, wie die Variable "myTester" den Wert True hat.

(1.4) Paradigmen
(1.4.1) Imperative Programmierung
Das Programm besteht nur aus hintereinander ausgeführten Befehlen. (Verzweigungen und Schleifen existieren). Soll ein Teil des Codes erneut ausgeführt werden, ist eine Sprunganweisung nötig, die die Ausführung des Programms an einer anderen Stelle fortsetzt. Selbiger Code ist extrem unleserlich und wird daher als "Spaghetti-Code" bezeichnet.

(1.4.2) Prozedurale Programmierung
Bei der prozeduralen Programmierung werden immer wieder benötigte Programmteile in Funktionen ausgelagert. Diesen Funktionen können, bzw. müssen Variablen übergeben werden, mit denen die Funktion intern arbeitet. Subroutinen ("Subs") können keine Werte zurückgeben, Funktionen ("Function") dagegen schon.
Die übergebenen Variablen, können entweder nach Wert "ByVal" oder nach Referenz "ByRef" übergeben werden. Im ersten Fall wird nur der explizite Wert an die Funktion übergeben, im Zweiten eine Zeiger auf die Variable, die so auch von der Funktion manipuliert werden kann.
Code:
'Definitionen
Sub q_s(ByRef i As Int32)
i = i * i
End Sub

Function q_f(ByVal i As Int32) As Int32
Dim ergebnis As Int32
ergebnis = i * i
Return ergebnis
End Sub

'So werden die Funktionen aufgerufen:
Dim a As Int32 = 2
Dim b As Int32 = 2

q_s(a)     '->a = 4
b = q_f(a) '->a = 4; b = 16

(1.4.3) Objektorientierte Programmierung
Hier werden nicht nur Funktionen als wiederkehrende Elemente eingesetzt, sondern sog. Klassen. Eine Klasse besteht aus Variablen und Funktionen ? in diesem Kontext "Methoden" genannt.
Eine klasse kann beliebig oft instanziert werden. Die genauen Hintergründe würden hier den Rahmen leider sprengen, aber Wikipedia weiß Rat.
Wichtig ist, dass alle Methoden und Variablen, die eine Klasse beinhaltet entweder gekapselt "Private" oder öffentlich "Public" sein können. Erstere sind nur innerhalb der Klasse zugänglich, Letzere sind von außen sichtbar.
Wenn ich nun eine Klasse instanziert habe und auf öffentliche Methoden zugreifen will, benötige ich den Punkt-Operator (".").

Hier ein einfaches Beispiel, dass einen Auto-Tuner simuliert.
Code:
'die Klasse:

Public Class auto
'Variablen
Private marke As String
Private motrorleistung As Int32

'Methoden
Public Sub setMarke(m As String)
marke = m
End Sub

Public Sub setLeistung(l As Int32)
motorleistung = l
End Sub

Public Function getMarke() As String
Return marke
End Function

Public Function getLeistung() As Int32
Return motorleistung
End Function

Public Sub leistungVerdoppeln()
leinstung *= 2
End Sub

End Class




'mein Programm
Dim astra As New auto            'der Tuner (=Instanz)
Dim eKlasse As New auto            'und sein Konkurrent (=Instanz)

astra.setLeistung(65)
astra.setMarke("Opel")

eKlasse.setLeistung(500)
eKlasse.setMarke("Daimler")

Do While astra.getLeistung() < eKlasse.getLesitung()
astra.leistungVerdoppeln()         'der Tuner schraubt am Auto rum
Loop

Wir arbeiten Objektorientiert.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#2
Fragen?
Falls nein hau ich dir noch ein bisschen Systemtheorie / Mathe um die Ohren...
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#3
Echt gut gemacht, könnte von mir sein!
(Das ist das höchste Lob, dass ich vergeben kann!) Wink
...mit der Lizenz zum Löten!
 
#4
Zitat:Original geschrieben von voltwide

Echt gut gemacht, könnte von mir sein!
(Das ist das höchste Lob, dass ich vergeben kann!) Wink

danke Wink

da wo ich herkomme gilt der Grundsatz: "nix gschwätzt isch gnuag globt".
Da freue ich mich doch immer über solche Statements Big Grin
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#5
Gelbfiassler? überrascht
...mit der Lizenz zum Löten!
 
#6
Ja bisch du denn des Wahnsinns? motz motz motz
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#7
Für alle Wissenden: ich habe mich bewusst um die Worte "Faltung" und "orthonormal" rumgemogelt Wink

(2) Mathe
(2.1) Komplexe Zahlen
Eine Reelle Zahl stellt einen genau definierten Wert auf einem Zahlenstrahl dar.
Eine komplexe Zahl dagegen ist ein Punkt in einem 2-Dim. Koordinatensystem. Allerdings bezeichnet man die Position des Punktes auf der x-Achse nun mit "Realteil" und die Position auf der y-Achse als "Imaginärteil".

Einen Punkt in einem 2-Dim-Koosys. kann man zusätzlich zu der Angabe in (x|y) auch noch über einen Winkel und Radius exakt angeben. (vgl. Polarkoordinaten)
Diese Darstellung wird auch häufig gebraucht. Den Radius nennt man nun Betrag und den Winkel Phase, oder Argument.

(2.2) Imaginäre Einheit
Was ich jetzt verschwiegen hatte: zu einer Komplexen Zahl gehört auch noch die sog. "Imaginäre Einheit".
Die Definition lautet einfach j = sqrt(-1).
Eine Komplexe Zahl sieht demnach wie folgt aus: z = a + b*j, wobei a den Realteil, und b den Imaginärteil darstellt.

Aufgabe: wie würde die Zahl 1 + 2*j in Polardarstellung aussehen?

(2.3) Dirac-Impuls / Delta-Distribution
Der Dirac-Impuls d(t) ist ein einmaliger, unendlich schmaler Impuls, der dennoch mit der x-Achse die Fläche 1 einschließt. Bitte Wikipedia um genauere Infos bemühen.




(3)Systemtheorie
(3.1) Grundlegendes
Wir arbeiten mit Linearen, Zeitinvarianten Systemen. Das heißt die Übertragungsfunktion hat nur lineare Anteile (z.B. Integration, Multiplikation mit Konstante, Totzeit,...).
Wenn wir zum Zeitpunkt t=1 ein Signal in unser System einspeisen, reagiert es genauso auf dieses Signal, wie zum Zeitpunkt t=0.

"Signale" und "Systeme" sind hier theoretische Begriffe, die dasselbe bezeichnen. Eine nähere Erläuterung oder Herleitung zu diesem Sachverhalt wäre nicht zielführend.

Daher betrachten wir hier jetzt hier der Einfachheit halber Signal einmal ausschließlich als Spannungsverlauf über der Zeit.
Entweder können wir diesen nun analytisch beschreiben z.B.: y(t)=sin(w*t + p), oder wir haben (und das ist beim RTA der Fall) eine Reihe an Messwerten vorliegen, die durch Abtastung des Signals in festen Zeitintervallen zustande gekommen sind.

(3.2) Signalsynthese
Es lässt sich Mathematisch zeigen, dass sich ein jedes Signal durch Überlagerung von Sinusschwingungen unterschiedlicher Frequenz, Amplitude und Phase "synthetisieren" lässt. Man nennt dies auch "Fourier-Synthese".

(3.3) Signalanalyse (analytisch)
Möchte man nun ein gegebenes Signal wieder in seine sinusförmigen Anteile zu zerlegen, benötigt man die Fourier-Transformation.
Dabei handelt es sich um eine sog. "Integraltransformation". Sprich eine komplizierte Mathematische Operation, die ich auf mein analytisches Signal anwende. (wie z.b. eine Ableitung, nur hässlicher)
Die Transformation ist umkehrbar - es geht in keine Richtung Information verloren. Man spricht dann von einer Rüktransformation.

Nochmal zur Erinnerung: mein Analytisches Signal ist eine reellwertige Funktion der Zeit, z.B:

[red]y(t)=sin(2*pi*50*t) + 0,5 * cos(2*pi*100*t). [/red]

Wenn ich darauf nun die Fourier-Trafo loslasse, ändert sich folgendes:

-ich erhalte eine neue, komplexwertige Funktion Y(f) (die "Fourier-Transformierte von y(t)" oder einfach "Spektrum")
-die Zeitachse wandelt sich in eine Frequenzachse. Man sagt dazu auch Frequenz- oder Bildbereich.
-es gibt negative Frequenzen, die aber nur das gespiegelte der positiven Frequenzen sind (hier ist keine zusätzliche Information enthalten)
-> als Schaubild dargestellt würde man sagen: Das Schaubild ist spiegelsymmetrisch zur y-Achse

-Die x-Achse kann man nicht mehr genau Spezifizieren, da man schlecht komplexe Zahlen, die wie schon gesagt in ein eigenes Koo-Sys. gehören, auf einer Achse darstellen kann.
Daher stellt man meist das Quadrat des Betrages der komplexen Zahlen (welches Proportional zur im Signal enthaltenen Energie der zugehörigen Frequenz ist) über der Frequenz dar.

Also:
x-Achse: Betragsquadrat
y-Achse: Frequenz

Das Ergebnis wäre hier:

[red]Y(f) = (j/2)*(d(f+50) + d(f-50)) + (1/4)*(d(f+100) - d(f-100))[/red]

Man sieht, dass nur Dirac-Pulse (= vertikale Linien) bei -100,-50,50,100 Hz auftauchen, was ja auch unserer Vermutung entspricht.

Ein periodisches Signal liefert immer ein solches Linienspektrum, während ein aperiodisches Signal ein kontinuierliches Spektrum besitzt.

ideales weißes Rauschen und ein Dirac-Stoß (im Zeitbereich!) haben ein unendlich langes, geradlinig-kontinuierliches Spektrum. D.h.: sie beinhalten alle möglichen Frequenzen.

(3.4) Signalanalyse (wie mache ich das im Rechner)
Was unter 3.3 steht ist ja alles wunderbar, lässt sich aber keinesfalls in einem Rechner implementieren.
Aber es gibt Abhilfe: die "Diskrete Fourier-Trafo". Das ist ein numerisches Verfahren (arbeitet also mit Zahlen) und kann damit
von einem Rechner abgearbeitet werden. Hier werden n diskrete, abgetastete Werte als "Eingabe" erwartet und heraus kommen wieder n komplexwertige und frequenzabhängige Werte.

Auch die DFT hat einen Nachteil: sie ist verdammt langsam. Aber es gibt zum Glück einen Speziellen Algorithmus, die Fast-Fourier-Transform, oder FFT, die alle Probleme beseitigt Smile

Auch hier bietet es sich wieder an, die Betragsquadrate über der Frequenz dazustellen. (im RTA im 3. Tab zu finden - die THD-Messung einfach ignorieren)

(3.5) Übertragungsfunktion
Wir stellen uns nun ein technisches System, z.B. einen Verstärker, vor, der mit einem Signal u(t) am Eingang gespeist wird und mit einem Signal y(t) am Ausgang "antwortet".
War das Eingangssignal nun ein Dirac-Puls (den es in der Realität nicht gibt), könnten wir am Ausgang gerade die Impulsantwort des Verstärkers messen.
Würden wir diese nun per FFT in den Frequenzbereich überführen, hätten wir nach Definition die Übertragungsfunktion ermittelt.

Da aber ein Dirac-Impuls nunmal nicht zu erzeugen ist, geht man einen anderen Weg. Wie schon erwähnt, besteht auch weißes Rauchen aus unendlich vielen Frequenzen.
Dieses nimmt man nun als u(t), und misst wieder y(t).

dividiert man nun Y(f) durch U(f) (hier elementweise, da die Werte ja diskret vorliegen), erhält man direkt die Übertragungsfunktion.
Betrachten wir nun die Beträge der einzelnen Elemente der ÜF über der Frequenz, sehen wir den "Amplitudenfrequenzgang", bei den Argumenten sehen wir den "Phasenfrequenzgang".

Ein Problem gibt es aber doch: enthält unser Testsystem eine Totzeit (z.B. die Entfernung von LS zu Messmikro) wird man einen stetig fallenden Phasengang messen können.
Eine durch Rücktransformation errechnete Impulsantwort wäre ebenfalls falsch. Die Lösung ist, die Verzögerung im Vorfeld zu vermessen und eins der beiden Signale vor dem dividieren entsprechend in der Zeit zu verschieben.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#8
1. DANKE !! 2. Ich beginne zu verstehen^^ 3. Frage(n): Dim bedeutet so wie ich das verstanden habe festlegen also Dim myVariable As Int32 = 12

Das würde also heißen das Ich meine Variable (myVariable) als Intergral mit dem wert 12 festlege oder ?

Bei 1.2.3 die Arrys woher wird hier der Wert für i genommen ? Bzw. Ich verstehe den Befehl nicht ganz:

Dim i(2) As Double = 3
i(0)=2.3
i(1)=7.978
i(2)=i(0)/i(1)

Oder war das einfach nur n Beispiel und die Zahlen die da stehen haben so nichts mit der eigentlichen Funktion zu tun?

Mehr Fragen gibts morgen muss jetzt erstmal Hausaufgaben machen, ein Glück das ich morgen erst zur 3. hab Big Grin

EDIT:Aus oben genannten Grund werd ich mir Mathe Morgen erst reinziehen ^^ Aber nochmal danke überrascht
 
#9
Dim komt von Dimension und bedeutet, dass Speicherplatz in der für die Variable benötigten Größe (=Dimension) reserviert wird.

Bist du schockiert oder so? Hier heißt es nicht Integral, sondern Integer Big Grin


i() IST das Array.

i(0) ist der erste Wert IM Array (die Zahlen dort fallen natürlich vom Himmel), da, wo die Null steht, das nennt man Index (und fällt nicht vom Himmel). Und um die Verwirrung perfekt zu machen: der Index kann auch ne ganzzahlige, positive Variable sein Wink

Beispiel:
Code:
Dim i(5) As Int32
Dim j As Int32

For j = 0 To 5
i(j) = 27 + j
Next j

Aufgabe: was ist der Wert in i(3)?
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#10
Zitat:Original geschrieben von woody

Ja bisch du denn des Wahnsinns? motz motz motz

Also nicht, da bin ich jetzt aber Beruhigung lachend
...mit der Lizenz zum Löten!
 
#11
ich auch Smile
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#12
Zitat:Original geschrieben von woody

Dim komt von Dimension und bedeutet, dass Speicherplatz in der für die Variable benötigten Größe (=Dimension) reserviert wird.

Bist du schockiert oder so? Hier heißt es nicht Integral, sondern Integer Big Grin


i() IST das Array.

i(0) ist der erste Wert IM Array (die Zahlen dort fallen natürlich vom Himmel), da, wo die Null steht, das nennt man Index (und fällt nicht vom Himmel). Und um die Verwirrung perfekt zu machen: der Index kann auch ne ganzzahlige, positive Variable sein Wink

Beispiel:
Code:
Dim i(5) As Int32
Dim j As Int32

For j = 0 To 5
i(j) = 27 + j
Next j

Aufgabe: was ist der Wert in i(3)?

Ok, mit Dim sach ihn also das da was zu speichern ist.

i() IST also das Arry, ich kollidier dabei etwas mit dem Matheunterricht wo diese schreibweise ja eigentlich heißt F"Funktion"("von"x ) ich denk mal das wird hier nicht anders sein.

Mir fehlt irgendwie der Punkt wo man dem Arry sacht was es denn mit dem Index machen soll.

For J = 0 to 5 Ist doch ein Loop/Schleifenbefehll wenn ich mich
nicht irre misstrau
sprich bei i(j) = 27 + j rechnet er:
i(j) = 27 + 1
i(j) = 27 + 2
usw...

Oder denk ich hier zu sehr an meinen Matheunterricht ?
 
#13
Zitat:Original geschrieben von voltwide

Zitat:Original geschrieben von woody

Ja bisch du denn des Wahnsinns? motz motz motz

Also nicht, da bin ich jetzt aber Beruhigung lachend

Als Erinnerung :
Wiederholung von Verstrahlung von IJON TICHY kommt momentan Montags nachts im ZDF.
 
#14
Da freut sich auch der Stanislaus:

[Bild: StanislawLem.jpg]


Gruß.


P.S.

@woody: Respeck!

Die Antwort auf Dein Rätsel ist natürlich 42.
 
#15
Zitat:Original geschrieben von Hans Dorn
Die Antwort auf Dein Rätsel ist natürlich 42.

überrascht
 
#16
Das ist zwar DIE Antwort im Allgemeinen, aber selten im Speziellen lachend .
 
#17
eine ausführliche antwort gibts später, momentan nur so viel: der gedanke eine f(klappe ist gut - nur denke mal eher an eine Wertetabelle. Die Indizes 0,1,2,...,n stehen oben und die zugehörigen funktionswerte=arrayinhalte unten.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#18
Ich muss auch mal meinen Respekt für diesen Thread bekunden. ;respekt
 
#19
Zitat:Original geschrieben von 3eepoint

Zitat:Original geschrieben von woody

Aufgabe: was ist der Wert in i(3)?

Also hier die lange Antwort:

Der konkrete unterschied wischen einer Funktion im (schul-)mathematischn Sinne und einem Array hier ist, dass es sich bei einer Funktion um eine Zuordnung mit definierter Rechenvorschrift (=Funktionsterm) - bei einem Array aber nur um eine "Tabelle mit Werten" handelt.

Beispiel für eine Funktion:
Code:
y(x) = sin(x) / x

Jedem beliebigen (i.d.R reellwertigen) x wird über die Rechenvorschrift "sin(klappe / x" ein neuer y-Wert zugeordnet.


Ein Array stellen wir uns nun als Tabelle mit 2 Zeilen und n Spalten vor.
Code:
Dim arr(4) As Int32 'n ist hier 5
Dim i As Int32

For i = 0 to 4
arr(i) = 2 + i
Next i

Liefert uns nun folgende Tabelle:
Code:
i.....|0|1|2|3|4|
arr(i)|2|3|4|5|6|
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.
 
#20
also was steht nun in i(3)?

42 lasse ich nicht gelten Wink
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.