Verfremden von Waves

Hallo Leute,

welche mathematischen Tricks kann man so mit Sprachdateien machen, wenn sie mir als .wav vorliegen. Mir schwebt da z.B. „Roboter“-Stimme, Veränderung der Stimm-Frequenz (ohne an der Abspielgeschwindigkeit / Dauer des Samples was zu ändern) oder bestimmte Frequenzen herausrechnen. Oder sind das so Sachen, die software- / rechentechnisch gar nicht möglich sind und die Soundkarte das per Hardware (Frequenzweichen, etc) macht?

Danke, Ebenezer Scrooge

Hallo Leute,

welche mathematischen Tricks kann man so mit Sprachdateien
machen, wenn sie mir als .wav vorliegen. Mir schwebt da z.B.
„Roboter“-Stimme, Veränderung der Stimm-Frequenz (ohne an der
Abspielgeschwindigkeit / Dauer des Samples was zu ändern) oder
bestimmte Frequenzen herausrechnen. Oder sind das so Sachen,
die software- / rechentechnisch gar nicht möglich sind und die
Soundkarte das per Hardware (Frequenzweichen, etc) macht?

Das würde mich auch saumäßig interessieren! Also, die genaue mathematische Erklärung. Am genialsten wäre natürlich die direkte Veränderung einer .wav-Datei per eigenem Programm (in C oder so…).
So lowlevel-Funktionen wie makeRobot(waveFile),…

Bin mal gespannt, ob da irgendjemand was weiss…

Grüße und auf Antworten wartend,
Alexander

Ich danke Alexander für seine Unterstützung des Vorhabens.

Zur Unterstreichung meiner Ernsthaftigkeit, habe ich mir selbst ein paar Gedanken gemacht.

  1. „Robot“: Hier habe ich zumindest eine technische Erklärung. Soviel ich weiss, moduliert man auf dem blechern klingenden Rauschen „einfach“ die Stimme auf (wie auch immer das im Detail funktioniert)

  2. Gemeint mit Frequenzänderung ist hier die Ausgabe eines typischen „Terroristenanrufes“. Dort läuft das Ganze sicherlich hardwaremäßig ab, wegen Echtzeit. Hier sind die Elektrotechniker und Physiker gefragt. Denn die Funktionsweise eines solchen Gerätes gibt sicher Anhaltspunkte für die Softwarelösung. Goldwave hat bspw den Dopplereffekt im Angebot, damit wird das Sample aber auch kürzer / länger.

Ich als Hobbyprogrammierer (bin selbst kein Informatiker) hab’ mal ein wenig mit Pascal und einigen Waves herumgespielt und folgendes ausprobiert:

  • zunächst habe ich 100 ms Stückchen auf, na sagen wir 80ms runtergequetscht und die 20ms Lücken mit Nullen gefüllt, das gab aber häßliches Knacken (ich vermute wegen der Sprünge, Möglichkeit: keine Nullen, sondern Endpunkt und Anfangspunkt linear verbinden)
  • der andere Weg: hochstrecken der 100ms auf 120ms und anschließendes Weglassen bestimmter Teile gab auch keinen tollen Effekt
  1. An den folgenden Überlegungung zum Thema Frequenzen herausrechnen bin ich bereits gescheitert. Wie mische ich 2 Waves, so dass sie sich ungestört überlagern? Und anders: Wenn ich eine x Hz Ausgangsfrequenz als Wave habe, wie schaffe ich es, dass genau diese Frequenz aus dem Musikwave verstummt (subtrahieren, dividieren, logische Verknüfung)

Das ganze find ich wahnsinnig interessant, aber irgendwie habe ich keinen konkreten Anhaltspunkt für die mathematischen Sachen, die da möglicherweise dahinterstehen.

Ich hoffe weiterhin auf spannende Vorschläge

Ebenezer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Also, nochmal ganz kurz:

Ich studiere nämlich Physik und habe zumindest die Möglichkeit, die Theorie zu erfragen, da ich schon ewig Programmiere wäre die Umsetzung vielleicht auch nicht soooo… verzwickt!

Aber noch eine Frage: Du hast schon mit Waves herumexperimentiert, sagst Du? Hast Du einfach die *.wav-Datei als binäre Datei geladen und dann einzeln moduliert???

Weisst Du auch, dass *.wav-Files in Blöcke unterteilt sind??
Du darfst nur den Datenblock modulieren, sonst verlierst Du den Header und dann war’s das mit Deiner Wave-Datei. Ich schau’ nochmal genau nach und mail Dir genau den Aufbau, okay?

Ich glaub’, ich frag’ auch gleich heute in der Uni mal meinen Professor…

Gruß
Alexander

Hallo Alexander,

Ich hab’ irgendwo den Aufbau des Headers gehabt, und wenn das bekannt ist, ist es ja kein Problem mehr, die Anreihung der Amplituden in irgendeiner Weise zu bearbeiten (Für kleine Experimente war es natürlich sinnvoll, einfach erstmal mit 8 Bit, Mono zu arbeiten, denn da erspart man sich den Umrechnungsaufwand.)

Meine „Experimente“ beschränkten sich im wesentlichen darauf, den Header zu überspringen (ich wußte ja, welche Art von Waves ich reinschicke) und die sequentell eingelesenen Bytes irgendwie anders wieder zu speichern.

Also auch nach meinen Pascal-Orgien war sie noch als Wave brauchbar von Goldwave lesbar, nur das Ergebnis war halt nicht so ganz das, was ich mir anfangs vorgstellt hatte. Aber das Interesse der Materie hat es schon geweckt und ich sehe mich auch in Sachen Mathe, Physik, Informatik als interessierter Fortgeschrittener, so dass wir gleich voll einsteigen könnten.

Wo bleiben die anderen Interessierten? Sonst könnten wir uns ja gleich über EMail unterhalten.

Tschüß,
Ralph / Ebenezer

Ich werd’ nochmal schauen, wo ich den Header „Wave“ habe und werde es dann hier mal einstellen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

welche mathematischen Tricks kann man so mit Sprachdateien
machen, wenn sie mir als .wav vorliegen. Mir schwebt da z.B.
„Roboter“-Stimme, Veränderung der Stimm-Frequenz (ohne an der
Abspielgeschwindigkeit / Dauer des Samples was zu ändern) oder
bestimmte Frequenzen herausrechnen. Oder sind das so Sachen,
die software- / rechentechnisch gar nicht möglich sind und die
Soundkarte das per Hardware (Frequenzweichen, etc) macht?

vor mittlerweile ueber einem jahrzehnt gab es mal nen recht guten grundlagenartikel zum thema digitale filter in der c’t…

c’t 12/87, Seite 92

wenn ich mich recht erinnere, gab es dazu dann auch noch die sourcen in 68k assembler zum abtippen fuer den kat-ce (in realtime natuerlich), einen 68008 einplatinencomputer zum selberloeten…
ja, das waren noch zeiten, da war die c’t noch das magazin fuer leute mit der lizenz zum loeten und jeder zweite artikel war „mit beiden armen tief im system“

joachim, der schon seit einigen tagen c’t liest…

Die c’t ist doch noch immer recht systemnah. Gegenüber dem einstigen Pionier „Chip“, der ja schon seit längerer Zeit nur noch Berichte für die Masse schreibt (Kaufempfehlungen, Tips und Tricks zu Windows & Co.,…). Und das „PC Magazin“ könnte auch mal wieder zu seinen „DOS international“ Wurzeln zurückkehren. (einzig PC Underground ist von Interesse)

Die c’t gibts ja auch auf c’t ROM, leider erst ab 1990. Aber ab dem Zeitpunkt hab’ ich sie ja eigentlich da… ich werd’ mal mein Archiv-Orakel befragen.

vor mittlerweile ueber einem jahrzehnt gab es mal nen recht
guten grundlagenartikel zum thema digitale filter in der
c’t…

c’t 12/87, Seite 92

wenn ich mich recht erinnere, gab es dazu dann auch noch die
sourcen in 68k assembler zum abtippen fuer den kat-ce (in
realtime natuerlich), einen 68008 einplatinencomputer zum
selberloeten…
ja, das waren noch zeiten, da war die c’t noch das magazin
fuer leute mit der lizenz zum loeten und jeder zweite artikel
war „mit beiden armen tief im system“

joachim, der schon seit einigen tagen c’t liest…

Hallo Leute,

welche mathematischen Tricks kann man so mit Sprachdateien
machen, wenn sie mir als .wav vorliegen.

Zunächst mußt Du eine reine Binärdatei haben, dann kannst Du aber praktisch jede beliebige Manipulation vornehmen. Die Mathematik dazu ist aber nicht ganz trivial. Die bekanntesten Methoden dazu dürften sein:

  1. Digitale Filter. Damit lassen sich alle bekannten Filterfunktionen mathematisch simulieren. Sie werden gerne in Echtzeitanwendungen eingesetzt.

  2. Fourier-Transformation. Das Sample wird zunächst in den Frequenzbereich transformiert, also in sein komplexes Frequenzpektrum. Im Frequenzbereich lassen sich die einzelnen Frequenzbereiche gut bearbeiten. Anschließend wird das komplexe Spektrum wieder in eine reale Zeitfunktion rücktransformiert.

Zu beiden Verfahren sollte es Unmengen an Literatur geben, insbesondere im Zusammenhang mit der Programmierung von Signalprozessoren.

Mir schwebt da z.B.
„Roboter“-Stimme, Veränderung der Stimm-Frequenz (ohne an der
Abspielgeschwindigkeit / Dauer des Samples was zu ändern) oder

Das ist das Prinzip des Harmonizers. Das kann man natürlich auch simulieren. Du legst die Daten in einem Ringpuffer von z.B. 20 ms Länge ab, in den die Daten zyklisch reingeschrieben werden. Aus diesem Puffer werden die Daten dann ebenfalls zyklisch, jedoch mit einer anderen Abtastrate ausgelesen. Ggf. muß anschließend die Abtastrate wieder auf den ursprünglichen Wert zurückgerechnet werden. Kritisch ist noch der Moment, wenn sich Lese- und Schreibpointer gegenseitig „überholen“. Diese Unstetigkeitsstelle im Lesesignal macht sich durch einen Knack bemerkbar. Das kann man ausbügeln, indem man den Puffer nicht einfach überschreibt, sondern eine weiche Übergangszone schafft, in der neue und alte Werte vermischt sind und der Anteil der alten Werte langsam auf null sinkt.

bestimmte Frequenzen herausrechnen. Oder sind das so Sachen,
die software- / rechentechnisch gar nicht möglich sind und die
Soundkarte das per Hardware (Frequenzweichen, etc) macht?

Das ist mit den o.a. Verfahren kein Problem. Wenn Du aber reale dreidimensionale akustische Filterfunktionen simulieren willst, z.B. das Klangverhalten eines Konzertsaales, kann es beliebig kompliziert werden.

Jörg

Zunächst mußt Du eine reine Binärdatei haben, dann kannst Du
aber praktisch jede beliebige Manipulation vornehmen. Die
Mathematik dazu ist aber nicht ganz trivial. Die bekanntesten
Methoden dazu dürften sein:

Nun, daran solls nicht scheitern, ich habe mal den Header rausgesucht:

00h-03h 4 Bytes String "RIFF"
04h-07h 4 Dateilänge
08h-0Bh 4 String "WAVE"
0Ch-0Fh 4 String "FMT "
10h-13h 4 Datenlänge
13h-15h 2 Format: 1=Mono; 2=Stereo
16h-17h 2 Anzahl der Kanäle
18h-1Bh 4 Samplerate in Hz
1Ch-1Fh 4 Anzahl Bytes je Sekunde
20h-21h 2 Bytes je Sample --\> 1=8Bit Mono
 2=8Bit Stereo oder 16Bit Mono
 4=16Bit Stereo
22h-23h 2 Bit je Sample
24h-27h 4 String "DATA"
28h-... ... An hier kommen die Daten

Ich hoffe, mit diesen Infos kann ich einige interessierte noch dazu bewegen, ein wenig mit den Sounddateien zu experimentieren.

  1. Digitale Filter. Damit lassen sich alle bekannten
    Filterfunktionen mathematisch simulieren. Sie werden gerne in
    Echtzeitanwendungen eingesetzt.

redest Du hier von Hardwarelösungen?

  1. Fourier-Transformation. Das Sample wird zunächst in den
    Frequenzbereich transformiert, also in sein komplexes
    Frequenzpektrum. Im Frequenzbereich lassen sich die einzelnen
    Frequenzbereiche gut bearbeiten. Anschließend wird das
    komplexe Spektrum wieder in eine reale Zeitfunktion
    rücktransformiert.

Moment, da durchschießt es mich! Das ist doch auch ein Teil der mp3 Kompression, oder? Also ist es nicht so einfach möglich, eine Trägerfreguenz mit bekannter Hertzzahl einfach durch lgische Operationen mit meiner Wave-Datei zu verknüpfen?

Zu beiden Verfahren sollte es Unmengen an Literatur geben,
insbesondere im Zusammenhang mit der Programmierung von
Signalprozessoren.

Oder kennst Du auch gute Links (irgendwelche Universitäten, Fraunhofer, Working Papers im Netz,…

Das ist das Prinzip des Harmonizers. Das kann man natürlich
auch simulieren. Du legst die Daten in einem Ringpuffer von
z.B. 20 ms Länge ab, in den die Daten zyklisch reingeschrieben
werden. Aus diesem Puffer werden die Daten dann ebenfalls
zyklisch, jedoch mit einer anderen Abtastrate ausgelesen. Ggf.
muß anschließend die Abtastrate wieder auf den ursprünglichen
Wert zurückgerechnet werden. Kritisch ist noch der Moment,
wenn sich Lese- und Schreibpointer gegenseitig „überholen“.
Diese Unstetigkeitsstelle im Lesesignal macht sich durch einen
Knack bemerkbar.

Nicht ganz so elegent aber vom Prinzip her hab’ ichs ja mal probiert. Ich les’ mal weiter, jetzt scheint es spannend zu werden :wink:

Das kann man ausbügeln, indem man den Puffer
nicht einfach überschreibt, sondern eine weiche Übergangszone
schafft, in der neue und alte Werte vermischt sind und der
Anteil der alten Werte langsam auf null sinkt.

Das hab’ ich jetzt nicht gleich zu 100% verstanden, aber ich lasse mir mal Deine Ausführungen durch den Kopf gehen, prinzipiell ist mir klar, was Du meinst . Ich danke Dir für Deine Tipps

reale dreidimensionale akustische Filterfunktionen simulieren
willst, z.B. das Klangverhalten eines Konzertsaales, kann es
beliebig kompliziert werden.

Herr im Himmel, jetzt wird es richtig professionel

Ich dank Dir für die sehr guten Anregungen, du kannst hier gern noch mehr darüber schreiben. Das sind genau die Denkanstöße, die ich gesucht habe.

Tschüß
Ralph / Ebenezer Scrooge

Hallo Ralph,

  1. Digitale Filter. Damit lassen sich alle bekannten
    Filterfunktionen mathematisch simulieren. Sie werden gerne in
    Echtzeitanwendungen eingesetzt.

redest Du hier von Hardwarelösungen?

Auch. Das hängt immer von der Abtastrate ab. Bei hochfrequenten Signalen, z.B. auch im Videobereich kann es nötig sein, die Filter in Hardware aufzubauen. Bei Audioanwendungen können das auch Signalproszessoren bequem per Software durchrechnen. Bei „offline“-Anwendungen kannst Du es auch in Basic programmieren.

  1. Fourier-Transformation. Das Sample wird zunächst in den
    Frequenzbereich transformiert, also in sein komplexes
    Frequenzpektrum. Im Frequenzbereich lassen sich die einzelnen
    Frequenzbereiche gut bearbeiten. Anschließend wird das
    komplexe Spektrum wieder in eine reale Zeitfunktion
    rücktransformiert.

Moment, da durchschießt es mich! Das ist doch auch ein Teil
der mp3 Kompression, oder?

Fourier-Transformation dürfte das wichtigsten Signal-Analyseverfahren überhaupt sein. Da Analyse der 1. Schritt bei der Datenkompression ist, ist dieser Zusammenhang mit mp3 fast zwangsläufig.

Also ist es nicht so einfach
möglich, eine Trägerfreguenz mit bekannter Hertzzahl einfach
durch lgische Operationen mit meiner Wave-Datei zu verknüpfen?

Doch schon, einfache Modulationsverfahren basieren nur auf Multiplikation von Trägerwelle und Modulationssignal. Das ist trivial, hört sich aber auch nicht besonders schön an.

Zu beiden Verfahren sollte es Unmengen an Literatur geben,
insbesondere im Zusammenhang mit der Programmierung von
Signalprozessoren.

Oder kennst Du auch gute Links (irgendwelche Universitäten,
Fraunhofer, Working Papers im Netz,…

Leider nicht, als ich mich intensiver damit befasst hatte, war das Internet noch nicht soweit. Wenn Du unter „FIR-Filter“ oder „FFT“ ( Fast Fourier Transform ) suchst, solltest Du aber von Informationen und Algorithmen erschlagen werden.

Das ist das Prinzip des Harmonizers. Das kann man natürlich
auch simulieren. Du legst die Daten in einem Ringpuffer von
z.B. 20 ms Länge ab, in den die Daten zyklisch reingeschrieben
werden. Aus diesem Puffer werden die Daten dann ebenfalls
zyklisch, jedoch mit einer anderen Abtastrate ausgelesen. Ggf.
muß anschließend die Abtastrate wieder auf den ursprünglichen
Wert zurückgerechnet werden. Kritisch ist noch der Moment,
wenn sich Lese- und Schreibpointer gegenseitig „überholen“.
Diese Unstetigkeitsstelle im Lesesignal macht sich durch einen
Knack bemerkbar.

Nicht ganz so elegent aber vom Prinzip her hab’ ichs ja mal
probiert. Ich les’ mal weiter, jetzt scheint es spannend zu
werden :wink:

Das kann man ausbügeln, indem man den Puffer
nicht einfach überschreibt, sondern eine weiche Übergangszone
schafft, in der neue und alte Werte vermischt sind und der
Anteil der alten Werte langsam auf null sinkt.

Das hab’ ich jetzt nicht gleich zu 100% verstanden, aber ich
lasse mir mal Deine Ausführungen durch den Kopf gehen,
prinzipiell ist mir klar, was Du meinst . Ich danke Dir für
Deine Tipps

Es geht auch anders, ist vielleicht auch einfacher zu Programmieren:
Du nimmst 2 Lesepointer, die gleichschnell Abtasten und um eine halbe Pufferlänge versetzt sind. Du wertest aber im Normalfall immer nur einen Lesepointer aus. Immer wenn der aktive Lesepointer in die Nähe der Position des Schreibpointers gerät, blendest Du langsam auf den anderen Pointer um. Dadurch kann der Lesepointer nie den „Knackpunkt“ erreichen.

reale dreidimensionale akustische Filterfunktionen simulieren
willst, z.B. das Klangverhalten eines Konzertsaales, kann es
beliebig kompliziert werden.

Herr im Himmel, jetzt wird es richtig professionel

Ich dank Dir für die sehr guten Anregungen, du kannst hier
gern noch mehr darüber schreiben.

Lieber nicht, denn darüber müßte ich dann auch erst intensiv nachdenken. Wenn Du aber konkrete Fragen hast, gerne

Das sind genau die
Denkanstöße, die ich gesucht habe.

Das ist doch schonmal erfreulich :smile:

Jörg

Links
Im Internet gibts haufenweise Links:

Linksammlung zu Musik und Licht:
http://electro.sau.edu/SLResources.html

Physics of Sound
http://online.anu.edu.au/ITA/ACAT/drw/PPofM/INDEX.html

Audio-Effects-FAQ
http://www.harmony-central.com/Effects/audio-effects…

Noch was in Deutsch: Digitale Audioverarbeitung, ein Skript, da bin ich grad am saugen:
http://tech-www.informatik.uni-hamburg.de/lehre/ws20…

  1. An den folgenden Überlegungung zum Thema Frequenzen
    herausrechnen bin ich bereits gescheitert. Wie mische ich 2
    Waves, so dass sie sich ungestört überlagern?

Hi!
Das mit dem Ueberlagern hab ich auch schon mal gemacht.
wir nehmen jetzt mal der Einfachheit halber eine 8bit mono wav-Datei. Die Daten der Wav-Datei sind ja bekanntlich die digital umgewandelte Schallwelle. Wenn man sich das mal an einer Sinuskurve anguckt, dann ist

255 o
o o
128 - o o o -----
o o
0 o

Der ASCII-Wert 128 (oder 127 bin mir nicht ganz sicher.) steht also in einer Datei, in der nichts aufgenommen wurde.

So jetzt haben wir zwei Schallwellen.
Wir nehmen uns jeweils ein Byte mit dem ASCII-Wert X1,X2 aus den dateien datei1 und datei2.
Pseudo-Code:

X1=X1-128;
X2=X2-128;
X3=(X1+X2)/2;
X3=X3=128;

Als Ergebnis bekommst du X3 und tust das in die asugabedatei datei3. Dat machst du dann mit jedem Byte aus dem Datenbereich der Wav-Dateien. Nimm am betsen zwei gleichlange dateien.

Nur noch mal zur erklaerung: nimmst du eine sprach-wav-datei und vermischst die mit einer leeren datei dann kommt die sprachdatei aber mit halbierter lautstaerke raus. (Amplitude der Sprachwelle entspricht der Lautstaerke)