Daten an Soundkarte schicken, aufzeichnen und abgleichen [ERLEDIGT]
-
hustbaer schrieb:
Sorry, aber mein Transporter (Beamer) funktioniert ja schon einself.
Nur kommt am anderen Ende noch nicht das raus was ich reingesteckt habe.War auch mein erster Gedanke.

-
ach leute, das hilft mir doch jetzt nichts

mitm modem konnte man doch auch DA/AD wandeln und dabei daten übertragen, also muss es irgenwie gehen
-
Das Problem ist, dass du Qualitätsverlust hast wenn du die Daten durch einen DA-Wandler und wieder durch einen AD-Wandler schickst. Deswegen kommt nicht dasselbe an. Was du also machen musst, ist deine Daten nicht direkt zu senden, sondern geschickt kodiert. Du kennst doch das Modempiepen. Du kannst zum Beispiel alle 10 ms einen Ton abspielen, A = 10 kHz, B = 20 kHz, C = 30 kHz .... Dann, wenn du den Ton wieder aufnimmst kannst du die Tonhöhe bestimmen. 5-15 kHz -> A, 15-25 kHz -> B... Man beachte, dass die Daten nicht exakt übertragen werden müssen, sondern nur +-5 kHz und die Lautstärke ist egal. Wahrscheinlich kommt er sogar mit Knacken klar.
Die +-5 kHz sind nur ein prinzipielles Beispiel, du willst den Bereich so wählen, dass die Fehlerrate < Bereich ist, was noch je nach Frequenz anders ist (das erwähnte Abtasttheorem hilft da). Möglicherweise kannst du auch die Amplitude = Lautstärke benutzen. Das ist viel komplizierte Signalverarbeitung. Zum Glück gibts ja Modems, die exakt das tun, nur halt korrekt und schnell und mit automatischer Fehlerkorrektur und Protokollanpassung je nach Leitungsqualität. Also benutzt du 2 Modems und baust dir 2 Adapter, die von 2-Draht auf Klinkenstecker umsetzen, sagst "Windows mach mal DFÜ-Verbindung" und bist fertig.
-
ZockerFloh7 schrieb:
Edit:... oder muss ich das jetzt auch machen?
Ja, DU musst das machen.
Sonst macht es nämlich keiner.
-
DirkB schrieb:
Ja, DU musst das machen.
Sonst macht es nämlich keiner.So wie du das Zitierst reißt du meine Aussage völlig aus dem Zusammenhang.
Bring mal sinvolle Beiträge statt das Forum hier zu zu spammenDanke für die Infos nwp3

aber ich muss das leider irgendwie mit der Soundkarte lösen...
Das Hauptproblem ist, dass die Daten total unterschiedlich aussehen
Was ich sende:
http://imageshack.com/i/5emtx1pWas ich aufzeichne:
http://imageshack.com/i/0jp1plp
-
Probier doch mal die Bits einzeln zu senden.
//ungetestet, vielleicht wäre std::string angemessener std::vector<char> encode(const std::vector<char> &data){ std::vector<char> enc; for (auto it : data){ char c = *it; for (int i = 0; i < 8; i++){ enc.push_back(c & 1 ? 127 : -127); c >>= 1; } } return enc; } std::vector<char> decode(const std::vector<char> &data){ std::vector<char> dec: for (int it = 0; it + 7 < data.size(); it++){ char c = 0; for (int i = 0; i < 8; i++){ if (data[it + i] > 0) c++; c <<= 1; } dec.push_back(c); } }Vor dem Senden encoden und nach dem Empfangen decoden, mit etwas Glück kommt dasselbe raus.
-
Hmm, nach nochmaligem drüberkucken stelle ich fest, dass das +127/-127 und >0 Blödsinn ist. Du willst natürlich statt +127 0xFF schicken und statt -127 0x00 schicken und dann die Bits zählen und nach Mehrheit gewinnt zurückwandeln.
Das kriege ich aber gerade nicht im Kopf zusammen.
Btw das encode kann man stacken, also 3 mal encode und dann 3 mal decode wenn es nicht reicht.
-
Das hat mir jetzt wirklich geholfen!

Danke, Danke nwp3
Hattest zwar ein paar kleine Fehler bei dir drin, aber ohne den Code wär ich nie auf die Idee gekommen wie ich das encoden/deconden realisieren hätte sollen.
Hier der funktionierende Code:
//encode std::string enc; std::vector<char> data; for (auto it : data) { unsigned char c = it; for (int i = 0; i < 8; i++) { enc.push_back(c & 1 ? 0xFF : 0x00); c >>= 1; } } //decode std::vector<char> dec; for (int it = 0; it + 7 < enc.size(); it++) { unsigned char c = 0; for (int i = 7; i >= 0; i--) { if (enc[it + i] < 0) c++; if (i != 0) c <<= 1; } dec.push_back(c); }Werd das ganze mal in mein Programm einbauen und dann berichten obs funktioniert.
Grüße ZF
-
Die Variante von nwp3 kann auch nicht funktionieren.
Die Übertragung von Binärdaten als Audiosignal ist alles andere als ein einfaches Thema. Dabei musst du gegen einige Dinge kämpfen, die einem Audiosignal welches analog übertragen wird passieren (egal über welches Medium). z.B.
- Unterschiedliche Phasenverschiebung verschiedener Frequenzen
- Unterschiedliche Verstärkung verschiedener Frequenzen
- Diverse nicht-lineare Effekte ("Klirr")
Dazu kommen noch Effekte die bei der D/A und A/D Wandlung passieren
- Aliasing
- Durch Filter verursachtes Ringing
- Stauchung/Streckung des Signals durch leicht unterschiedliche Sampling-Frequenzen beim Abspielen vs. Aufnehmen
Die Hoffnung einzeln als +127/-128 kodierte Bits könnten in ähnlicher Form am anderen Ende der Kette wieder rauskommen ist zwar rührend, aber leider unbegründet.
Selbst bei einer DC-gekoppelten Übertragung wie RS-232 muss man mit wesentlich höherer Auflösung als 1 Sample/Bit abtasten um das Signal noch rekonstruieren zu können. Übliche UARTs verwenden soweit ich weiss min. 8-fach Oversampling - als >= 8 Samples pro Bit.
Analoge Audioübertragungen sind aber normalerweise nicht DC-gekoppelt. Flachen Frequenzgang hat man auch keinen. Und wenn Lautsprecher und Mikrofone ins Spiel kommen ist jegliche Hoffnung dahin, irgendwas mit einer so einfachen Kodierung ausrichten zu können.Also muss man sich eine Möglichkeit einfallen lassen, das Signal vor der Übertragung so umzuwandeln, dass all die beschriebenen Veränderungen des Signals die kodierte Information nicht unwiederbringlich zerstören.
Die einfachste, aber leider auch sehr fehleranfällige Variante, ist Amplitudenmodulation.
Die nächstbessere Variante wäre die Frequenzmodulation. Dazu hat nwp3 ja auch schon ein wenig geschrieben. (Nur dass seine Frequenzen etwas sehr hoch angesetzt waren -- 30 kHz kannst du vergessen, das kann kein normaler Lautsprecher mehr ausreichend gut abspielen.)Und natürlich ist da noch eine Sache die du komplett zu ignorieren scheinst: du musst irgendwie rausbekommen wann das Signal eigentlich anfängt. Sound aufnehmen kannst du immer, und du wirst dabei auch immer irgend ein Ergebnis bekommen. Um das Signal zu dekodieren musst du aber wissen wann es anfängt. Und natürlich zwischen drinnen auch immer wieder mal Punkte haben an denen du den Clock-Drift auskorrigieren kannst.
Resume: dir fehlen viel zu viele Grundlagen als dass du dein Vorhaben in annehmbarer Zeit umsetzen könntest. Such dir was einfacheres aus.
-
Okay, danke hustbaer für die Aufklärung.
Dann werd ich ne andere Möglichkeit suchen müssenauch danke an alle Anderen die mir hier geholfen haben

Grüße ZF