Sei sulla pagina 1di 14

DTMF Tone Detection using GOERTZEL Algorithm

keypad = ['1','2','3';'4','5','6';'7','8','9';'*','0','#']
rowfreq = [697;770;852;941];
colfreq = [1209,1336,1477];
allfreq = [rowfreq',colfreq];
fs = 8000;
rowfreqrad = 2*pi*rowfreq;
colfreqrad = 2*pi*colfreq;
%%Creating the tone frequencies
n = 0:1/fs:0.05;%%Tone Duration = 50ms
rowfreqsines = [];
colfreqsines = [];
for i=1:4
rowfreqsines(:,i) = sin(rowfreqrad(i)*n);
if i<4
colfreqsines(i,:) = sin(colfreqrad(i)*n);
end
end
%%Taking the number input
keypressed = input('Press a key...','s')
[row,col]=find(keypad==keypressed)
pressedfreq = [rowfreq(row),colfreq(col)]
%%Transmitted Frequency
transsig = [];
for i=1:length(n)
transsig(i) = rowfreqsines(i,row)+colfreqsines(col,i);%generation of DTMF tone
end
subplot(211)
plot(transsig,'b')
title('Transmitted Signal')
xlim([0 length(n)])
%%Goertzel Algorithm Implementation
vm1 = 0;
vm2 = 0;
N = length(n)/2; %%Truncated length of Transmitted Signal
v = zeros(1,N);
x = transsig(1:N);
kvalues = round(N*allfreq/fs);
estimatedfreq = round(kvalues*fs/N);
Xkmagsq = zeros(1,7);%%|X(k)|^2
for k=1:7
for i=1:N
if i<=2
if i==1
v(i) = x(i);
else
v(i) = x(i) + 2*cos(2*pi*kvalues(k)/N)*v(i-1);
end
else
v(i) = x(i) + 2*cos(2*pi*kvalues(k)/N)*v(i-1) - v(i-2);
end
end
Xkmagsq(k) = (v(i))^2 + (v(i-1))^2 - 2*cos(2*pi*kvalues(k)/N)*v(i)*v(i-1);
end
subplot(212)
stem(allfreq,Xkmagsq,'r')
set(gca(),xtick,allfreq)
set(gca(),xticklabel,{697,770,852,941,1209,1336,1477})
title('|X(k)|^2')
%%Detection and Decoding
normXkmagsq = Xkmagsq/max(Xkmagsq);
initthreshold = 0.5;
detectedfreq = [];
threshold = initthreshold;
while (length(detectedfreq)<2)
detectedfreq = allfreq(find(((normXkmagsq>threshold).*allfreq)~=0))
if length(detectedfreq)==2
continue
elseif length(detectedfreq)<2
threshold = threshold - 0.1;
end
end
detectedrowfreq = detectedfreq(1);
detectedcolfreq = detectedfreq(2);
detectedrowindex = find(rowfreq==detectedrowfreq);
detectedcolindex = find(colfreq==detectedcolfreq);
printf('Pressed Key is: %s\n',keypad(detectedrowindex,detectedcolindex))
>> DTMFGoertzel

keypad =

123

456

789

*0#

Press a key... 1
keypressed = 1
row = 1
col = 1
pressedfreq =
697 1209

detectedfreq
697 1209
Pressed Key is: 1
Press a key... 2
keypressed = 2
row = 1
col = 2
pressedfreq =
697 1336

detectedfreq =
697 1336
Pressed Key is: 2
Press a key... 3
keypressed = 3
row = 1
col = 3
pressedfreq =

697 147

detectedfreq = 1477
detectedfreq =
697 1477
Pressed Key is: 3
Press a key... 4
keypressed = 4
row = 2
col = 1

pressedfreq

770 1209
detectedfreq =
770 1209
Pressed Key is: 4
Press a key... 5
keypressed = 5
row = 2
col = 2
pressedfreq =
770 1336

detectedfreq =
770 1336
Pressed Key is: 5
Press a key... 6
keypressed = 6
row = 2
col = 3
pressedfreq =

770 1477

detectedfreq
770 1477
Pressed Key is: 6
Press a key... 7
keypressed = 7
row = 3
col = 1
pressedfreq =

852 1209

detectedfreq
852 1209
Pressed Key is: 7
Press a key... 8
keypressed = 8
row = 3
col = 2
pressedfreq =
852 1336

detectedfreq
852 1336
Pressed Key is: 8
Press a key... 9
keypressed = 9
row = 3
col = 3

pressedfreq
852 1477

detectedfreq =
852 1477
Pressed Key is: 9
Press a key... *
keypressed = *
row = 4
col = 1
pressedfreq =

941 1209

detectedfreq
941 1209
Pressed Key is: *
Press a key... 0
keypressed = 0
row = 4
col = 2
pressedfreq =
941 1336

detectedfreq
941 1336
Pressed Key is: 0
Press a key... #
keypressed = #
row = 4
col = 3
pressedfreq =

941 1477

detectedfreq
941 1477
Pressed Key is: #

Potrebbero piacerti anche