chiark / gitweb /
detpic/display-nmra: new NmraAssist::HighPassFilter for more reliable capture of...
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sat, 8 Jan 2011 19:14:55 +0000 (19:14 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sat, 8 Jan 2011 19:14:55 +0000 (19:14 +0000)
detpic/NmraAssist.pm [new file with mode: 0644]
detpic/display-nmra
detpic/display-nmra-decoded

diff --git a/detpic/NmraAssist.pm b/detpic/NmraAssist.pm
new file mode 100644 (file)
index 0000000..94c36e2
--- /dev/null
@@ -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;
index 2941e8a22ea27b466d1991719dbcfb9f31026983..bbd9a96ab08475bcf230c1d601d9c0c9d36457fd 100755 (executable)
@@ -3,10 +3,14 @@ set -ex
 
 xpixels=1024
 ypixels=768
-ypersamp=8
-fsd=0.3
+ypersamp=20
+fsd=1.0
 
 perl -e <t.nmra.dat '
+       use NmraAssist;
+
+       $filter= NmraAssist::HighPassFilter->new();
+
        for (;;) {
                @l= ();
                $ticks= "";
@@ -18,6 +22,7 @@ perl -e <t.nmra.dat '
                        next if m/^\;/;
                        m/^\s*([-e0-9.]+)\s+([-0-9.]+)\s*$/ or die;
                        ($t,$samp)=($1,$2);
+                       $samp= $filter->transform($t, $samp);
                        $h= sprintf "%d",
                                ($samp/(2.0*'$fsd') + 0.5) * ('$ypersamp'-1);
                        for ($y=0, $l=0; $y<'$ypersamp'; $y+=2, $l++) {
index 3ca18fb462d8044f4a9a6c38e937bccc7d4fbeb9..e2b26541e68c28591c9098610918488d38b920d4 100755 (executable)
@@ -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;
 }