Modified log power fft block so ref scale is peak to peak.
authorJosh Blum <josh@joshknows.com>
Tue, 1 Sep 2009 01:18:22 +0000 (18:18 -0700)
committerJosh Blum <josh@joshknows.com>
Tue, 1 Sep 2009 01:18:22 +0000 (18:18 -0700)
Tweaked fft sink autoscale routine to come up with better numbers.
Modified scope sink ac couple block to use constant tap.
The previous tap calculation would cause failure for very small sample rates.

gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py
gr-wxgui/src/python/fft_window.py
gr-wxgui/src/python/scopesink_gl.py

index cf8eb1be78597fae71ed617307ddf4e707e0e7f4..7ef40be40a92bb4f55a872e05802e95fd2b3f0c2 100644 (file)
@@ -55,9 +55,9 @@ class _logpwrfft_base(gr.hier_block2):
         c2mag = gr.complex_to_mag(fft_size)
         self._avg = gr.single_pole_iir_filter_ff(1.0, fft_size)
         self._log = gr.nlog10_ff(20, fft_size,
-                                 -10*math.log10(fft_size)              # Adjust for number of bins
+                                 -20*math.log10(fft_size)              # Adjust for number of bins
                                  -10*math.log10(window_power/fft_size) # Adjust for windowing loss
-                                 -20*math.log10(ref_scale/2))          # Adjust for reference scale
+                                 -20*math.log10(ref_scale/2)+3.0)      # Adjust for reference scale
         self.connect(self, self._sd, fft, c2mag, self._avg, self._log, self)
 
         self._average = average
index 0529e6a5d6d77eb2070fbda7468fa2c1cecb1fb8..4c575f1a62cd29aa302b57a954a71748bf6138a5 100644 (file)
@@ -256,15 +256,19 @@ class fft_window(wx.Panel, pubsub.pubsub):
                if not len(self.samples): return
                #get the peak level (max of the samples)
                peak_level = numpy.max(self.samples)
-               #get the noise floor (averge the smallest samples)
-               noise_floor = numpy.average(numpy.sort(self.samples)[:len(self.samples)/4])
-               #padding
-               noise_floor -= abs(noise_floor)*.5
-               peak_level += abs(peak_level)*.1
-               #set the reference level to a multiple of y divs
-               self[REF_LEVEL_KEY] = self[Y_DIVS_KEY]*math.ceil(peak_level/self[Y_DIVS_KEY])
+               #separate noise samples
+               noise_samps = numpy.sort(self.samples)[:len(self.samples)/2]
+               #get the noise floor
+               noise_floor = numpy.average(noise_samps)
+               #get the noise deviation
+               noise_dev = numpy.std(noise_samps)
+               #determine the maximum and minimum levels
+               max_level = peak_level
+               min_level = noise_floor - abs(2*noise_dev)
                #set the range to a clean number of the dynamic range
-               self[Y_PER_DIV_KEY] = common.get_clean_num((peak_level - noise_floor)/self[Y_DIVS_KEY])
+               self[Y_PER_DIV_KEY] = common.get_clean_num(1+(max_level - min_level)/self[Y_DIVS_KEY])
+               #set the reference level to a multiple of y per div
+               self[REF_LEVEL_KEY] = self[Y_PER_DIV_KEY]*round(.5+max_level/self[Y_PER_DIV_KEY])
 
        def _reset_peak_vals(self, *args): self.peak_vals = EMPTY_TRACE
 
index b4ae0f3391df3a86b51e5b20dbcd7a746a05ba6e..a5e3ca3ce32fc7f9c40fd305d5c7fd4bd2d709e5 100644 (file)
@@ -50,7 +50,7 @@ class ac_couple_block(gr.hier_block2):
                self.connect(self, lpf, mute, (sub, 1))
                #subscribe
                controller.subscribe(ac_couple_key, lambda x: mute.set_mute(not x))
-               controller.subscribe(sample_rate_key, lambda x: lpf.set_taps(2.0/x))
+               controller.subscribe(sample_rate_key, lambda x: lpf.set_taps(0.05))
                #initialize
                controller[ac_couple_key] = ac_couple
                controller[sample_rate_key] = controller[sample_rate_key]