Neueste Artikel

Kategorien

Suchen

Facebook

Sonstiges

RSS-Feed-Icon RSS-Feed

Von Firefox und Softwaresounds als neu markieren

Am 26. März 2011 kam im Deutschlandradio die Sendung "Breitband" mit dem Thema "Softwaresounds und Chatterbots". (Leider gibt es keinen Artikel zum Verlinken, sondern nur ein MP3-File im Audiopodcast.)

Die Kernidee war, dass man beliebige Dateien (auch Bilder oder .exe-Dateien) in einem Audiobearbeitungsproblem laden und sich anhören kann. Spiegel Online hatte darüber bereits berichtet. Beispiele, Anleitungen und Erklärungen findet man dort ebenfalls.

Nun bin ich in der Podcast-Folge bei Minute 3 über einen Sound gestolpert, der mir bekannt vorkam. Ein Brummen mit konstanter Frequenz aber wechselnder Lautstärke und Klang. Das hört sich wie ein Bild an, vermutlich ein eingebettes Icon. Also einfach mal die Podcast-MP3 runterladen, als unkomprimiertes 8-Bit-PCM speichern und als Raw-Datei in Photoshop öffnen und siehe da: Tatsächlich, das Firefox-Logo.

Das ganze kann man sich auch synchronisiert hier anschauen:

Es ist das erste Mal, dass ich davon höre, dass im Radio ein Bild übertragen wurde. Nennt man das Faxen? Und dann auch noch gleich in Farbe!

Übrigens zur Farbe: Icons werden üblicherweise in 4 Kanälen gespeichert (RGBA = Rot, Grün, Blau, Deckkraft). Das sorgt für sehr hohe Frequenzen. Z.B. ein grünes Icon wird in einem exe-File als 00 FF 00 FF ... gespeichert. Das würde als Sound-File einen 22 kHz-Pfeifton erzeugen. Unglücklicher Weise schneidet die MP3-Kompression alles oberhalb einer Frequenz (meist 16 kHz) ab (Tiefpass), so dass die Farbinformationen mit flöten gehen. Darüber hinaus hat das Firefox-Logo wohl allerhand Resampling hinter sich, so dass sich die Phasen kontinuierlich verschiebt.

Also benötigt man für die Farbe einen phaseninvariante Transformation ... Fourier to the rescue!

Immer über 4-Byte-Blöcke wird eine Fouriertransformation durchgeführt, um das Powerspektrum zu berechnen (phaseninvariant). Bei 4 Parametern kommen 3 Frequenzen aus der Fouriertransformation raus (0, 1 und 2 Schwingungen über das Intervall). Da der hochfrequente Anteil nicht nutzbar ist (durch die MP3-Kompression), wird die höchste Frequenz verworfen. Die anderen beiden Frequenzen werden durch eine Lineartransformation (Matrizenmultiplikation + Vektoraddition) nach RGB transformiert. Die Parameter der Matrix und des Vektor kann man sich schnell mal in Excel mit dem Solver berechnen lassen.

Hier noch ein kleiner Code-Schnipsel:

   for i:=0 to sizeOut-1 do begin
   
      // Sounddaten in 4-Byte-Blöcken laden
      j:=i*4;
      a0:=dIn[j+0];
      a1:=dIn[j+1];
      a2:=dIn[j+2];
      a3:=dIn[j+3];
   
      // Mini-Fouriertransformation
      b0:=a0+a1+a2+a3;
      b1:=sqrt(sqr(a0-a2)+sqr(a1-a3));
   
      // Lineartransformation nach RGB
      dOut[i*channelsOut+0]:=clamp(b0*2.585 - b1*3.640 + 26624);
      dOut[i*channelsOut+1]:=clamp(b0*2.625 - b1*0.555 + 20409);
      dOut[i*channelsOut+2]:=clamp(b0*2.684 + b1*5.580 + 11410);
   
   end;