Übung 3
Klirrfaktor
3.1
Klirrfaktor: Als erstes wollen wir ein vorhandenes Wavefile in der Lautstärke anheben. Dies realisiert man durch Multiplikation jedes Abtastwertes mit einem konstanten Faktor, d.h. mit einem Multiplizierer. Zunächst wollen wir das Musicfile aus der 1. Übung um 3, 6 und 9 dB verstärken. Dabei wird es bei hoher Verstärkung zwangsläufig zu einem sogenannten Clipping kommen: Das Produkt aus der Originalamplitude und dem Verstärkungsfaktor ist betragsmäßig größer als der maximal darstellbare Amplitudenwert, d.h. bei 16 bit < -32768 bzw. > 32767. In diesem Fall muß dafür gesorgt werden, daß der resultierende Wert auf genau -32768, bzw. 32767 gesetzt wird. Clipping ist akustisch als immer stärker werdende nichtlineare Verzerrung wahrnehmbar.
Bei welcher Verstärkung wird eine Verzerrung beim gewählten Soundfile wahrnehmbar? (Source-Ausschnitt, wave und Ausschnitt mit geclippten Bereichen ins Protokoll).
Ein Maß für die Verzerrung ist der sogenannte Klirrfaktor k, der für eine periodische Schwingung folgendermaßen definiert ist:
k=Effektivwert ohne Grundwelle/Effektivwert mit Grundwelle. Der Klirrfaktor läßt sich aus dem Spektrum berechnen. Wir wollen nun eine
Sinusschwingung von 1kHz
um 6, 9 und 12 dB verstärken und den resultierenden Klirrfaktor berechnen (Spektrogramm des Ausgangsignals mit GRAM berechnen, Plot ins Protokoll). Den Effektivwert ohne/mit Grundwelle einer harmonischen Schwingung berechnet man, indem man die auf die Grundwelle bezogenen Amplituden der Obertöne quadriert, addiert und aus dem Resultat die Wurzel zieht:
Effektivwert_gesamt_mit_Grundwelle = sqrt( Effektivwert_F0**2 + Effektivwert_2F0**2 + Effektivwert_3F0**2 + ...)
Dazu muß man die dB-Angaben aus GRAM in lineare Angaben zurückrechnen (siehe Aufgabe 2.1).
Lösung
Die CDImport1 Datei wurde mittels dieses Codes verstärkt.
// Aufgabe 3.1
for(i = 0; i < n_wave; i++) {
float_wave = wave[i];
float_wave *= a9db; //Verstaerkungsfaktor hier angeben
wave[i] = float_wave;
if (float_wave > 32767) {
wave[i] = 32767;
}
if (float_wave < -32768) {
wave[i] = -32768;
}
}
Hier folgt das Ergebnis der Verstärkungen mit jeweils 3, 6 und 9 dB nach dem Original. Die Analyse der Dateien erfolgte mittels GRAM.
Nicht verstärkt:
zum Anhören: CDImport.wav im Original.

3 dB verstärkt:
zum Anhören: CDImport1_3db.wav um 3dB verstärkt.

6 dB verstärkt:
zum Anhören: CDImport1_6db.wav um 6dB verstärkt.

9 dB verstärkt:
zum Anhören: CDImport1_9db.wav um 9dB verstärkt.

Verstärkung einer 1kHz Sinus Welle
6 dB verstärkt:
zum Anhören: Sinus 1kHz um 6dB verstärkt.

9 dB verstärkt:
zum Anhören: Sinus 1kHz um 9dB verstärkt.

12 dB verstärkt:
zum Anhören: Sinus 1kHz um 12dB verstärkt.

So ergibt sich dann ein Klirrfaktor, der in der nächsten Tabelle aufgezeigt wird. Die Berechnung des Faktors wurde bei 6 dB ausgelassen, weil nur die Grundfrequenz vorhanden war.


Echo
3.2 Echo: Ein wichtiger Effekt in der Studiotechnik ist das Echo. Dabei wird zu einem Signal eine zeitverzögerte und in der Amplitude gedämpfte Überlagerung hinzugemischt: y(k)=x(k)+a*x(k-T), wobei T eine ganze Zahl zwischen 1 und N sein kann. Wir wollen WAVE_IO so modifieren, daß wir eine Verzögerung von 10 bzw 200 ms erreichen. Um wieviele Abtastwerte müssen wir verzögern, wenn wir mit einer Abtastrate von 44.1 kHz arbeiten ? Wir setzen a auf 0.6. (wave Original und mit Echo, Programm-Source ins Protokoll). Hinweis: Bei Stereodateien müssen wir berücksichtigen, daß linker und rechter Kanal getrennt verzögert werden müssen. Die Samples für links und rechts liegen im Array wave jeweils hintereinander.
Lösung Bei einer Abtastrate von 44.1kHz muss bei einer Verzögerungszeit von 10ms um 441 Abtastwerte verzögert werden und bei einer Verzögerungszeit von 200ms um 8820 Abtastwerte verzögert werden.
Code für das Erstellen eines Echos bei einer Zeit von 10ms:
//Echo
e= (int) (0.01*freq_in);
if(header.modus==2){
e = e * 2;
}
new_wave=(short*) malloc(n_wave* sizeof(short));
for(i = 0; i < n_wave; i++) {
float_wave=wave[i];
float_wave*=a0;
new_wave[i]=(short) float_wave;
if(e<=i){
float_wave=wave[i-e];
float_wave*=a1;
new_wave[i]+=(short) float_wave;
}
}
Die zwei Original-Dateien:
Sprachaufnahme.WAV
CDImport.wav
Die Echo-Dateien:
Echo_Sprachaufnahme_10ms.wav für Verzögerung um 10ms
Echo_Sprachaufnahme_200ms.wav für Verzögerung um 200ms
Echo_CDImport_10ms.wav für Verzögerung um 10ms
Echo_CDImport_200ms.wav für Verzögerung um 200ms
Einfaches Filter
3.3 Einfaches Filter: Ein sehr einfaches Filter kann man z.B. mit der Zuordnungsvorschrift (a) y(k)=0.5*x(k)+0.45*x(k-1) realisieren. Programmiere das Filter und vergleiche eine Musicdatei vor und nach der Filterung. Tue dasselbe mit der Zuordnungsvorschrift
(b) y(k) = 0.5 * x(k) - 0.45 * x(k-1). Um was für eine Art Filter handelt es sich jeweils ? (waves Original, Filter a) und b) ins Protokoll)
Zum Testen unserer Filter verwenden wir
Weißes Rauschen,
das alle Frequenzen enthält. Wenn wir nun das Original-Spektrum (oben) mit den gefilterten vergleichen, sollte sich ein Bild wie in der Mitte und unten ergeben, anderenfalls ist etwas mit dem Programm nicht in Ordnung (welcher Output von welchem Filter stammt, wird nicht verraten ! Das müßt Ihr selber herausfinden.) Um eine Glättung des Spektrums zu erzielen, bei GRAM 'Spectrum Average' auf 100 setzen. (Plots der eigenen Spektren ins Protokoll !)
Lösung
Code zum erstellen von Filter A:
n = 1;
for(i=0;i= n) {
float_wave_1 = wave[i-n];
wave_new[i] = 0.5 * float_wave + 0.45 * float_wave_1;
}else{
wave_new[i] = wave[i];
}
}
Code zum erstellen von Filter B:
n = 1;
for(i=0;i= n) {
float_wave_1 = wave[i-n];
wave_new[i] = 0.5 * float_wave - 0.45 * float_wave_1;
}else{
wave_new[i] = wave[i];
}
}
Original-Dateien:
Noise.wav
CDImport1.WAV
FilterA-Dateien:
Noise_FilterA.wav
CD_Import1_filter_A.wav
Wie man in der Spektralanalyse sieht, werden nur tiefe Frequenzen durchgelassen. Daraus folgt, dass es sich bei dem Filter um einen Tiefpassfilter handelt.
FilterB-Dateien
Noise_FilterB.wav
CD_Import1_filter_B.wav
Wie man in der Spektralanalyse sieht, werden nur hohe Frequenzen durchgelassen. Daraus folgt, dass es sich bei dem Filter um einen Hochpassfilter handelt.
|