Merge branch 'maint'
[debian/gnuradio] / gr-utils / src / python / gr_plot_fft.py
index a9c1417f9b308993cfaa09ebc0a78c3461ef4118..ba3901e03c5351b2633976704c0d8e9849761a95 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 #
-# Copyright 2007,2008 Free Software Foundation, Inc.
+# Copyright 2007,2008,2011 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
@@ -81,15 +81,16 @@ class gr_plot_fft:
     def get_data(self):
         self.position = self.hfile.tell()/self.sizeof_data
         self.text_file_pos.set_text("File Position: %d" % (self.position))
-        self.iq = scipy.fromfile(self.hfile, dtype=self.datatype, count=self.block_length)
-        #print "Read in %d items" % len(self.iq)
-        if(len(self.iq) == 0):
+        try:
+            self.iq = scipy.fromfile(self.hfile, dtype=self.datatype, count=self.block_length)
+        except MemoryError:
             print "End of File"
         else:
             self.iq_fft = self.dofft(self.iq)
             
             tstep = 1.0 / self.sample_rate
-            self.time = [tstep*(self.position + i) for i in xrange(len(self.iq))]
+            #self.time = scipy.array([tstep*(self.position + i) for i in xrange(len(self.iq))])
+            self.time = scipy.array([tstep*(i) for i in xrange(len(self.iq))])
 
             self.freq = self.calc_freq(self.time, self.sample_rate)
 
@@ -102,9 +103,9 @@ class gr_plot_fft:
 
     def calc_freq(self, time, sample_rate):
         N = len(time)
-        Fs = 1.0 / (max(time) - min(time))
+        Fs = 1.0 / (time.max() - time.min())
         Fn = 0.5 * sample_rate
-        freq = [-Fn + i*Fs for i in xrange(N)]
+        freq = scipy.array([-Fn + i*Fs for i in xrange(N)])
         return freq
         
     def make_plots(self):
@@ -139,14 +140,14 @@ class gr_plot_fft:
         imags = self.iq.imag
         self.plot_iq[0].set_data([self.time, reals])
         self.plot_iq[1].set_data([self.time, imags])
-        self.sp_iq.set_xlim(min(self.time), max(self.time))
-        self.sp_iq.set_ylim([1.5*min([min(reals), min(imags)]),
-                             1.5*max([max(reals), max(imags)])])
+        self.sp_iq.set_xlim(self.time.min(), self.time.max())
+        self.sp_iq.set_ylim([1.5*min([reals.min(), imags.min()]),
+                             1.5*max([reals.max(), imags.max()])])
 
     def draw_fft(self):
         self.plot_fft[0].set_data([self.freq, self.iq_fft])
-        self.sp_fft.set_xlim(min(self.freq), max(self.freq))
-        self.sp_fft.set_ylim([min(self.iq_fft)-10, max(self.iq_fft)+10])
+        self.sp_fft.set_xlim(self.freq.min(), self.freq.max())
+        self.sp_fft.set_ylim([self.iq_fft.min()-10, self.iq_fft.max()+10])
 
     def update_plots(self):
         self.draw_time()
@@ -158,10 +159,12 @@ class gr_plot_fft:
     def zoom(self, event):
         newxlim = scipy.array(self.sp_iq.get_xlim())
         curxlim = scipy.array(self.xlim)
-        if(newxlim.all() != curxlim.all()):
+        if(newxlim[0] != curxlim[0] or newxlim[1] != curxlim[1]):
             self.xlim = newxlim
-            xmin = max(0, int(ceil(self.sample_rate*(self.xlim[0] - self.position))))
-            xmax = min(int(ceil(self.sample_rate*(self.xlim[1] - self.position))), len(self.iq))
+            #xmin = max(0, int(ceil(self.sample_rate*(self.xlim[0] - self.position))))
+            #xmax = min(int(ceil(self.sample_rate*(self.xlim[1] - self.position))), len(self.iq))
+            xmin = max(0, int(ceil(self.sample_rate*(self.xlim[0]))))
+            xmax = min(int(ceil(self.sample_rate*(self.xlim[1]))), len(self.iq))
 
             iq = self.iq[xmin : xmax]
             time = self.time[xmin : xmax]
@@ -170,8 +173,8 @@ class gr_plot_fft:
             freq = self.calc_freq(time, self.sample_rate)
             
             self.plot_fft[0].set_data(freq, iq_fft)
-            self.sp_fft.axis([min(freq), max(freq),
-                              min(iq_fft)-10, max(iq_fft)+10])
+            self.sp_fft.axis([freq.min(), freq.max(),
+                              iq_fft.min()-10, iq_fft.max()+10])
 
             draw()