function A23;

% Ton einladen und in f speichern
load 'telefon.raw';
f = telefon;

% Signal zeichnen
plot(f);
sound(f,11025);
title('Signal (beliebige Taste drücken)');
pause;

% Ziffern extrahieren und spaltenweise in f speichern
dt = 1/11025;
tones = 7;
f = f(1:floor(length(f)/tones)*tones);
f = reshape(f,length(f)/tones,tones);
f = f(floor(size(f,1)/4:size(f,1)*3/4),:);
N = size(f,1);

% Die Frequenzen, die zu den Einträgen im Spektrum-Vektor
% passen, ausrechnen und einen Teilbereich ausschneiden
% (für die Optik, damit man diesen Bereich besser erkennen kann)
range   = floor(N/2+50:N/2+120);
omega   = linspace(-1/(2*dt),1/(2*dt),N);
omega   = omega(range);

% Die DTMF-Frequenzen
Frequencies = [697 770 852 941 ; 1209 1336 1477 1633];
Numbers = zeros(1,tones);

for n=1:tones
   % Signal der n-ten Ziffer plotten
   subplot(2,1,1);
   plot(f(:,n));
   title(sprintf('Signal der %i. Ziffer',n));
   
   % Signal FFTen und interessanten Bereich ausschneiden
   subplot(2,1,2);
   F = abs(fftshift(fft(fftshift(f(:,n)))));
   F = F(range);
   
   % Spitzen (Peaks) im Spektrum bestimmen
   peak = find(F(2:end-1)>50 & (F(1:end-2)-2*F(2:end-1)+F(3:end)<0));
   peak = peak([1 end]);
   
   % Nachsehen, zu welchen DTMF-Frequenzen die Peaks am ehesten gehören
   [dummy,row] = min(abs(omega(peak(1))-Frequencies(1,:)));
   [dummy,col] = min(abs(omega(peak(2))-Frequencies(2,:)));
   
   % Zahl bestimmen
   if (row<4) & (col<4) Numbers(n) = row*3+col-3; end;
   fprintf('%i. Ziffer gefunden: %i\n',n,Numbers(n));
   
   % Spektrum plotten
   plot(omega,F);
   title('Spektrum');
   xlabel('Frequenz in Hz');
   pause;
end;

Numbers

