Mercurial > forge
changeset 8445:bf7be52d285b octave-forge
butter: tests and demo. Submitted by Alexander Klein <Alexander.Klein@math.uni-giessen.de>
author | carandraug |
---|---|
date | Thu, 29 Sep 2011 14:02:27 +0000 |
parents | 3694ab4c034f |
children | ed03ff92816e |
files | main/signal/inst/butter.m |
diffstat | 1 files changed, 55 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/main/signal/inst/butter.m Thu Sep 29 13:08:41 2011 +0000 +++ b/main/signal/inst/butter.m Thu Sep 29 14:02:27 2011 +0000 @@ -45,6 +45,7 @@ ## Author: Paul Kienzle <pkienzle@user.sf.net> ## Modified by: Doug Stewart <dastew@sympatico.ca> Feb, 2003 +## Tests and demos added: Alexander Klein <alexander.klein@math.uni-giessen.de>, Sep 2011 function [a, b, c, d] = butter (n, W, varargin) @@ -121,3 +122,57 @@ endif endfunction + +%!shared sf, sf2, off_db +%! off_db = 0.5; +%! ##Sampling frequency must be that high to make the low pass filters pass. +%! sf = 6000; sf2 = sf/2; +%! data=[sinetone(5,sf,10,1),sinetone(10,sf,10,1),sinetone(50,sf,10,1),sinetone(200,sf,10,1),sinetone(400,sf,10,1)]; + +%!test +%! ##Test low pass order 1 with 3dB @ 50Hz +%! data=[sinetone(5,sf,10,1),sinetone(10,sf,10,1),sinetone(50,sf,10,1),sinetone(200,sf,10,1),sinetone(400,sf,10,1)]; +%! [b, a] = butter ( 1, 50 / sf2 ); +%! filtered = filter ( b, a, data ); +%! damp_db = 20 * log10 ( max ( filtered ( end - sf : end, : ) ) ) +%! assert ( [ damp_db( 4 ) - damp_db( 5 ), damp_db( 1 : 3 ) ], [ 6 0 0 -3 ], off_db ) + +%!test +%! ##Test low pass order 4 with 3dB @ 50Hz +%! data=[sinetone(5,sf,10,1),sinetone(10,sf,10,1),sinetone(50,sf,10,1),sinetone(200,sf,10,1),sinetone(400,sf,10,1)]; +%! [b, a] = butter ( 4, 50 / sf2 ); +%! filtered = filter ( b, a, data ); +%! damp_db = 20 * log10 ( max ( filtered ( end - sf : end, : ) ) ) +%! assert ( [ damp_db( 4 ) - damp_db( 5 ), damp_db( 1 : 3 ) ], [ 24 0 0 -3 ], off_db ) + +%!test +%! ##Test high pass order 1 with 3dB @ 50Hz +%! data=[sinetone(5,sf,10,1),sinetone(10,sf,10,1),sinetone(50,sf,10,1),sinetone(200,sf,10,1),sinetone(400,sf,10,1)]; +%! [b, a] = butter ( 1, 50 / sf2, "high" ); +%! filtered = filter ( b, a, data ); +%! damp_db = 20 * log10 ( max ( filtered ( end - sf : end, : ) ) ) +%! assert ( [ damp_db( 2 ) - damp_db( 1 ), damp_db( 3 : end ) ], [ 6 -3 0 0 ], off_db ) + +%!test +%! ##Test high pass order 4 with 3dB @ 50Hz +%! data=[sinetone(5,sf,10,1),sinetone(10,sf,10,1),sinetone(50,sf,10,1),sinetone(200,sf,10,1),sinetone(400,sf,10,1)]; +%! [b, a] = butter ( 4, 50 / sf2, "high" ); +%! filtered = filter ( b, a, data ); +%! damp_db = 20 * log10 ( max ( filtered ( end - sf : end, : ) ) ) +%! assert ( [ damp_db( 2 ) - damp_db( 1 ), damp_db( 3 : end ) ], [ 24 -3 0 0 ], off_db ) + +%!demo +%! sf = 800; sf2 = sf/2; +%! data=[[1;zeros(sf-1,1)],sinetone(25,sf,1,1),sinetone(50,sf,1,1),sinetone(100,sf,1,1)]; +%! [b,a]=butter ( 1, 50 / sf2 ); +%! filtered = filter(b,a,data); +%! +%! clf +%! subplot ( columns ( filtered ), 1, 1) +%! plot(filtered(:,1),";Impulse response;") +%! subplot ( columns ( filtered ), 1, 2 ) +%! plot(filtered(:,2),";25Hz response;") +%! subplot ( columns ( filtered ), 1, 3 ) +%! plot(filtered(:,3),";50Hz response;") +%! subplot ( columns ( filtered ), 1, 4 ) +%! plot(filtered(:,4),";100Hz response;")