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;")