WAV: z.B. 48KHz Stereo 16Bit -> 22KHz Mono 8Bit
-
Hi!
Ich brauche unbedingt einen Weg, um von Wave-Dateien die Sampling Rate und so zu verändern, mit annehmbaren Ergebnis. Hatte schon ein paar Anläufe, das zu programmieren, aber ich weiß einfach nicht, wie!
Mit nem Audio-Programm kann ich das ja schnell machen, aber ich brauch das in meinem aktuellen Programm. Bei Google hab ich ausnahmsweise REIN GAR NICHTS dazu gefunden, also bin ich hilflos!Kann mir da jemand helfen oder einen Ansatz geben? Evtl. auch ein Tutorial oder den Hinweis, dass es für Wave-Laien unmöglich ist...
Bin für alles dankbar,
Mit freundlichen Grüßen,
Badestrand
-
mmh, weiss ja nicht genau wo dein Problem liegt.
Also ich wuerde das einfach mal so probieren, fuer mono wuerde ich L+R bilden. Ok dann muss man noch die samplefrequenz reduzieren, da muss man aber nicht einfach jedes, x-te sample nehmen, sondern man muss vorher filtern, antialising.
also bei wenn du auf 22khz willst musst du alles ueber 11khz wegfiltern. Interpolieren muss man auch noch, wenn nicht genau teibar ist, schau mal ob linear gut genug ist.Gruss
Flow
-
Danke schonmal für die Antwort!
Ich weiß halt nicht genau, wie ich das anpacken soll! Erstmal um den Aufbau der Wave-Daten zu verstehen:
Es liegen ganz viele Blöcke hintereinander, bei 44 KHz also 44100 Blöcke für jeweils 1 Sekunde. Bei Stereo 16Bit ist eine Blockgröße also 2*2 Byte, also 4 Bytes?
Davon die ersten 2 Bytes (1 Word) für den linken, die nächsten 2 Bytes für den rechten Kanal?
Dieses Word, das die Audioinformation hält, ist das im Klartext eine Frequenz für diesen Moment?Flow_cplus schrieb:
L+R
Muss ich dann also einfach die Frequenzen vom linken und rechten Kanal addieren? Oder den Mittelwert bilden?
Also, Klartext, ob ichs richtig verstanden habe
:
Stereo->Mono
Die Frequenzen des linken und rechten Kanals addieren. (Oder Mittelwert??)16Bit->8Bit
Es gibt nur noch 256 statt 65536 verschiedene Frequenzen, also praktisch die Frequenz durch 256 teilen?Z.B. 44KHz->22KHz
Die Anzahl der Blöcke pro Sekunde muss reduziert werden. Bei halber Frequenz könnte man theoretisch jeden zweiten Block weglassen. Besser ist aber, man interpoliert oder antialiasied die Frequenzen.Ist das richtig so? Wenn nicht, hab ich gar nix verstanden
-
hoppla, du rennst ja voellig gegen die wand !!!!!!
was willst du denn mit verschiedenen frequenzen und bit aufloesung, das ist doch so
gar kein zusmannen hang!!!
Eine Wave file speichert die Zeitdaten, diskrete amplituden werte uber der Zeitachse,
frequenzen sind da so nicht direkt ersichtlich. (dazu muesste man das material z.B.
Fourier analysieren).
also:
16->8: teilen ist nicht so ganz verkehrt, keine frequenzen: man schneidet im
einfachsten fall einfach die minderwertigen 8bit weg der sechzehn, und schon hat
man 8 bit uebrig: (da ein shift, teilen durch 2 ist, koennte man das so formulieren)
Ganz so einfach ist es aber leider nicht, wenn man im waveformat arbeitet (specis z.B
unter wosit.org oder auch im petzold ): 8 oder 16 bit, da ist die null unterschiedlich,
also muss man den code umsetzten: (wenn ich mich recht erinner: war 0 bei 16bit
0000 0000 0.... , aber 8 bit aber 1000 0000, aber keine garantie drauf, mit 8 bit
arbeite ich nicht mehr)
Aber mach dir klar direkt hat das nix mit frequenzen zu tun, das sind zeifunktionen, die
natuerlich freqenzen enthalten, darum geht es ja.
Aber das sind erstmal die uncomprimierten zeitsamples.l+R: Wie man am besten momo macht aus stereo bin ich mir nicht sicher. Man kann
das sicher sehr verfeinern, wenn man korreliert um zu sehen, wie aenhlich stereo (l
und R) ist, um dann mit entsprechenden techniken zu arbeiten.
Bei radio oder fernseh, macht man es aber simple. Mit der Einfuehrung von stereomussten ja alte mono radios auch noch arbeiten: also sendete man am alten mono
kanal einfach L+R, und dann noch L-R (anders gelagert) damit kann man alles wieder
zuruekholen im empfaenger.
so Digital muss man aufpassen L+R, heisst fuer jedes sample L+R: neues Mono
sample = Lsample +Rsample. aber bei z.B 16bit kann man ja nicht mehr als 16 bit
haben, Ich wuerde wahrscheinlich mit 32 bit logic zusammen zaehlen und dann muss
man das signal auf 16 bit comprimieren, soonst clipt es.
Gerade bei L=R wirds etwas komplizierter, normal heistt es unkorrelierte signal
addieren die leistung, korrelierte addieren die amplitude (heisst leistung x4).
Da gerade das l und R signal teilweise stark korreliert sein koennen, aber auch nur
wenig, das haengt stark vom material ab.
Ich wueder wahrscheinlich da einen Compressor duerber rechnen, gerade wenn manauf 8 bit geht, ist die dynamik schon stark reduziert. (Und da muss man dann ziemlich
compremieren, damit alles "da" bleibt)
Du kannst sicher auch den mittelwert bilden, das wird die aber die gesamt amplitude reduzieren, (ausser r=l, und es war schon "fast" mono).
44->22
was meinst du mit block?? du kannst fast jedes zweite sample weglassen, ja, aber wie schon erwaehnt nicht s einfach: erstens interpolieren, wenn 44->22, dann gehts so, aber nicht bei 48->22,
ABER: wie schon gesagt: FILTERN!!!! 44 khz, kann frequenzen darstellen (als zeitfunktion hier, nur damit du nicht wieder auf frequenzen kommst) von 0-22 khz, als bis 44/2 .... , aber 22khz kann nur bis 11khz darstellen.
Was also passier mit den frequenzen 11-22?? wenn die sample rate reduziert, verschwinden die nicht einfach:
z.B nimm einen sin mit 11+5- also 16khz, der muesste ja jetzt voellig verschwinden. wenn did fs reduzierst, tut er aber ja nicht, du nimmst ja nur jedes zweite sample raus, an den reststellen ist er ja noch da.
du kannst das ja ganz einfach testen, errechne dir nen sin mit der freq, als wave file redusiers und hoer dann wieder. Was bleibt ist eine frequenz von 11-5 = 6 khz.
Das nennt man Rueckfaltung oder antialias.Kurz und gut, du musst dein material vorher filter: So wie am eingang deiner soundkarte ein Filter ist, (genauso wenn man digtal eine rechtecksfunktion erzeugt, kann auch nicht einfach ein rechteck malen, sonder man muss frequenzen ueberlagen, die nicht ueber fs/2 rausgehen, sonst gibst probleme)
du musst alle frequenzen ueberhalb von fs/2 rausfiltern, sont wirds sehr unangenehm.
du kannst mit FFT filtern oder mit zeitfiltern IIR/FIR, dann keine filter absolut schneidet, wird man ca, von 10 - 12 khz versuchen den filter abfallen zu lassen.
Hoffe, jetzt hab ich genung verwirrung geschaffen
Lg
Floe
-
WOW! Muchas muchas gracias für die ausführliche Antwort. Ich hab nicht unbedingt alles verstanden, aber ich les es mir einfach noch ein paar mal durch. Dann denk ich drüber nach, studiere Digitale Musik und schreib mein Programm...
Nene, ich hol mir noch nen paar Tutorials und falls ich dann noch Fragen hab, melde ich mich nochmal. Auf jeden Fall vielen vielen Dank!
-
Erstmal die Frage, warum willst du sowas programmieren, wenns schon passende Freeware gibt, die das in sehr guter Qualität erledigt (um da ran zu kommen müsstest du dich schon etwas mehr mit der Materie auseinandersetzen):
-
Helium schrieb:
Erstmal die Frage, warum willst du sowas programmieren, wenns schon passende Freeware gibt, die das in sehr guter Qualität erledigt
Ich schreib grade an einem Programm, und dafür muss ich als Datengrundlage viele CDs rippen. Und zwar jedes Lied in 6 Qualitätsstufen. Das manuell mit irgendwelchen Programmen zu machen, könnte Wochen dauern. Und da ich schon ein Grundgerüst hatte für Wavedateien (na gut, nur einlesen und so...), dachte ich, wenn das konvertieren nicht so schwer ist, könnte ich es mal versuchen. Mittlerweile weiß ich nicht, wie ich es machen soll
EDIT1:
Aber danke für den Link!EDIT2:
Vielleicht ließe es sich so machen, dass ich CDs alle so rippe (mit "FreeRip") und mir ein Programm schreibe, das auf r8brain (übrigends cooles Programm!) zugreift und da die Edit-Felder und DropDownBoxen einstellt und die Lieder alle konvertiert. Muss ich mal probierenEDIT3:
Das Programm kann nur kein Stereo->Mono, aber find ich schon was