Hallo, bin mir nicht ganz sicher ob meine Frage hier rein gehört, aber ich hoff einfach mal, dass mir hier jemand helfen kann. Mein Problem: Ich versuche zur Zeit einen "Musikmaker" zu proggen, der das fertige Musiksignal als WAV speichern soll. Nur komme ich mit dem auslesen/schreiben der DAtei nicht weiter. Der Daten-Chunk enthält ja die gesampelten Daten, nur weis ich nicht wie die gesampelten Daten hinterlegt sind?? Angenommen ich habe eine Auflösung von 8 bit und Mono: Dann müssten doch die hintereinander folgenden bytes dem Musiksignal entsprechen, nur kommen bei mir immer Werte die entweder fast 0 oder fast 256 sind! Wo liegt mein Fehler? Würde mich sehr über Hilfe freuen! Gruß Holger
Beim Aufnehmen übersteuert ? signed/unsigned ? ohne genauere Angaben kann dir nur eine Frau mit Kopftuch und Glaskugel helfen :-) Gruss
Danke erstmal, aber Wikipedia und co. hab ich schon durchgelesen, aber da steht ja leider nicht über die "sample data". Das die übersteuert aufgenommen wurden kann ich ausschließen, weil ich es schon mit mehreren Daten probiert hab. Aber auf die Idee mit signed/unsigned bin ich noch nicht gekommen :-( Ich werds mal probieren! Gruß Holger
Ne geht nich! Habs jetzt mal versucht ein paar Dateien zu schreiben, aber die Frequenzen passen glaub ich auch nicht! Hab mal ne Test Datei mit ner 1 khz Frequenz drangehängt. Gruß Holger
Das ist nicht 1 kHz. Zwar steht im Header der Datei eine Samplerate von 10 kHz drin, aber kaum eine Audiohardware dürfte in der Lage sein, die Datei mit der richtigen Samplerate wiederzugeben. Du hast 10 Sample-Werte, die sich immer wiederholen: 00 4B 7A 7A 4B 00 B5 86 86 B5 Das ist zumindest grob angenähert sinusförmig. Mit einem vernünftigen Audioprogramm (http://audacity.sourceforge.net/) könntest Du Dir mal Deine erzeugte Datei genauer ansehen - und zum Vergleich mal mit 'nem Mikrophon ein 1 kHz-Signal aufnehmen und das ansehen.
Danke für deine Antwort!! Wenn kaum eine Hardware 10khz schafft, wie kann ich dann CD mit 44,1khz am PC anhören?? Wird die Samplerate runtergerechnet? Wenn ich mir die Datei jetzt so anschaue sieht die ziemlich schlimm aus. Wenn ich den Verlauf mit meinem Programm simuliere kommt ein sauberer Sinus mit 1khz raus. Aber egal, jetzt kann ich ja bischen rumprobieren und mir die Ergebnisse anschauen. Danke auch für den Link!! Gruß Holger
Hallo Holger, es scheint, dass Du die Nulllinie auf den Wert 0 gelegt hast. Wenn mich nicht alles täuscht, ist die Mitte aber bei 0x80. Der Sinus muesste also als 128 + sin (phi) * 127 erzeugt werden, 127 gibt dabei die (sehr hohe) Amplitude. Die Ergebniswerte sind dann ohne Vorzeichen zu betrachten und in ein Byte zu packen. Rufus' Einwand mit den 10kHz macht auch für mich Sinn: Lieber eine der Standard-Raten von 8kHz oder 11025kHz verwenden, da ist die Gefahr von Inkompatibilitäten kleiner. Gruß Jens
hi!!! Hab mir meine Signale angeschaut und mir ist aufgefallen, dass ich immer Zahlen von 0 bis 256 genommen hab, was ja total schwachsinn ist. Deshalb hatte ich auch so komische Frequenzen, bei denen immer noch ein Hochtonanteil dabei war :-( Jetzt probier ichs mal mit den 11025hz wie es Jens vorgeschlagen hat. Danke für eure Hilfe! Gruß Holger
. "Wenn kaum eine Hardware 10khz schafft, wie kann ich dann CD mit 44,1khz am PC anhören?? Wird die Samplerate runtergerechnet?" Nein, natürlich nicht. PC-Soundkarten "schaffen" natürlich auch höhere Sampleraten als 10 kHz - üblich sind Raten bis 48 kHz. Es werden aber nicht alle theoretisch denkbaren Raten unterstützt, sondern nur einige wenige Standardraten. Dazu gehören 32 kHz, 44.1 kHz und 48 kHz. Durch ganzzahlige Teilung daraus bestimmte langsamere Sampleraten (8 kHz, 16 kHz, 22.05 kHz) sind auch möglich. CDs werden auf PCs übrigens oft analog wiedergegeben, dazu ist das Audiokabel zwischen CD-ROM und Soundkarte zuständig ...
Wieder was gelernt :-) Eine Samplerate von 44.1 khz dürfte also keine Probleme bereiten. Hab grad gemerkt, dass bei 8bit Auflösung die 128 die "Mitte" darstellt und bei 16bit Auflösung die 0 die "Mitte". Wer sich so eine logig mal wieder ausgedacht hat... Gruß Holger
Diese "Logik" hat sich glaube Mutter Natur ausgedacht, denn 128 ist nunmal die Mitte zwischen 0 und 255 und eine (normale natürliche) NF-Schwingung schwingt nunmal symmetrisch um einen Neutralwert. ...
Das schon, aber bei 16bit geht der Zahlenbereich von -32768 bis 32768, also im gegensatz zum 8bit "Modus" auch mit negativen Zahlen. Liegt aber vielleicht daran, dass bei Basic beim einlesen von "short" die Variable als signed ausgegeben wird!? Gruß Holger
Da frage ich mich aber, wie man mit nur 16 Bit 65537 Wert darstellen kann. -32768 bis +32768 ist nämlich einer zuviel. Im Normalfall wird das MSB als Vorzeichen benutzt, was dazu führt, dass die 0 zu den positiven Zahlen gehört. Somit geht der Zahlenbereich bei 16Bit (auch [signed] integer genannt) von -32768 bis 32767. So gesehen gehört die 0 bei der 8Bit-Darstellung zu den negativen Zahlen...
Hmmm... Kann man signed und unsigned einfach so vergleichen? Auch bei 8-Bit ist signed möglich, dann ist 0-127 positiv und 255-128 negativ. Will man aber 8-Bit-Soundsamples (ohne Kompression) speichern, so macht es sich besser, mit einem Offset von 128 zu arbeiten. Die "Mittellinie" liegt dann nicht bei 0 sondern bei 128. Dafür hat man im gesamten Aussteuerbereich positive Zahlen und braucht die Werte vom ADC und zum DAC nicht umzurechnen. Es sind dann halt die natürlichen Werte. Die Analogspannungen (in der Schaltung) schwingen dabei natürlich auch nicht um GND, sondern um eine gegenüber GND angehobene Spannung (zumindest in Schaltungen mit asymetrischer Stromversorgung). Somit ist auch hier dieser Offset vorhanden. ...
@Hannes: und dann nimmt man hinterm OPV einen Kondensator, und schon schwingt das Signal schön um die GND herum...
Ja selbstverständlich, das habe ich ja nicht bestritten. Das ist schließlich überall üblich, wo mit asymmetrischer Stromversorgung gearbeitet wird. Da der ADC des AVRs und auch die meisten DAC-Schaltungen durchweg mit positiven Pegeln arbeiten, nutzt man eben diese (virtuelle) Verschiebung der Signalmasse. ...
??????Diese "Logik" hat sich glaube Mutter Natur ausgedacht, denn 128 ist nunmal die Mitte zwischen 0 und 255????? stimmt nicht !!!!!!!!!!!!
Dann eben 127... Ich fahre jedenfalls ganz gut dabei, 128 als Neutrallinie für 8-Bit-Mono-Sounds zu benutzen. Und zwar auf dem AVR (Wiedergabe) wie auf dem PC beim Aufbereiten der Sounds (bytegenauer Schnitt, Pegelanpassung, Loop-Bildung, Mixen) mit Eigenbau-Software (VB6). Allerdings nutze ich den Wert 0 für Steuerzwecke, Sounds gehen daher von 1 (-127) über 128 (+-0) bis 255 (+127). ...
Oh je... wichtig ist doch nur, daß die Bits an der richtigen Stelle stehen. Nutzt man nun Hilfen (Software), die diese Bitsammlungen (Bytes oder Words) lesbar darstellt, so muß man auch mit deren Vorgaben arbeiten. Für die Darstellung negativer Zahlen im Binärsystem sollte man sich mal das 2er-Komplement ansehen ! Im Grunde können 8 Bit als unsigned Integer (0 bis 255) angesehen werden, als signed Integer (-128 bis 127), als ASCII-Zeichen, oder auch als Farbe eines Bildpunktes... Nimmt man unsigned Werte, lebt man in einer Welt, in der Audiosignale um 128 "herumschwingen". 128 entspricht 0. Stellt man die gleichen Daten als signed Integer dar ist es plötzlich und erwartet -128 bis 127 ! Gleiches gilt für Worte (16 Bit) ! Nur hat sich da eingebürgert, die signed Darstellung zu nehmen, weil man mit so rießig großen Zahlen (-32768 bis 32767) ja richtig rechnen kann. Für die "wahren" Programmierer ist es 0 bis 65535 ! (siehe auch: wahre Programmierer essen kein Müsli!) und da schwingt das Audio-Signal eben um 32768!. Für das IC ist es völlig egal. Das verlangt SEINE Werte, es gibt ja auch keine ICs, die die BCD-Darstellung verstehen ;-).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.