Kindly verify my code of DTMF decoding step

I want to decode DTMF tones by using FIR Filter. The filters that are required to be used in filter bank are cnstructed by Sinusoidal impulse response of the form h[n]= (2/L)cos(2*pi*fb*n/fs) where 0<n<L
L is filter length fb defines the freq location of passband e.g we can pick 697Hz
the book says to generate bandpass filter for 770 Hz component with L=50 and fs=12000. This has to be done by creating a vector of filter co-efficients ,h770 which are determined by evaluatiing above stated equation. plot the filter coefficients using stem().
I have done it in this way. Is it ok
h=[];
L=50;
fs=12000;
fb=770;
for n=1:L
h(n)=(2/L)*cos(2*pi*fb*n/fs);
end
stem(h)

 Akzeptierte Antwort

Wayne King
Wayne King am 9 Okt. 2011

0 Stimmen

Hi, Notice how Walter has indexed the for loop from 0, but was careful to index the vector h from 1.
h=[];
L=50;
fs=12000;
fb=770;
for n=0:L
h(n+1)=(2/L)*cos(2*pi*fb*n/fs);
end
stem(h)
So that it is legal MATLAB indexing, however, I would say to avoid the for loop entirely. This is cleaner MATLAB.
L=50;
fs=12000;
fb=770;
% if you really want 0<n<L
h = (2/L)*cos(2*pi*fb*(1:L-1)/fs);
stem(h);

1 Kommentar

Walter Roberson
Walter Roberson am 9 Okt. 2011
h = (2/L)*cos(2*pi*fb*(0:L-1)/fs);
for the 0 <= n < L case.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (10)

moonman
moonman am 9 Okt. 2011

0 Stimmen

I dont have test data. i just want somebody to read my statement and see my code i hope it is ok but just want to cross check from experts
Walter Roberson
Walter Roberson am 9 Okt. 2011

0 Stimmen

The description says 0 < n < L but you have n going from 1 to L which is one step too far (n == L)

3 Kommentare

Walter Roberson
Walter Roberson am 9 Okt. 2011
Notice the strict inequality: 0 < n < L . That means that n cannot be 0 and cannot be L, so there is no need to use "for n=0:L" (not unless the instructions are wrong.)
If the instructions had said 0 <= n <= L, then you would code as
for n=0:L
h(n+1)=(2/L)*cos(2*pi*fb*n/fs);
end
moonman
moonman am 9 Okt. 2011
The instructions say
0<=n < L (n is greater than or equal to 0)
How can i code this
???
Walter Roberson
Walter Roberson am 9 Okt. 2011
for n=0:L-1
h(n+1)=(2/L)*cos(2*pi*fb*n/fs);
end

Melden Sie sich an, um zu kommentieren.

moonman
moonman am 9 Okt. 2011

0 Stimmen

Yes, this issue i know but when i tell matlab to do
for n=0:L
It gives error
??? Attempted to access h(0); index must be a positive integer or logical.
How to remove this error
moonman
moonman am 9 Okt. 2011

0 Stimmen

ok thanks king
kindly confirm me is my code ok as per book question

1 Kommentar

Wayne King
Wayne King am 9 Okt. 2011
Yes, you can confirm by looking at the frequency response
fvtool(h,1,'Fs',fs);

Melden Sie sich an, um zu kommentieren.

moonman
moonman am 9 Okt. 2011

0 Stimmen

Thanks King, can u explain 'Fs' and fs in this command
The book also tells to plot magnitude response by this
h770=[];
L=50;
fs=12000;
fb=770;
for n=1:L
h770(n)=(2/L)*cos(2*pi*fb*n/fs);
end
fs=8000;
ww=0:(pi/256):pi;
ff=ww/(2*pi)*fs;
H=freqz(h770,1,ww);
plot(ff,abs(H));
grid on;
Although the shape is same for both plots but magnitude varies

1 Kommentar

Wayne King
Wayne King am 9 Okt. 2011
The big difference is that you have not plotted yours in dB
plot(ff,abs(H));
% if you plot
plot(ff,20*log10(abs(H)));
You'll see. I think it is much more common to plot these in dB.

Melden Sie sich an, um zu kommentieren.

Wayne King
Wayne King am 9 Okt. 2011

0 Stimmen

fvtool() is doing that under the hood and much more, I question why your book constructs a frequency axis in angular frequencies, when in this application Hertz makes much more sense:
[H,F] = freqz(h,1,[],fs);
plot(F./1000,20*log10(abs(H)));
grid on;
xlabel('kHz'); ylabel('Magnitude-squared (dB)');
Again, I would recommend you avoid a for loop to calculate your FIR filter coefficients and just use the vector approach I showed above.
moonman
moonman am 9 Okt. 2011

0 Stimmen

Yes u are absolutely right I question why your book constructs a frequency axis in angular frequencies, when in this application Hertz makes much more sense:
My last query , the question says to
indicate the location of each of the DTMF frequencies(697,770,852,941,1209,1336 and 1477 Hz) on the plot generated by
h770=[];
L=50;
fs=12000;
fb=770;
for n=1:L
h770(n)=(2/L)*cos(2*pi*fb*n/fs);
end
fs=8000;
ww=0:(pi/256):pi;
ff=ww/(2*pi)*fs;
H=freqz(h770,1,ww);
plot(ff,abs(H));
grid on;
How can i do that, kindly make me clear
Wayne King
Wayne King am 9 Okt. 2011

0 Stimmen

[H,F] = freqz(h,1,[],fs);
plot(F,20*log10(abs(H)));
grid on;
xlabel('Hz'); ylabel('Magnitude-squared (dB)');
set(gca,'xtick',[697,770,852,941,1209,1336,1477]);
set(gca,'xlim',[500 2000]);
Note that you really need to limit your x-axis in order to make the labels reasonable. If you use the whole frequency axis from 0 to the Nyquist, they bunch up.
moonman
moonman am 9 Okt. 2011

0 Stimmen

Wonderful Help Wayne King Thanks a lot for making me understand this issue
moonman
moonman am 17 Okt. 2011

0 Stimmen

Wayne King u wrote this code for me
[H,F] = freqz(h,1,[],fs);
plot(F,20*log10(abs(H)));
grid on;
xlabel('Hz'); ylabel('Magnitude-squared (dB)');
set(gca,'xtick',[697,770,852,941,1209,1336,1477]);
set(gca,'xlim',[500 2000]);
Can u kindly explain me why u wrote Magnitude-Squared (db) in y axis, why squared

5 Kommentare

moonman
moonman am 17 Okt. 2011
sir kindly explain why u used Magnitude Squared in y-axis
Wayne King
Wayne King am 17 Okt. 2011
It is often desirable to obtain power estimates, which is the magnitude squared.
moonman
moonman am 17 Okt. 2011
Can u kindly refer some webpage which further explain this concept.
Thanks a lot
praveen
praveen am 17 Sep. 2013
Bearbeitet: praveen am 17 Sep. 2013
kindly send total program in a single page of dtmf decoder using fir filters try to send quickleyyyyyy please
Jan
Jan am 17 Sep. 2013
@praveen: This request is such unfriendly, that it is funny, that you hope to be successful. It is definitely your turn to pick from these many pieces of code a program, that is working for you. Trying to push us to do your work quickly is really the wrong approach.

Melden Sie sich an, um zu kommentieren.

Kategorien

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by