From 59070969a9e7e7d83342de2655a3e947ea0f8585 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 8 Jan 2011 19:14:55 +0000 Subject: [PATCH] detpic/display-nmra: new NmraAssist::HighPassFilter for more reliable capture of data from track --- detpic/NmraAssist.pm | 43 +++++++++++++++++++++++++++++++++++++ detpic/display-nmra | 9 ++++++-- detpic/display-nmra-decoded | 8 ++++++- 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 detpic/NmraAssist.pm diff --git a/detpic/NmraAssist.pm b/detpic/NmraAssist.pm new file mode 100644 index 0000000..94c36e2 --- /dev/null +++ b/detpic/NmraAssist.pm @@ -0,0 +1,43 @@ +# -*- perl -*- + +package NmraAssist; + +BEGIN { + use Exporter (); + our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); + $VERSION = 1.00; + @ISA = qw(Exporter); + @EXPORT = qw(); + %EXPORT_TAGS = ( ); + + @EXPORT_OK = qw(); +} + +package NmraAssist::HighPassFilter; + +# We subtract an alpha-smoothed value +our $default_timeconstant= 300e-6; # seconds, e-life + +sub new ($) { + my ($class) = @_; + my $sf= { + SmoothedValue => 0, + TimeConstant => $default_timeconstant, + LastSampleTime => 0 + }; + bless $sf, $class; + return $sf; +} + +sub transform ($$$) { + my ($sf, $t, $value) = @_; + + my $interval= $t - $sf->{LastSampleTime}; + $sf->{SmoothedValue} *= exp( -$interval / $sf->{TimeConstant} ); + $sf->{SmoothedValue} += $value * $interval / $sf->{TimeConstant}; + $sf->{LastSampleTime}= $t; + $value -= $sf->{SmoothedValue}; + return $value; +} + +1; diff --git a/detpic/display-nmra b/detpic/display-nmra index 2941e8a..bbd9a96 100755 --- a/detpic/display-nmra +++ b/detpic/display-nmra @@ -3,10 +3,14 @@ set -ex xpixels=1024 ypixels=768 -ypersamp=8 -fsd=0.3 +ypersamp=20 +fsd=1.0 perl -e new(); + for (;;) { @l= (); $ticks= ""; @@ -18,6 +22,7 @@ perl -e transform($t, $samp); $h= sprintf "%d", ($samp/(2.0*'$fsd') + 0.5) * ('$ypersamp'-1); for ($y=0, $l=0; $y<'$ypersamp'; $y+=2, $l++) { diff --git a/detpic/display-nmra-decoded b/detpic/display-nmra-decoded index 3ca18fb..e2b2654 100755 --- a/detpic/display-nmra-decoded +++ b/detpic/display-nmra-decoded @@ -36,6 +36,7 @@ use strict qw(vars refs); use IO::Handle; +use NmraAssist; sub usec_from_to ($$) { my ($from,$to) = @_; # uses $from->{S}, $from->{U}, $to->{S}, $to->{U} @@ -244,6 +245,8 @@ sub found_datapoint ($$) { #---------- datapoint reader ---------- +our $filter= NmraAssist::HighPassFilter->new(); + sub read_stdin() { reset_bit_decoder(); @@ -251,7 +254,10 @@ sub read_stdin() { last if STDIN->eof; next if m/^\;/; m/^\s*([-.0-9e]+)\s+([-.0-9e]+)\s*$/ or die "$_ ?"; - found_datapoint($1 * 1e6, $2); + my ($t, $value) = ($1,$2); + $value= $filter->transform($t, $value); + $t *= 1e6; + found_datapoint($t, $value); } die $! if STDIN->error; } -- 2.30.2