Aufgabe 1

Erzeuge zwei kurze Audio-Files (max. 5 s), davon eines mit Musik deiner Wahl aus dem Internet (wobei sich Musik mit einer relativ hohen Dynamik, d.h. Wechsel zwischen relativ leisen und lauten Abschnitten empfiehlt). Wähle eine geeignete Abtastfrequenz (begründen !) und achte auf gute Aussteuerung. Das zweite Audio-File soll eine Sprachaufnahme (mit dem Headset aufgesprochen) enthalten (Übersteuerung vermeiden !). Wähle hier eine Abtastfrequenz von 22 kHz, 16 bit Auflösung, mono. Die Einstellungen wie Abtastrate, Bitzahl und Kanalzahl können im Wavestudio Samplitude vorgenommen werden. Die Eingangsquelle (wahlweise Audio-CD oder Mikrofon) kann im Windows-Mixer 'Aufnahme' eingestellt werden. Benenne die Dateien "Musik_NameArbeitsgruppe.wav" und Sprache_NameArbeitsgruppe.wav". Schick mir die beiden WAV-Dateien unter Nennung deiner Arbeitsgruppe per Mail. In den folgenden Übungen wirst du diese Dateien oft als Ursprungssignale verwenden. Sollten sie verloren gehen, kannst du sie notfalls wieder von mir erhalten. Darauf werde ich dir zwei WAV-Dateien mit Testsignalen zusenden, die du bei den folgenden Aufgabenpunkten benötigst, sine_hiXX.wav und sine_loXX.wav. Nun lies die Musik- und die Sprachdatei mit wave_io ein und erkläre die Angaben im Header ! Wie hoch ist die Bitrate für die beiden Dateien?

Musik_Detail.wav

infile: Musik_Detail.wav
filelength 888980
samples 443896
rate 44100
bits 16
bytes per sample 4
channels 2

Sprache_Detail.wav

infile: Sprache_Detail.wav outfile:
filelength 221860
samples 110171
rate 22050
bits 16
bytes per sample 2
channels 1

sine_hi01.wav

infile: sine_hi01.wav outfile:
filelength 32036
samples 16000
rate 16000
bits 16
bytes per sample 2
channels 1

sine_lo01.wav

infile: sine_lo01.wav outfile:
filelength 32036
samples 16000
rate 16000
bits 16
bytes per sample 2
channels 1

Bitraten der Dateien

Für die Musik haben wir eine Abtastrate von 44,1 kHz genommen, damit wir alle Feinheiten hören können.

Bei der Sprache reichte eine Abtastrate von 11 kHz aus.

Erklärungen der Angaben im Header

Attributname Beschreibung
filelength Beschreibt die Dateigröße in Byte
samples Anzahl der Samples
rate Abtastfrequenz
bits Auflösung
bytes per sample Bestimmt wie viele Bits pro Kanal vorhanden sind
channel Kanäle für Audio: 2 für Stereo, 1 für Mono

Aufgabe 2.1

Modifiziere wave_io dahingehend, dass die Samples in der WAV-Datei in eine (lesbare) ASCII-Datei geschrieben werden. Lies die von mir geschickten Dateien (Sampling-Frequenz: 16 kHz) ein und bestimme aus den resultierenden Zahlenfolgen in der ASCII-Datei die Frequenz der Sinus-Schwingungen (Begründen und jeweils eine Periode für das Protokoll abspeichern).Überprüfe Deine Schätzung mit dem Spektralanalyse-Tool GRAM.

Code-Anpassungen

    FILE *prt;
    int i;

    prt = fopen("prt.txt","wt");

    for (i = 0; i < n_wave; i++) {
        fprintf(prt,"%i\n", wave[i]);
    }

    fclose(prt);
                    

Protokoll prt.txt

Abtastung sine_lo01.wav
4756
12665
16305
14449
7723
-1606
-10394
-15679
-15679
-10394
-1606
7723
14449
16305
12665
4756

-4756
-12665
-16305
-14449
-7723
1606
10394
15679
15679
10394
1606
-7723
-14449
-16305
-12665
-4756
                        
Abtastung sine_hi01.wav
12665
7723
-15679
-1606
16305
-4756
-14449
10394
10394
-14449
-4756
16305
-1606
-15679
7723
12665

-12665
-7723
15679
1606
-16305
4756
14449
-10394
-10394
14449
4756
-16305
1606
15679
-7723
-12665
                        

sine_lo01

Es finden 3 Nulldurchgänge statt. Das bedeutet in 16 Samplewerten befinden sich 1,5 Schwingungen. 16 Samplewerte haben eine Dauer von 16000Hz / 16 , also 1/1000 Sekunde. In 1/1000 Sekunde finden 1,5 Schwingungen statt, das bedeutet eine Schwingung dauert 1/1000 * 1,5 = 1/1500 Sekunde. Das entspricht 1500Hz oder aber 1,5 kHz.


sine_hi01

Es finden 9 Nulldurchgänge statt. Das bedeutet in 16 Samplewerten befinden sich 4,5 Schwingungen. 16 Samplewerte haben eine Dauer von 16000Hz / 16 , also 1/1000 Sekunde. In 1/1000 Sekunde finden 4,5 Schwingungen statt, das bedeutet eine Schwingung dauert 1/1000 * 4,5 = 1/4500 Sekunde. Das entspricht 4500Hz oder aber 4,5 kHz.


Aufgabe 2.2

Bei der zeitlichen Diskretisierung eines Analogsignals muß das sogenannte Abtasttheorem eingehalten werden. Wie lautet es und wie läßt sich der Grenzfall, für den es gerade noch gilt, illustrieren (Zeichnung !)?

Damit das Signal später wieder aus den Abtastwerten rekonstruiert werden kann, muß gewährleistet sein, daß die Abtastfrequenz fa mehr als doppelt so hoch gewählt wird wie die im abzutastenden Signal vorhandene höchste Frequenz: fa > 2 * fmax

Wird dieses sogenannte Abtasttheorem nicht eingehalten, so kommt es zu irreparablen Fehlern, sogenannten Faltungsverzerrungen.

Grenzfall Quelle: http://public.beuth-hochschule.de/~mixdorff/mmt1/files/schwingungslehre.pdf

Aufgabe 2.3

Bei herkömmlichen Soundkarten tritt systembedingt kein Aliasing auf, weil das Audiosignal stets geeignet vorbehandelt wird (wie ?). Mit einem kleinen Trick läßt sich Aliasing jedoch nachweisen. Diese auch als Down-Sampling bekannte Methode besteht darin, dass man bei einer WAV-Datei z.B. jeden zweiten Abtastwert wegwirft. Man erhält so eine Wellenform, die genau die Hälfte der ursprünglichen Abtastfrequenz aufweist. Wenn man das Signal nicht vorher bandbegrenzt hat, können Aliasing-Verzerrungen hörbar werden.

Bei herkömmlichen Soundkarten wird das Signal durch einen Tiefpassfilter bearbeitet, sodass alle Frequenzen > f(max)/2 abgetrennt werden.

Aufgabe 2.4

Modifiziere wave_io dahingehend, dass vom eingelesenen Signal jeder zweite Abtastwert verworfen wird und das resultierende Signal abgespeichert wird. Der Header muß natürlich entsprechend verändert werden! Wende das resultierende Programm zunächst auf 'sine_lo.wav' und 'sine_hi.wav' an. Welche Frequenzen erscheinen nach dem Down-Sampling (Spektrogramm und WAVs ins Protokoll !)? Was würde passieren, wenn man geeignet bandbegrenzen würde?

Code-Anpassungen

    for (i = 0; i < (n_wave/2); i++) {
        wave[i] = wave[i*2];
    }
    freq_in /= 2;
    n_wave /= 2;
                    

sine_lo01_down.wav

sine_hi01_down.wav

Wie man am Spektogramm erkennen kann, ändert sich für sine_lo01 nichts. Die Frequenz bleibt gleich bei 1,5 kHz. Das Abtasttheorem wird eingehalten, da die Ausgangsfrequenz schon niedrig genug ist.
Die Datei sine_hi01 verliert einen kleinen Frequenzbereich und ist nach dem Downsampling bei 3,5 kHz und nicht mehr bei den bisherigen 4,5 kHz. Es treten Faltungsverzerrungen auf.

Aufgabe 3.1

Die herkömmlichen PC-Soundkarten arbeiten meist entweder mit 16 oder 8 bit-Auflösung. Wie groß ist die Anzahl der bei diesen beiden Werten darstellbaren Amplitudenwerten?

8 bit entspricht 28 Amplitudenwerten = 256 Amplitudenwerte
16 bit entspricht 216 Amplitudenwerten = 65536 Amplitudenwerte

Aufgabe 3.2

Wir wollen nun wave_io so modifizieren, dass wir die Bitzahl reduzieren können. Dazu können wir z.B. alle Samples durch eine Potenz von 2 teilen (Integer-Division ohne Rest). Damit das resultierende Signal nicht leiser wird als das Original, kompensieren wir die Operation durch Multiplikation mit derselben Zweierpotenz. Zu beachten: Der Datentyp hat nach wie vor 16 bit!

Code-Anpassungen

  read_wave(&wave, &n_wave, &freq_in, &bits_in, in_name, &header);
  for(i=0; i < n_wave; i++) {
	wave[i] /= pow(2,1);
	wave[i] *= pow(2,1);
  }
  

Aufgabe 3.3

Mit dem entstandenen Programm verändern wir die in Aufgabe 1 erzeugten Wave-Dateien. Ab welcher Bitzahl tritt bei Musik/Sprache eine hörbare/deutliche Verschlechterung der Qualität ein? Bei wieviel Bit ist das Sprachsignal noch verständlich ?
Was charakterisiert das entstehende Quantisierungsgeräusch und macht es besonders störend?

Musik_Detail_reduced-256.wav

Bei der Musik tritt bei einer Reduktion um 8 Bit eine deutliche Verschlechterung der Qualität auf.

Sprache_Detail_reduced-64.wav

Bei der Sprache tritt bei einer Reduktion um 6 Bit eine deutliche Verschlechterung der Qualität auf.

Das Quantisierungsgeräusch äußert sich in einem permanenten Hintergrundrauschen.

Aufgabe 3.4

Code-Anpassungen

    const int bit=8;
    short *new_wave;

    new_wave = (short*)malloc(n_wave*sizeof(short));

    for(i=0; i < n_wave; i++){
        new_wave[i] = wave[i];
        wave[i] /= pow(2.0,bit);
        wave[i] *= pow(2.0,bit);
        wave[i] -= new_wave[i];
        wave[i] *= pow(2.0, 16-bit-1);
    }
                    

Musik_Detail_rauschen-1bit.wav

Musik: Reduktion um 1 Bit

Musik_Detail_rauschen-256.wav

Musik: Reduktion um 8 Bit

Sprache_Detail_rauschen-1bit.wav

Sprache: Reduktion um 1 Bit

Sprache_Detail_rauschen-256.wav

Sprache: Reduktion um 6 Bit

Bei einer Reduktion um 1 bit dominiert das Quantisierungsrauschen. Je höher die Bitreduktion, desto höher ist der Anteil des Originalsignals im Differenzsignal. Daraus lässt sich schließen dass immer mehr Informationen verloren gehen.