Benutzer-Werkzeuge

Webseiten-Werkzeuge


ss15:der_prototyp

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ss15:der_prototyp [2015/09/21 18:44]
m.schramm
ss15:der_prototyp [2016/05/10 14:46] (aktuell)
Zeile 1: Zeile 1:
 ====== Der Prototyp ====== ====== Der Prototyp ======
-===== 1. Aufbau ​=====+===== 1. Ziel =====
 Dieses erste funktionsfähige Programm sollte zeigen, dass die Idee der Datenübertragung per Schall grundsätzlich umsetzbar ist. Das Programm besteht hauptsächlich aus den zwei Funktionen ''​code''​ und ''​decode''​. Dieses erste funktionsfähige Programm sollte zeigen, dass die Idee der Datenübertragung per Schall grundsätzlich umsetzbar ist. Das Programm besteht hauptsächlich aus den zwei Funktionen ''​code''​ und ''​decode''​.
 ===== 2. code-Funktion ===== ===== 2. code-Funktion =====
Zeile 20: Zeile 20:
  playsnd(signal_1,​ RATE)  playsnd(signal_1,​ RATE)
 </​code>​ </​code>​
 +{{:​ss15:​code_prototype.png?​direct&​500 |Signal zur Bit-Liste [0,​1,​1,​0,​1,​0,​0,​0,​1,​0,​1,​0,​0,​0]}}
 ===== 3. decode-Funktion ===== ===== 3. decode-Funktion =====
-Die Funktion ''​decode''​ stellt die Empfängerseite dar. Ihr wird eine Aufnahme in Form der Liste ''​y''​ übergeben. Diese Aufnahme wird nun in sehr kleine Abschnitte zerlegt, die wesentlich kürzer als die Dauer eines Bits sind. Nun wird für jeden dieser Abschnitte die Fourier-Transformation durchgeführt,​ deren Ergebnis angibt wie "​stark"​ jede einzelne Frequenz in einem Abschnitt vorhanden ist, also ihre Intensität. Nun wird für jeden Abschnitt überprüft,​ ob der Intensitäts-Wert bei der jeweilige Frequenzen zur Codierung einer ''​0''​ oder ''​1''​ über einer festgelegten Schranke liegt. Falls ja werden die folgenden Abschnitte, die theoretisch ebenfalls zum gleichen gesendeten Bit gehören müssen, ebenfalls auf das Vorhandensein der codierenden Frequenz geprüft. Ist in mindestens 50% der Abschnitte ebenfalls die Frequenz in starker Intensität vorhanden wird je nach Frequenz eine ''​0''​ oder ''​1''​ in die Ergebnis-Liste ''​s''​ geschrieben und die Überprüfung geht dort weiter, wo das Ende des gesendeten Bits vermutet wird. Ist das Ende der Aufnahme erreicht wird die fertig decodierte Ergebnis-Liste ''​s''​ zurückgegeben.+Die Funktion ''​decode''​ stellt die Empfängerseite dar. Ihr wird eine Aufnahme in Form der Liste ''​y''​ übergeben. Diese Aufnahme wird nun in sehr kleine Abschnitte zerlegt, die wesentlich kürzer als die Dauer eines Bits sind. Nun wird für jeden dieser Abschnitte die [[https://​de.wikipedia.org/​wiki/​Diskrete_Fourier-Transformation|Diskrete ​Fourier-Transformation]] durchgeführt,​ deren Ergebnis angibt wie "​stark"​ jede einzelne Frequenz in einem Abschnitt vorhanden ist, also ihre Intensität. Nun wird für jeden Abschnitt überprüft,​ ob der Intensitäts-Wert bei der jeweilige Frequenzen zur Codierung einer ''​0''​ oder ''​1''​ über einer festgelegten Schranke liegt. Falls ja werden die folgenden Abschnitte, die theoretisch ebenfalls zum gleichen gesendeten Bit gehören müssen, ebenfalls auf das Vorhandensein der codierenden Frequenz geprüft. Ist in mindestens 50% der Abschnitte ebenfalls die Frequenz in starker Intensität vorhanden wird je nach Frequenz eine ''​0''​ oder ''​1''​ in die Ergebnis-Liste ''​s''​ geschrieben und die Überprüfung geht dort weiter, wo das Ende des gesendeten Bits vermutet wird. Ist das Ende der Aufnahme erreicht wird die fertig decodierte Ergebnis-Liste ''​s''​ zurückgegeben.
 <code python> <code python>
 def decode(y): def decode(y):
Zeile 33: Zeile 34:
  v = 10 # Anzahl der Abschnitte, in welche ein Bit-Signal geteilt wird  v = 10 # Anzahl der Abschnitte, in welche ein Bit-Signal geteilt wird
   
- for i in  range(0, ​ANZAHL, int(RATE/​n)):​ # abschnittsweise Fourier-Transformation der Aufnahme+ for i in  range(0, ​len(y), int(RATE/​n)):​ # abschnittsweise Fourier-Transformation der Aufnahme
  a = FFT.fft(y[i:​int(i+RATE/​n)])  a = FFT.fft(y[i:​int(i+RATE/​n)])
  f.append((a*np.conjugate(a)).real) # umwandeln der Werte von komplex in reell  f.append((a*np.conjugate(a)).real) # umwandeln der Werte von komplex in reell
Zeile 46: Zeile 47:
  if f[x+h][f_0/​n] > schranke:  if f[x+h][f_0/​n] > schranke:
  a += 1  a += 1
- if a >= v*0.5: # ... und wenn mehr als >= 50% der Abschnitte Signal enthalten...+ if a >= v*0.5: # ... und wenn >= 50% der Abschnitte Signal enthalten...
  s.append(0) # ... schreibe eine 0 in s  s.append(0) # ... schreibe eine 0 in s
  skip_idx = v - 1 # ... und setze skip_idx auf v - 1  skip_idx = v - 1 # ... und setze skip_idx auf v - 1
Zeile 59: Zeile 60:
  return s  return s
 </​code>​ </​code>​
 +{{:​ss15:​spectrum.png?​direct&​500 |Frequenz-Spektrum einer Musikaufnahme}}
 +{{:​ss15:​prototype.png?​direct&​500 |Frequenz-Spektrum in einem Abschnitt}}
 +===== 4. Ergebnis =====
 +Mit dem entstandenen Prototypen konnten wir die grundsätzliche Umsetzbarkeit unseres Projekts zeigen. Allerdings war uns schon von vornherein klar, dass die Einteilung in sehr kleine Abschnitte aufgrund des hohen Rechenaufwands keine endgültige Lösung ist und wir uns ein System zur Rückgewinnung des Sendetaktes überlegen müssen.
ss15/der_prototyp.1442853881.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)