Mercurial > hg > octave-terminal
changeset 566:8529a21443fa
[project @ 1994-07-26 02:07:38 by jwe]
Initial revision
author | jwe |
---|---|
date | Tue, 26 Jul 1994 02:07:38 +0000 |
parents | b04c0d02f2de |
children | 01e026888dfb |
files | scripts/signal/freqz.m |
diffstat | 1 files changed, 65 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/signal/freqz.m @@ -0,0 +1,65 @@ +function [h, w] = freqz(b,...) +#Compute the frequency response of a filter. +# +#[h,w] = resp(b) +# returns the complex frequency response h of the FIR filter with +# coefficients b. The response is evaluated at 512 angular frequencies +# between 0 and pi. w is a vector containing the 512 frequencies. +# +#[h,w] = resp(b,a) +# returns the complex frequency response of the rational IIR filter +# whose numerator has coefficients b and denominator coefficients a. +# +#[h,w] = resp(b,a,n) +# returns the response evaluated at n angular frequencies. For fastest +# computation n should factor into a small number of small primes. +# +#[h,w] = freqz(b,a,n,"whole") +# evaluates the response at n frequencies between 0 and 2*pi. + + if (nargin == 1) + # Response of an FIR filter. + a = 1; + n = 512; + region = "half"; + elseif (nargin == 2) + # Response of an IIR filter + a = va_arg(); + n = 512; + region = "half"; + elseif (nargin == 3) + a = va_arg(); + n = va_arg(); + region = "half"; + elseif (nargin == 4) + a = va_arg(); + n = va_arg(); + region = va_arg(); + endif + + la = length(a); + a = reshape(a,1,la); + lb = length(b); + b = reshape(b,1,lb); + + k = max([la lb]); + + if( n >= k) + if (strcmp(region,"whole")) + h = fft(postpad(b,n)) ./ fft(postpad(a,n)); + w = 2*pi*[0:(n-1)]/n; + else + h = fft(postpad(b,2*n)) ./ fft(postpad(a,2*n)); + h = h(1:n); + w = pi*[0:(n-1)]/n; + endif + else + if (strcmp(region,"whole")) + w = 2*pi*[0:(n-1)]/n; + else + w = pi*[0:(n-1)]/n; + endif + h = polyval(postpad(b,k),exp(j*w)) ./ polyval(postpad(a,k),exp(j*w)); + endif + +endfunction