X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=octave_packages%2Fsignal-1.1.3%2Fbuttord.m;fp=octave_packages%2Fsignal-1.1.3%2Fbuttord.m;h=54af87c7061b5334c84bc82d77771dfe3d88c09f;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hp=0000000000000000000000000000000000000000;hpb=1705066eceaaea976f010f669ce8e972f3734b05;p=CreaPhase.git diff --git a/octave_packages/signal-1.1.3/buttord.m b/octave_packages/signal-1.1.3/buttord.m new file mode 100644 index 0000000..54af87c --- /dev/null +++ b/octave_packages/signal-1.1.3/buttord.m @@ -0,0 +1,82 @@ +## Copyright (C) 1999 Paul Kienzle +## +## This program is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free Software +## Foundation; either version 3 of the License, or (at your option) any later +## version. +## +## This program is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +## details. +## +## You should have received a copy of the GNU General Public License along with +## this program; if not, see . + +## Compute butterworth filter order and cutoff for the desired response +## characteristics. Rp is the allowable decibels of ripple in the pass +## band. Rs is the minimum attenuation in the stop band. +## +## [n, Wc] = buttord(Wp, Ws, Rp, Rs) +## Low pass (WpWs) filter design. Wp is the +## pass band edge and Ws is the stop band edge. Frequencies are +## normalized to [0,1], corresponding to the range [0,Fs/2]. +## +## [n, Wc] = buttord([Wp1, Wp2], [Ws1, Ws2], Rp, Rs) +## Band pass (Ws1Ws) || all(Ws>Wp) || diff(Wp)<=0 || diff(Ws)<=0) + error("buttord: Wp(1) Ws); + Wp(stop) = 1-Wp(stop); # stop will be at most length 1, so no need to + Ws(stop) = 1-Ws(stop); # subtract from ones(1,length(stop)) + + ## warp the target frequencies according to the bilinear transform + Ws = (2/T)*tan(pi*Ws./T); + Wp = (2/T)*tan(pi*Wp./T); + + ## compute minimum n which satisfies all band edge conditions + ## the factor 1/length(Wp) is an artificial correction for the + ## band pass/stop case, which otherwise significantly overdesigns. + qs = log(10^(Rs/10) - 1); + qp = log(10^(Rp/10) - 1); + n = ceil(max(0.5*(qs - qp)./log(Ws./Wp))/length(Wp)); + + ## compute -3dB cutoff given Wp, Rp and n + Wc = exp(log(Wp) - qp/2/n); + + ## unwarp the returned frequency + Wc = atan(T/2*Wc)*T/pi; + + ## if high pass, reverse the sense of the test + Wc(stop) = 1-Wc(stop); + +endfunction