annotate main/signal/grpdelay.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 05e7e4427c6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 ## Copyright (C) 2000 Paul Kienzle
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 ## This program is free software; you can redistribute it and/or modify it
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 ## under the terms of the GNU General Public License as published by
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 ## the Free Software Foundation; either version 2, or (at your option)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 ## any later version.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 ## This program is distributed in the hope that it will be useful, but
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 ## WITHOUT ANY WARRANTY; without even the implied warranty of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 ## General Public License for more details.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 ## You should have received a copy of the GNU General Public License
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 ## along with this program; see the file COPYING. If not, write to the Free
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 ## Software Foundation, 59 Temple Place - Suite 330, Boston, MA
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 ## 02111-1307, USA.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 ## Based on freqz.m, Copyright (C) 1996, 1997 John W. Eaton
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 ## Compute the group delay of a filter.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 ## [g, w] = grpdelay(b)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 ## returns the group delay g of the FIR filter with coefficients b.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 ## The response is evaluated at 512 angular frequencies between 0 and
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 ## pi. w is a vector containing the 512 frequencies.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 ## [g, w] = grpdelay(b,a)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 ## returns the group delay of the rational IIR filter whose numerator
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 ## has coefficients b and denominator coefficients a.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 ## [g, w] = grpdelay(b,a,n)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 ## returns the group delay evaluated at n angular frequencies. For fastest
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 ## computation n should factor into a small number of small primes.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 ## [g, w] = grpdelay(b,a,n,"whole")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 ## evaluates the group delay at n frequencies between 0 and 2*pi.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 ## [g, w] = grpdelay(b,a,n,Fs)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 ## evaluates the group delay at n frequencies between 0 and Fs/2.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 ## [g, w] = grpdelay(b,a,n,"whole",Fs)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 ## evaluates the group delay at n frequencies between 0 and Fs.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 ## grpdelay(...)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 ## plots the group delay vs. frequency.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 ## This computation is unstable since it involves cancellation of very
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 ## small values. If the denominator becomes too small, the group delay
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 ## is artificially set to 0. The computation is also unstable since the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 ## group delay can go to infinity for some filters. These points are
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 ## set to zero as well so that the graph looks reasonable.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 ## Theory: group delay, g(w) = -d/dw [arg{H(e^jw)}], is the rate of change of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 ## phase with respect to frequency. It can be computed as:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 ## d/dw H(e^-jw)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 ## g(w) = -------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 ## H(e^-jw)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 ## where
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 ## H(z) = B(z)/A(z) = sum(b_k z^k)/sum(a_k z^k).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 ## By the quotient rule,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 ## A(z) d/dw B(z) - B(z) d/dw A(z)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 ## d/dw H(z) = -------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 ## A(z) A(z)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 ## Substituting into the expression above yields:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 ## A dB - B dA
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 ## g(w) = ----------- = dB/B - dA/A
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 ## A B
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 ## Note that,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 ## d/dw B(e^-jw) = sum(k b_k e^-jwk)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 ## d/dw A(e^-jw) = sum(k a_k e^-jwk)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 ## which is just the FFT of the coefficients multiplied by a ramp.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 ## TODO: demo("grpdelay",4) seems wrong. The delays in the detail plot
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 ## TODO: are opposite those in the overall plot.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 ## TODO: combine with freqz since the two are almost identical
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 ## TODO: don't reset graph state before exiting since the user may
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 ## TODO: want to further decorate the graph.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 function [g_r, w_r] = grpdelay(b, a, n, region, Fs)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 if (nargin<1 || nargin>5)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 usage("[g, w]=grpdelay(b [, a [, n [, 'whole' [, Fs]]]])");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 elseif (nargin == 1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 ## Response of an FIR filter.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 a=[]; n=[]; region=[]; Fs=[];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 elseif (nargin == 2)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 ## Response of an IIR filter
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 n=[]; region=[]; Fs=[];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 elseif (nargin == 3)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 region=[]; Fs=[];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 elseif (nargin == 4)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 Fs=[];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 if !isstr(region) && !isempty(region)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 Fs = region; region=[];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 if isempty(a) a=1; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 if isempty(n) n=512; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 if isempty(region)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 if isreal(b) && isreal(a)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 region = "half";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 region = "whole";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 if isempty(Fs)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 if (nargout==0) Fs = 2; else Fs = 2*pi; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 if !is_scalar(n)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 if nargin==4 ## Fs was specified
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116 w = 2*pi*n/Fs;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 w = n;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 n = length(n);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 extent = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 elseif (strcmp(region,"whole"))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 w = 2*pi*[0:(n-1)]/n;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 extent = n;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 w = pi*[0:(n-1)]/n;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 extent = 2*n;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130 la = length(a);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 a = reshape(a,1,la);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 lb = length(b);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 b = reshape(b,1,lb);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 k = max([la, lb]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 if (length(b) == 1 && length(a)>1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 hb = 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138 if length(a) == 1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 dhb = zeros(1,n);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 dhb = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 elseif( extent >= k)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144 hb = fft(postpad(b,extent));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145 dhb = fft(postpad(b,extent).*[0:extent-1]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147 hb = polyval(postpad(b,k),exp(j*w));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 dhb = polyval(postpad(b,k).*[0:k-1],exp(j*w));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150 if (length(a) == 1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151 ha = a;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152 dha = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153 elseif( extent >= k)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154 ha = fft(postpad(a,extent));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
155 dha = fft(postpad(a,extent).*[0:extent-1]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
156 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
157 ha = polyval(postpad(a,k),exp(j*w));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
158 dha = polyval(postpad(a,k).*[0:k-1],exp(j*w));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
159 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
160
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
161 g = dhb./hb - dha./ha;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
162 idx = find(abs(hb.*ha)<100*eps);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
163 g(idx)=zeros(size(idx));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
164 w = Fs*w/(2*pi);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
165
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
166 if nargout >= 1 # return values but don't plot
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
167 g_r = g(1:n);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
168 w_r = w(1:n);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
169 else # plot but don't return values
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
170 unwind_protect
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
171 grid;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
172 xlabel(["Frequency (Fs=", num2str(Fs), ")"]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
173 ylabel("Group delay (samples)");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
174 plot(w(1:n), real(g(1:n)), ";;");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
175 unwind_protect_cleanup
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
176 grid("off");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
177 xlabel("");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
178 ylabel("");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
179 end_unwind_protect
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
180 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
181
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
182 endfunction
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
183
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
184
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
185 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
186 %! subplot(211);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
187 %! title ("zero at .9");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
188 %! grpdelay (poly (0.9 * exp(1i*pi)));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
189 %! hold on; grid("on");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
190 %! stem (1, -9, "bo;target;");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
191 %! hold off;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
192 %!
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
193 %! subplot(212); axis ([.9, 1.1, -9, 0]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
194 %! grpdelay (poly(0.9*exp(1i*pi)),[],[.9:.0001:1.1]*pi);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
195 %! hold on; grid("on");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
196 %! stem(1,-9,"bo;target;");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
197 %! hold off;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
198 %! axis(); oneplot();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
199 %! %--------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
200 %! % From Oppenheim and Schafer, a single zero of radius r=0.9 at
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
201 %! % angle pi should have a group delay of about -9 at 1 and 1/2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
202 %! % at zero and 2*pi.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
203
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
204 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
205 %! grpdelay(poly([1/0.9*exp(1i*pi*0.2), 0.9*exp(1i*pi*0.6)]), ...
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
206 %! poly([0.9*exp(-1i*pi*0.6), 1/0.9*exp(-1i*pi*0.2)])); grid('on');
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
207 %! hold on; stem([0.2, 0.6, 1.4, 1.8], [9, -9, 9, -9],"bo;target;"); hold off;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
208 %! %--------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
209 %! % confirm the group delays approximately meet the targets
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
210 %! % don't worry that it is not exact, as I have not entered
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
211 %! % the exact targets.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
212
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
213 %!test
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
214 %! Fs = 8000;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
215 %! [b, a] = cheby1(3, 3, 2*[1000, 3000]/Fs, 'stop');
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
216 %! [h, w] = grpdelay(b, a, 256, "half", Fs);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
217 %! [h2, w2] = grpdelay(b, a, 512, "whole", Fs);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
218 %! assert (size(h), size(w));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
219 %! assert (length(h), 256);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
220 %! assert (size(h2), size(w2));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
221 %! assert (length(h2), 512);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
222 %! assert (h, h2(1:256));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
223 %! assert (w, w2(1:256));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
224
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
225 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
226 %! Fs = 8000;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
227 %! [b, a] = cheby1(3, 3, 2*[1000, 3000]/Fs, 'stop');
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
228 %! grpdelay(b,a,[],Fs);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
229 %! %--------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
230 %! % IIR bandstop filter has delays at [1000, 3000]
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
231
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
232 %!demo
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
233 %! subplot(211);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
234 %! b = fir1(40,0.3);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
235 %! grpdelay(b);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
236 %! subplot(212); axis([0.3, 0.5]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
237 %! grpdelay(b,[],pi*[.3:.0001:.5]); axis(); oneplot();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
238 %! %--------------------------------------------------------------
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
239 %! % fir lowpass order 40 with cutoff at w=0.3 and details of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
240 %! % the transition band [.3, .5]