Kindly verify my code of DTMF decoding step
    2 次查看(过去 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
				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!




