7 Ağustos 2011 Pazar

Matlabda sesten telefon numarası bulmak (Encoder for DTMF in matlab)

Bu matlab kodu belirli sürelere ayrılmış DTMF sinyallerinin hangi numaraya yada harfe karşılık geldiğini buluyor.
This code of matlab can find the respone of DTMF signals.

Example:

Sound files: http://www.fileserve.com/file/EWvr97D
İt includes 11-digit phone number

Main code (.m file)

Odev3.m
close all
clear all
clc

[n1,Fs]=WAVREAD('num1.wav'); %ses dosyalarını okutuyor
[n2]=WAVREAD('num2.wav');
[n3]=WAVREAD('num3.wav');
[n4]=WAVREAD('num4.wav');
[n5]=WAVREAD('num5.wav');
[n6]=WAVREAD('num6.wav');
[n7]=WAVREAD('num7.wav');
[n8]=WAVREAD('num8.wav');
[n9]=WAVREAD('num9.wav');
[n10]=WAVREAD('num10.wav');
[n11]=WAVREAD('num11.wav');

n1=fft(n1,16000); %ses dosyalarının fourier dönüşümünü alıyor
n2=fft(n2,16000);
n3=fft(n3,16000);
n4=fft(n4,16000);
n5=fft(n5,16000);
n6=fft(n6,16000);
n7=fft(n7,16000);
n8=fft(n8,16000);
n9=fft(n9,16000);
n10=fft(n10,16000);
n11=fft(n11,16000);


bul(n1) %num.m funtionununa n1 değerini atıyor
bul(n2)
bul(n3)
bul(n4)
bul(n5)
bul(n6)
bul(n7)
bul(n8)
bul(n9)
bul(n10)
bul(n11)

bul.m
function y=bul(x)
if 500<abs(x(697))
    if 500<abs(x(1209))
        disp('1')
    elseif 500<abs(x(1336))
        disp('2')
    elseif 500<abs(x(1477))
        disp('3')
    end
end
   
if 500<abs(x(770))
    if 500<abs(x(1209))
        disp('4')
    elseif 500<abs(x(1336))
        disp('5')
    elseif 500<abs(x(1477))
        disp('6')
    end
end

 if 500<abs(x(852))
    if 500<abs(x(1209))
        disp('7')
    elseif 500<abs(x(1336))
        disp('8')
    elseif 500<abs(x(1477))
        disp('9')
    end
 end
   
if 500<abs(x(941))
    if 500<abs(x(1209))
        disp('*')
    elseif 500<abs(x(1336))
        disp('0')
    elseif 500<abs(x(1477))
        disp('#')
    end
end

Command window 

0 5_3_5 6_9_5 4_7 7_1

Ses sinyallerini ilk 16000 değerinin fourier dönüşümünü yapar. Ardından başka bir function içinde MDFT değerlerini kontrol eder. Fourier dönüşümünden sonra gerekli high ve low frekanslarda 1000 büyüklüğünde dürtüler var. İf komutu kullanarak high ve low frekansların 500 den büyük olup olmadığını kontrol eder. Ardından telefon numarasına ulaştım.


Grafikler için;
For graph;

figure
SUBPLOT(3,1,1),plot(t*16000,n1)
SUBPLOT(3,1,2),plot(t*16000,n2)
SUBPLOT(3,1,3),plot(t*16000,n3)
figure
SUBPLOT(3,1,1),plot(t*16000,n4)
SUBPLOT(3,1,2),plot(t*16000,n5)
SUBPLOT(3,1,3),plot(t*16000,n6)
figure
SUBPLOT(3,1,1),plot(t*16000,n7)
SUBPLOT(3,1,2),plot(t*16000,n8)
SUBPLOT(3,1,3),plot(t*16000,n9)
figure
SUBPLOT(2,1,1),plot(t*16000,n10)
SUBPLOT(2,1,2),plot(t*16000,n11)