Kindly verify my code of DTMF decoding step
조회 수: 4 (최근 30일)
이전 댓글 표시
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)
채택된 답변
Wayne King
2011년 10월 9일
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
추가 답변 (10개)
Walter Roberson
2011년 10월 9일
The description says 0 < n < L but you have n going from 1 to L which is one step too far (n == L)
댓글 수: 3
moonman
2011년 10월 9일
댓글 수: 1
Wayne King
2011년 10월 9일
Yes, you can confirm by looking at the frequency response
fvtool(h,1,'Fs',fs);
moonman
2011년 10월 9일
댓글 수: 1
Wayne King
2011년 10월 9일
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.
Wayne King
2011년 10월 9일
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.
댓글 수: 0
Wayne King
2011년 10월 9일
[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.
댓글 수: 0
moonman
2011년 10월 17일
댓글 수: 5
Jan
2013년 9월 17일
@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.
참고 항목
카테고리
Help Center 및 File Exchange에서 Applications에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!