Forum: PC-Programmierung Wav-Datei auslesen


von Holger (Gast)


Lesenswert?

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

von T.Stütz (Gast)


Lesenswert?

Beim Aufnehmen übersteuert ?
signed/unsigned ?

ohne genauere Angaben kann dir nur eine Frau mit Kopftuch
und Glaskugel helfen :-)

Gruss

von Rahul (Gast)


Lesenswert?

vielleicht mal darauf ein Blick werfen:

http://de.wikipedia.org/wiki/WAV_(Format)

von Holger (Gast)


Lesenswert?

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

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Holger (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

.

   "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 ...

von Holger (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


Lesenswert?

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.

...

von Holger (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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...

von ...HanneS... (Gast)


Lesenswert?

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.

...

von Rahul (Gast)


Lesenswert?

@Hannes:
und dann nimmt man hinterm OPV einen Kondensator, und schon schwingt
das Signal schön um die GND herum...

von ...HanneS... (Gast)


Lesenswert?

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.

...

von pebisoft (Gast)


Lesenswert?

??????Diese "Logik" hat sich glaube Mutter Natur ausgedacht, denn 128
ist nunmal die Mitte zwischen 0 und 255?????
stimmt nicht !!!!!!!!!!!!

von ...HanneS... (Gast)


Lesenswert?

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).

...

von Bernd Rüter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.