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)


14 Temmuz 2011 Perşembe

Matlabda "awgn" komutunun kullanımı

Matlabda workspace yüklediğimiz bir ses dosyasına white gauss noise eklemek için kullanılır.

awgn(x,snr)

Şeklinde kullanılır. x üzerine gürültü eklemek istediğimiz ses dosyasının matlabda matris karşılığıdır. snr değeri db cinsindedir ve 10log(Pses/Pnoise)=snr şeklinde hesaplanır. snr nin 0 olduğu durumlarda ses dosyasının enerjisi ile gürültinin enerjisi birbirine eşittir. Bu yüzden gürültü ile müziği eşit duyarız ama gürültü orjinal sesi çok fazla bozduğu için orjinal ses dosyasının varlığını anlayamayız.

kısaca awgn matlabda ses dosyasına white gauss noise eklemek için kullanılır.

Curve Fitting

Tablodaki verilere doğrusal ve ikinci dereceden grafik uydurma (curve?fitting)
yapınız. Hangisinin daha iyi olduğunu belirtiniz.

x=[1 2.5 3.5 4 1.1 1.8 2.2 3.7]
y=[6.008 15.722 27.130 33.772 5.257 9.549 11.098 28.828]

Cevap

a) Script


x=[1 2.5 3.5 4 1.1 1.8 2.2 3.7];
y=[6.008 15.722 27.130 33.772 5.257 9.549 11.098 28.828];

xort=mean(x);
yort=mean(y);
c=0;
d=0;
for i=1:length(x)
    c=c+y(i)*(x(i)-xort);
    d=d+x(i)*(x(i)-xort);
end
b=c/d;
a=yort-xort*b;
fprintf('a değeri %8.2f \n',a);
fprintf('b değeri %8.2f',b);

Output

a değeri    -6.19 
b değeri     9.44

b) Script

A=[1 2.5 3.5 4 1.1 1.8 2.2 3.7];
B=[6.008 15.722 27.130 33.772 5.257 9.549 11.098 28.828];
n=length(A);

a11=n; a12=sum(A); a13=sum(A.*A);
a21=sum(A); a22=sum(A.*A); a23=sum(A.*A.*A);
a31=sum(A.*A); a32=sum(A.*A.*A); a33=sum(A.*A.*A.*A);

z=[a11 a12 a13;a21 a22 a23;a31 a32 a33];
b1=sum(B);
b2=sum(A.*B);
b3=sum(A.*A.*B);
w=[b1;b2;b3];

abc=z\w;
a=abc(1)
b=abc(2)
c=abc(3)

Output

a =    4.4057

b =   -1.0689

c =    2.1081







Matlabda kübik interpolasyon yardımı ile soru çözümü

Soru 1: A6ağıdaki tablo hava yoğunluğunun yükseklikle deği6im bilgisini içermektedir.
Tabloda verilen verilere, doğal sınır ko6ulları kabul ederek “kübik interpolasyon”
uygulayınız. h= 5 km ve 8 km yükseklikteki hava yoğunluğunu hesaplayınız.

h=[0 1.525 3.050 4.575 6.100 7.625 9.150]
p=[1 0.8617 0.7385 0.6292 0.5328 0.4481 0.3741]


Cevap;

Kübik function;

function y=kubik(c,h,p,i,a)
syms x;
y=((x-h(i+1))^3/(h(i)-h(i+1))-((x-h(i+1))*(h(i)-h(i+1))))*c(i)/6;
y=y-((x-h(i))^3/(h(i)-h(i+1))-((x-h(i))*(h(i)-h(i+1))))*c(i+1)/6;
y=y+(p(i)*(x-h(i+1))-p(i+1)*(x-h(i)))/(h(i)-h(i+1));

subs(y,x,a)


Uygulama Scripti;

h=[0 1.525 3.050 4.575 6.100 7.625 9.150];
p=[1 0.8617 0.7385 0.6292 0.5328 0.4481 0.3741];
h1=h(2)-h(1);

k(1)=0;k(7)=0;

for i=2:6
    l(i-1)=6/(h1*h1)*(p(i-1)-2*p(i)+p(i+1));
end

b=[4 1 0 0 0;1 4 1 0 0;0 1 4 1 0;0 0 1 4 1;0 0 0 1 4];

c=l/b;
d=c;

for i=1:5
    c(i+1)=d(i);
end

c(1)=k(1);
c(7)=k(7);

e=kubik(c,h,p,4,5);