%Audio%<'FontWeight',MSVTITLWEIGHT,'FontSize',MSVTITLSIZE,'Color',MSVTITLCOLOR>
%
%
%
% Zur Audioausgabe von abgetasteten Signalen, die als MATLAB-Vektoren vorliegen, 
% dient die Funktion sound. soundsc ist eine Version, die das Signal so skaliert, 
% dass gerade keine Übersteuerung auftritt:
%
help sound
help soundsc
%
% Soundkarten reagieren unterschiedlich auf die überlappende Ausgabe mit sound. 
% In den folgenden Beispielen wird die Überlappung durch Einfügung von Pausen 
% (Anhalten der MATLAB-Interpretation für n Sekunden) verhindert.
%
%% Der folgende Block muss zuerst ausgeführt werden.
%% Danach ist die Reihenfolge beliebig:
%
fs = 8000;                  % Abtstrate und Frequenzen in Hertz
c2 = 523; d=587; e=659; f=689; g=784; a=880; h=988; c3=1047;
is = 2^(1/12);              % Intervall Halbtonschritt  %<'Interpreter','none'>
n  = 16384;                 % Länge der Sequenzen (EDU-Limitierung!)
zp = 2*pi;                  % zwei pi
t  = (1:n)/fs;              % Zeitbereich
%
% Reine Sinus-Töne:
%
y1=0.3*sin(zp*c2*t); sound(y1,fs); pause(3);
y2=0.2*sin(zp*e*t);  sound(y2,fs); pause(3);
y3=0.3*sin(zp*g*t);  sound(y3,fs); pause(3);
%
% Alle zusammen als Akkord:
%
y=y1+y2+y3+0.1*sin(zp*c3*t);  soundsc(y,fs); pause(3);
%
% Bereits seit der Antike ist bekannt, dass Akkorde besonders angenehm klingen,
% wenn die einzelnen beteiligten Töne in bestimmten ganzzahligen Frequenz-
% verhältnissen zueinander stehen.
%
% Die musikalisch wichtigsten Frequenzverhältnisse sind:
% 5/4 = 1.250    Terz
% 4/3 = 1.333    Quart
% 3/2 = 1.5      Quinte
% 2/1 = 2.0      Oktave
%
% Aus diesen Grundintervallen lassen sich dann weitere Verhältnisse ableiten.
% Zum Beispiel ergibt sich für den Zusammenklang der Terz und Quint ein
% Verhältnis 4/3 : 5/4 = 16 / 15 = 1.0666 für die (unangenehm klingende)
% kleine Sekunde.
%
% Die folgenden Beispiele demonstrieren den Klang dieser reinen Intervalle:
f0 = 880;
y3 = 0.3*sin(zp*f0*t) + 0.3*sin(zp*5/4*f0*t ); % Terz
y4 = 0.3*sin(zp*f0*t) + 0.3*sin(zp*4/3*f0*t ); % Quart
y5 = 0.3*sin(zp*f0*t) + 0.3*sin(zp*3/2*f0*t ); % Quinte

sound(y3,fs); pause(3);
sound(y4,fs); pause(3);
sound(y5,fs); pause(3);
%
% Die reine Stimmung eines Musikinstruments ist in vielen Fällen unpraktisch,
% da die exakten Frequenzverhältnisse immer nur in Beziehung zu einem vorher
% festgelegten Grundton (hier a2=880) und damit für eine einzige Tonart
% gelten. Bei Wechsel der Tonart muss das Instrument komplett neu gestimmt
% werden.
%
% Deshalb hat sich seit ca. 1700 die 'wohltemperierte' Stimmung durchgesetzt
% (jedenfalls in der europäischen Musik), bei der alle Halbtonschritte die
% gleiche Größe aufweisen und nur das Frequenzverhältnis der Oktave mit 2:1
% exakt eingehalten wird. Da die Oktave in 12 Halbtonschritte unterteilt wird,
% ergibt sich für einen Halbtonschritt das Verhältnis (2^(1/12)):1 oder
% näherungsweise 1.0595 : 1. Die Frequenzverhältnisse für die Terz, Quart
% und Quinte werden jetzt nicht mehr exakt eingehalten (Ausgabe in der Console):
%
halbton  = 2^(1/12)
f_terz   = halbton ^ 4
f_quart  = halbton ^ 5
f_quint  = halbton ^ 7
relativer_fehler_terz  = (f_terz  - (5/4)) / (5/4)
relativer_fehler_quart = (f_quart - (4/3)) / (4/3)
relativer_fehler_quint = (f_quint - (3/2)) / (3/2)
%
% Das klingt dann so:
%
f0 = 880;
w3 = 0.3*sin(zp*f0*t) + 0.3*sin(zp*w_terz*f0*t );  % wohltemperierte Terz
w4 = 0.3*sin(zp*f0*t) + 0.3*sin(zp*w_quart*f0*t ); % wohltemperierte Quart
w5 = 0.3*sin(zp*f0*t) + 0.3*sin(zp*w_quint*f0*t ); % wohltemperierte Quinte
sound(w3,fs); pause(3);
sound(w4,fs); pause(3);
sound(w5,fs); pause(3);
%
% Und hier noch einmal der direkte Vergleich. Durch langjährige Gewöhnung
% fällt der Unterschied meistens nur musikalisch geschulten Personen auf:
%
sound(y3,fs); pause(3); % reine Terz
sound(w3,fs); pause(3); % wohltemperierte Terz
sound(y4,fs); pause(3); % reine Quart
sound(w4,fs); pause(3); % wohltemperierte Quart
sound(y5,fs); pause(3); % reine Quinte
sound(w5,fs); pause(3); % wohltemperierte Quinte
%
%
% Die 
% Eine interessante Demonstration liefert die Funktion 'overflowdemo' aus
% der DSP-Vorlesung. Als Beispiel zunächst mit 16-bit Quantisierung 
% (wie CD-Audio):
%
overflowdemo( 16 ); % 16-bit Quantisierung (z.B. CD-Audio).

% Bei 8-bit Quantisierung wird das Quantisierungsrauschen schon deutlich hörbar:
%
overflowdemo( 8 );  %  8-bit Quantisierung (z.B. ISDN-Telephon).

% Bei 4-bit Quantisierung ergeben sich die typischen Klänge
%
overflowdemo( 4 );  %  4-bit Quantisierung

%
% Interessanterweise kann der Klang bei sehr grober Quantisierung durch Dithering,
% das heisst durch Hinzufügen von schwachem Rauschen, stark verbessert werden.
%
a16bit = 32767 * sin(zp*440*t);
b12bit =    16 * round( a16bit /   16 );
b08bit =   256 * round( a16bit /  256 );
b06bit =  1024 * round( a16bit / 1024 );
b04bit =  4096 * round( a16bit / 4096 );
b03bit =  8192 * round( a16bit / 8192 );
b02bit = 16384 * round( a16bit / 16384);

tp = 3; % use 0 on Linux
sound( a16bit, fs ); pause( tp );
sound( b12bit, fs ); pause( tp );
sound( b08bit, fs ); pause( tp );
sound( b04bit, fs ); pause( tp );
sound( b02bit, fs ); pause( tp );
%
% Und jetzt mit Dither. Die fix()-Funktion liefert den ganzzahligen
% Anteil einer Gleitkommazahl (Abschneiden der Nachkommastellen):
%
dither = rand( size(a16bit)) - 0.5;     % Wertebereich -0.5 .. 0.5

b00bit = 32768 * fix( a16bit / 32768 );  % exakt null
c00bit = 32768 * fix( a16bit / 32768 + dither ); 
b02bit = 16384 * fix( a16bit / 16384);
c02bit = 16384 * fix( a16bit / 16384 + dither ); 

tp = 3; % use 0 on Linux
sound( b00bit, fs ); pause( tp );
sound( c00bit, fs ); pause( tp );
sound( b02bit, fs ); pause( tp );
sound( c02bit, fs ); pause( tp );
%
% Hier ein Plot der Funktionen:
f4 = figure;
subplot(2,2,1);
stem( b00bit(1:200) );
title( 'b00bit' );
subplot(2,2,2);
stem( c00bit(1:200) );
title( 'c00bit (0bit + dither)' );
subplot(2,2,3);
stem( b02bit(1:200) );
title( 'b02bit (2bit)' );
subplot(2,2,4);
stem( c02bit(1:200), '-s' );
title( 'c02bit (2bit + dither' );
%
% Das Prinzip erlaubt es auch, Signale sehr geringer Amplitude
% wiederzugeben, die sonst konstant Null wären:
%
a025bit = 0.25 * sin( zp*440*t );      % 0.25 bit Amplitude
z025bit = 32760 * fix( a025bit );      % konstant null
d025bit = 32760 * fix( a025bit + 2*dither ); % 0.25 bit Signal, 2bit Dither
d050bit = 32760 * fix( 2*a025bit + 2*dither ); % 0.50 bit Signal, 2bit Dither

sound( z025bit, fs ); pause( tp );
sound( d025bit, fs ); pause( tp );
sound( d050bit, fs ); pause( tp );

%









