summaryrefslogtreecommitdiff
path: root/gr-utils/python
diff options
context:
space:
mode:
authorMarcus Müller <marcus@hostalia.de>2018-08-24 23:00:55 +0200
committerMarcus Müller <marcus@hostalia.de>2018-11-02 22:15:53 +0100
commit797994a11ac5ec6bee9ea01c092947d0c34115f1 (patch)
tree7381f53008ba56e6b93398fa92be482d12da4f43 /gr-utils/python
parente07751acc8424f4dd987f79c32dd247ed347902c (diff)
Replace scipy/pylab where numpy/pyplot is sufficient
This should reduce the number of times users are prompted to install pylab || scipy when they'd actually get away with functionality fully contained in numpy and matplotlib. This only solves the obvious cases. There's some usage of `pylab.mlab` that would need more than 20s of consideration.
Diffstat (limited to 'gr-utils/python')
-rw-r--r--gr-utils/python/utils/plot_data.py19
-rw-r--r--gr-utils/python/utils/plot_fft_base.py26
-rw-r--r--gr-utils/python/utils/plot_psd_base.py39
3 files changed, 31 insertions, 53 deletions
diff --git a/gr-utils/python/utils/plot_data.py b/gr-utils/python/utils/plot_data.py
index a054147114..dc9346c484 100644
--- a/gr-utils/python/utils/plot_data.py
+++ b/gr-utils/python/utils/plot_data.py
@@ -26,18 +26,7 @@ from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals
-try:
- import scipy
-except ImportError:
- print("Please install SciPy to run this script (http://www.scipy.org/)")
- raise SystemExit(1)
-
-try:
- from pylab import *
-except ImportError:
- print("Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)")
- raise SystemExit(1)
-
+import numpy
class plot_data(object):
def __init__(self, datatype, filenames, options):
@@ -88,12 +77,12 @@ class plot_data(object):
def get_data(self, hfile):
self.text_file_pos.set_text("File Position: %d" % (hfile.tell()//self.sizeof_data))
try:
- f = scipy.fromfile(hfile, dtype=self.datatype, count=self.block_length)
+ f = numpy.fromfile(hfile, dtype=self.datatype, count=self.block_length)
except MemoryError:
print("End of File")
else:
- self.f = scipy.array(f)
- self.time = scipy.array([i*(1 / self.sample_rate) for i in range(len(self.f))])
+ self.f = numpy.array(f)
+ self.time = numpy.array([i*(1 / self.sample_rate) for i in range(len(self.f))])
def make_plots(self):
self.sp_f = self.fig.add_subplot(2,1,1, position=[0.075, 0.2, 0.875, 0.6])
diff --git a/gr-utils/python/utils/plot_fft_base.py b/gr-utils/python/utils/plot_fft_base.py
index 5040aefa87..ec26f059f9 100644
--- a/gr-utils/python/utils/plot_fft_base.py
+++ b/gr-utils/python/utils/plot_fft_base.py
@@ -24,12 +24,8 @@ from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals
-try:
- import scipy
- from scipy import fftpack
-except ImportError:
- print("Please install SciPy to run this script (http://www.scipy.org/)")
- raise SystemExit(1)
+import numpy
+from numpy.fft import fftpack
try:
from pylab import *
@@ -46,7 +42,7 @@ class plot_fft_base(object):
self.start = options.start
self.sample_rate = options.sample_rate
- self.datatype = getattr(scipy, datatype)
+ self.datatype = numpy.complex64
self.sizeof_data = self.datatype().nbytes # number of bytes per sample in file
self.axis_font_size = 16
@@ -86,22 +82,22 @@ class plot_fft_base(object):
self.position = self.hfile.tell() / self.sizeof_data
self.text_file_pos.set_text("File Position: %d" % (self.position))
try:
- self.iq = scipy.fromfile(self.hfile, dtype=self.datatype, count=self.block_length)
+ self.iq = numpy.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 = scipy.array([tstep*(self.position + i) for i in range(len(self.iq))])
- self.time = scipy.array([tstep*(i) for i in range(len(self.iq))])
+ #self.time = numpy.array([tstep*(self.position + i) for i in range(len(self.iq))])
+ self.time = numpy.array([tstep*(i) for i in range(len(self.iq))])
self.freq = self.calc_freq(self.time, self.sample_rate)
def dofft(self, iq):
N = len(iq)
- iq_fft = scipy.fftpack.fftshift(scipy.fft(iq)) # fft and shift axis
- iq_fft = 20*scipy.log10(abs((iq_fft+1e-15) / N)) # convert to decibels, adjust power
+ iq_fft = numpy.fft.fftshift(fftpack.fft(iq)) # fft and shift axis
+ iq_fft = 20*numpy.log10(abs((iq_fft+1e-15) / N)) # convert to decibels, adjust power
# adding 1e-15 (-300 dB) to protect against value errors if an item in iq_fft is 0
return iq_fft
@@ -109,7 +105,7 @@ class plot_fft_base(object):
N = len(time)
Fs = 1.0 / (time.max( - time.min()))
Fn = 0.5 * sample_rate
- freq = scipy.array([-Fn + i*Fs for i in range(N)])
+ freq = numpy.array([-Fn + i*Fs for i in range(N)])
return freq
def make_plots(self):
@@ -161,8 +157,8 @@ class plot_fft_base(object):
draw()
def zoom(self, event):
- newxlim = scipy.array(self.sp_iq.get_xlim())
- curxlim = scipy.array(self.xlim)
+ newxlim = numpy.array(self.sp_iq.get_xlim())
+ curxlim = numpy.array(self.xlim)
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))))
diff --git a/gr-utils/python/utils/plot_psd_base.py b/gr-utils/python/utils/plot_psd_base.py
index 0a0f3cab34..eb9a5a6431 100644
--- a/gr-utils/python/utils/plot_psd_base.py
+++ b/gr-utils/python/utils/plot_psd_base.py
@@ -23,13 +23,7 @@
from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals
-
-try:
- import scipy
- from scipy import fftpack
-except ImportError:
- print("Please install SciPy to run this script (http://www.scipy.org/)")
- raise SystemExit(1)
+import numpy
try:
from pylab import *
@@ -38,7 +32,6 @@ except ImportError:
raise SystemExit(1)
from argparse import ArgumentParser
-from scipy import log10
from gnuradio.eng_arg import eng_float, intx
class plot_psd_base(object):
@@ -52,7 +45,7 @@ class plot_psd_base(object):
self.dospec = options.enable_spec # if we want to plot the spectrogram
- self.datatype = getattr(scipy, datatype) #scipy.complex64
+ self.datatype = numpy.complex64
self.sizeof_data = self.datatype().nbytes # number of bytes per sample in file
self.axis_font_size = 16
@@ -83,7 +76,7 @@ class plot_psd_base(object):
self.button_right = Button(self.button_right_axes, ">")
self.button_right_callback = self.button_right.on_clicked(self.button_right_click)
- self.xlim = scipy.array(self.sp_iq.get_xlim())
+ self.xlim = numpy.array(self.sp_iq.get_xlim())
self.manager = get_current_fig_manager()
connect('draw_event', self.zoom)
@@ -94,17 +87,17 @@ class plot_psd_base(object):
self.position = self.hfile.tell() / self.sizeof_data
self.text_file_pos.set_text("File Position: %d" % self.position)
try:
- self.iq = scipy.fromfile(self.hfile, dtype=self.datatype, count=self.block_length)
+ self.iq = numpy.fromfile(self.hfile, dtype=self.datatype, count=self.block_length)
except MemoryError:
print("End of File")
return False
else:
- # retesting length here as newer version of scipy does not throw a MemoryError, just
+ # retesting length here as newer version of numpy does not throw a MemoryError, just
# returns a zero-length array
if(len(self.iq) > 0):
tstep = 1.0 / self.sample_rate
- #self.time = scipy.array([tstep*(self.position + i) for i in range(len(self.iq))])
- self.time = scipy.array([tstep*(i) for i in range(len(self.iq))])
+ #self.time = numpy.array([tstep*(self.position + i) for i in range(len(self.iq))])
+ self.time = numpy.array([tstep*(i) for i in range(len(self.iq))])
self.iq_psd, self.freq = self.dopsd(self.iq)
return True
@@ -115,11 +108,11 @@ class plot_psd_base(object):
def dopsd(self, iq):
''' Need to do this here and plot later so we can do the fftshift '''
overlap = self.psdfftsize / 4
- winfunc = scipy.blackman
+ winfunc = numpy.blackman
psd,freq = mlab.psd(iq, self.psdfftsize, self.sample_rate,
window = lambda d: d*winfunc(self.psdfftsize),
noverlap = overlap)
- psd = 10.0*log10(abs(psd))
+ psd = 10.0*numpy.log10(abs(psd))
return (psd, freq)
def make_plots(self):
@@ -179,7 +172,7 @@ class plot_psd_base(object):
def draw_spec(self, t, s):
overlap = self.specfftsize / 4
- winfunc = scipy.blackman
+ winfunc = numpy.blackman
self.sp_spec.clear()
self.sp_spec.specgram(s, self.specfftsize, self.sample_rate,
window = lambda d: d*winfunc(self.specfftsize),
@@ -192,26 +185,26 @@ class plot_psd_base(object):
if self.dospec:
self.draw_spec(self.time, self.iq)
- self.xlim = scipy.array(self.sp_iq.get_xlim()) # so zoom doesn't get called
+ self.xlim = numpy.array(self.sp_iq.get_xlim()) # so zoom doesn't get called
draw()
def zoom(self, event):
- newxlim = scipy.array(self.sp_iq.get_xlim())
- curxlim = scipy.array(self.xlim)
+ newxlim = numpy.array(self.sp_iq.get_xlim())
+ curxlim = numpy.array(self.xlim)
if(newxlim[0] != curxlim[0] or newxlim[1] != curxlim[1]):
#xmin = max(0, int(ceil(self.sample_rate*(newxlim[0] - self.position))))
#xmax = min(int(ceil(self.sample_rate*(newxlim[1] - self.position))), len(self.iq))
xmin = max(0, int(ceil(self.sample_rate*(newxlim[0]))))
xmax = min(int(ceil(self.sample_rate*(newxlim[1]))), len(self.iq))
- iq = scipy.array(self.iq[xmin : xmax])
- time = scipy.array(self.time[xmin : xmax])
+ iq = numpy.array(self.iq[xmin : xmax])
+ time = numpy.array(self.time[xmin : xmax])
iq_psd, freq = self.dopsd(iq)
self.draw_psd(freq, iq_psd)
- self.xlim = scipy.array(self.sp_iq.get_xlim())
+ self.xlim = numpy.array(self.sp_iq.get_xlim())
draw()