Datei als Tonband



  • Hallo Leute,

    mir bietet sich folgendes Szenario: Ich habe eine Variable, deren Inhalt ich in eine Datei speichere. In dem Augenblick wo sich der Inhalt der Variable änder wird der neue Inhalt ohne weitere Veränderung einfach an die Datei angehängt, sodass Perle für Perle auf eine Schnur gezogen wird. Soweit so gut!
    Leider ändert sich der Inhalt der Variable in keinem festen Takt. Es gibt mal größere mal kleinere Pausen. Und genau diese Lücken möchte ich ebenfalls in meine Datei übertragen. Ich möchte so zu sagen eine Tonbandaufnahme generieren, bei der das Tonband (die Datei) mit einer konstanten Geschwindigkeit läuft und nur dann etwas aufgenommen wird, wenn jemand "spricht".
    Gibt es dafür evtl. schon eine Lösung, oder hat jemand eine spontane Idee?

    Ich hoffe Ihr habt mich verstanden und es stört Euch nicht, dass ich in Bildern gesprochen habe. Schien mir der einfachste Weg.

    Für Eure Hilfe wäre ich dankbar.

    Grüße

    Stephan

    P.S.: Habe dieses Forum bewußt gewählt, da ich in c++ unter Linux programmiere. Sollte vielleicht erwähnt werden 😉



  • a) Datei in einem festen Takt beschreiben -> falls nichts kommt, werden halt 0-Bytes geschrieben... [⚠ Datei wird sehr groß!]
    b) Chunk hinter Chunk schreiben (mit festem Header). Kommen keine Daten mehr an, die Zeit messen bis zu dem Punkt, wo wieder Daten kommen. Dann einen "SPACE"-Chunk schreiben, der die Leerzeit enthält, und danach wieder weitere "Ton"-Chunks...



  • Wenn die Datei wirklich wie ein Tonband funktionieren soll, dann bleibt ja nur Sgt.Nukems Methode A

    Aber wenn du Quasi ein "Abspieler" für die Datei vorsiehst, reicht doch ein simples

    std::cout << Timestamp::current()-start_timestamp << data() << '\n';
    


  • Danke für Eure Ideen und Hilfe.

    Die Datei wird später dann natürlich noch weiter verwendet und da würden Header im Wege stehen. Version A von Sgt. Nukem hört sich bis jetzt am besten an. Das die Datei dadurch an Größe gewinnt ist mir klar. Die Größe der Lücken sollte sich jedoch, im Verhältnis zu den zu schreibenden Daten, in Grenzen halten.

    Für alle die dieses Thema interessiert habe ich mal weiter gesponnen:

    Die Datei müßte also mit einer konstanten Geschwindigkeit wachsen Byte/Sekunde!
    Man muß dazu also "nur noch" die Ankunftszeiten der Daten speicher und voneinander abziehen. Einen Befehl zum Auslesen der Systemzeit müßte es ja geben. Man darf nur nicht vergessen die Länge der Daten von der Differenz abzuziehen. Denn es interessiet ja die Zeit zwischen Ende.Daten.alt und Anfang.Daten.neu.
    Liegt einem die Länge der Lücke nun als Zeit [ms bzw. us] vor kann man sie über die Geschindigkeit Byte/Sekunde in Bytes umrechnen. Für diese Anzahl von Bytes müßten dan "Lückenfüller" geschriebn werden. Z.B. "0".

    Soweit meine Ideen. Wenn jemand eine bessere (einfachere) Idee hat dann gerne her damit.

    Gruß

    Stephan



  • du brauchst dir eigentlich nur eine gewisse sampling rate zu definieren, wie z.b. 100 hz. das bedeutet, du "tastest" 100 mal in der sekunde das "eingangssignal" (deine variable) ab und speicherst den wert dann in der datei (oder in nem gepufferten schreibqueue, kommt drauf an, wie hoch die sampling rate sein soll). ist die variable leer, schreibst du eine 0, ansonsten halt den wert der variablen (ggf. quantisiert)



  • Hi Sampler,

    Deine Idee ist nicht schlecht, doch das Problem liegt nicht darin zu wissen, zu welchem Zeitpunkt die Variable neu "befüllt" wird. Außerdem ist die Varable nie leer.

    Ich habe mal versucht umzusetzen, was ich oben phantasiert habe. Ging relativ problemlos. Einziges Problem bleibt darin zu wissen welches ASCII-Zeichen ich als "Lückenfüller" brauche. Doch das führt hier zu weit.

    Nochmal vielen Dank an alle die hier geholfen haben.

    Gruß

    Stephan

    P.S.: Hört sich so an, als kämst Du aus der Nachrichtentechnik....


Anmelden zum Antworten