diff --git a/dstat_interface/interface/exp_int.py b/dstat_interface/interface/exp_int.py
index 436b78a42f37ae5222ac0f81325f8bcbcf857e2e..2775dc7acd8dad05320f21bce94d704f863b8d4e 100644
--- a/dstat_interface/interface/exp_int.py
+++ b/dstat_interface/interface/exp_int.py
@@ -213,13 +213,15 @@ class PD(ExpInterface):
self.entry['sync'] = self.builder.get_object('sync_button')
self.entry['sync_freq'] = self.builder.get_object('sync_freq')
self.entry['fft_start'] = self.builder.get_object('fft_entry')
+ self.entry['fft_int'] = self.builder.get_object('fft_int_entry')
self.buttons = map(self.builder.get_object,
['light_button', 'threshold_button'])
self.shutter_buttons = map(
self.builder.get_object,
- ['sync_button', 'sync_freq', 'fft_label', 'fft_entry']
+ ['sync_button', 'sync_freq', 'fft_label', 'fft_entry', 'fft_label2',
+ 'fft_int_entry']
)
def on_light_button_clicked(self, data=None):
@@ -280,6 +282,7 @@ class PD(ExpInterface):
parameters['sync'] = self.entry['sync'].get_active()
parameters['sync_freq'] = float(self.entry['sync_freq'].get_text())
parameters['fft_start'] = float(self.entry['fft_start'].get_text())
+ parameters['fft_int'] = float(self.entry['fft_int'].get_text())
return parameters
diff --git a/dstat_interface/interface/pd.glade b/dstat_interface/interface/pd.glade
index 0db0eb27801678372b3b861ec6d978104110e323..bb72ff8153173d2da83cec1bfab0d494fb22372b 100644
--- a/dstat_interface/interface/pd.glade
+++ b/dstat_interface/interface/pd.glade
@@ -340,7 +340,7 @@
6
●
8
- 0.5
+ 1
1
True
False
diff --git a/dstat_interface/main.py b/dstat_interface/main.py
index 784444a5fd7787c5c6dee99a2f548e8bb7ab0879..5414032a2e87bb161204111571b2946155529ea2 100755
--- a/dstat_interface/main.py
+++ b/dstat_interface/main.py
@@ -694,6 +694,11 @@ class Main(object):
parameters['fft_start'] > parameters['time']-1):
raise InputError(parameters['fft_start'],
"FFT must start between 0 and time-1.")
+ if parameters['fft_int'] < 0:
+ raise InputError(
+ parameters['fft_int'],
+ "Integral bandwidth must be greater than 0"
+ )
self.current_exp = comm.PDExp(parameters)
run_experiment()
@@ -863,6 +868,11 @@ class Main(object):
self.ft_plot.updateline(self.current_exp, 0)
self.ft_plot.redraw()
self.current_exp.data_extra = self.current_exp.ftdata
+ self.statusbar.push(
+ self.message_context_id, " ".join(
+ ("Integral:",str(self.current_exp.ft_int))
+ )
+ )
self.databuffer.set_text("")
self.databuffer.place_cursor(self.databuffer.get_start_iter())
diff --git a/dstat_interface/plot.py b/dstat_interface/plot.py
index c3e846a7fd6e518603045193bdd9b69a8327b5fe..dcd5c8b793d67e28cebfdd3f1f9d031cbaabbc21 100644
--- a/dstat_interface/plot.py
+++ b/dstat_interface/plot.py
@@ -32,14 +32,14 @@ from matplotlib.backends.backend_gtkagg \
from matplotlib.backends.backend_gtkagg \
import NavigationToolbar2GTKAgg as NavigationToolbar
-from numpy import sin, linspace, pi, mean
+from numpy import sin, linspace, pi, mean, trapz
from scipy import fft, arange
from scipy.signal import blackman
def plotSpectrum(y,Fs):
"""
Plots a Single-Sided Amplitude Spectrum of y(t)
- """
+ """
y = y-mean(y)
n = len(y) # length of the signal
k = arange(n)
@@ -50,9 +50,28 @@ def plotSpectrum(y,Fs):
Y = fft(y*W)/n # fft computing and normalization
Y = abs(Y[range(n/2)])
-
return (frq, Y)
+def integrateSpectrum(x, y, target, bandwidth):
+ """
+ Returns integral of range of bandwidth centered on target (both in Hz).
+ """
+ j = 0
+ k = len(x)
+
+ for i in range(len(x)):
+ if x[i] >= target-bandwidth/2:
+ j = i
+ break
+
+ for i in range(j,len(x)):
+ if x[i] >= target+bandwidth/2:
+ k = i
+ break
+
+ return trapz(y=y[j:k], x=x[j:k])
+
+
class plotbox(object):
"""Contains main data plot and associated methods."""
def __init__(self, plotwindow_instance):
@@ -137,9 +156,14 @@ class ft_box(plotbox):
x = Experiment.data[line_number*2]
freq = Experiment.parameters['adc_rate_hz']
i = search_value(x, Experiment.parameters['fft_start'])
- print i
f, Y = plotSpectrum(y[i:],freq)
+ Experiment.ft_int = integrateSpectrum(
+ f,
+ Y,
+ Experiment.parameters['sync_freq'],
+ Experiment.parameters['fft_int']
+ )
self.lines[line_number].set_ydata(Y)
self.lines[line_number].set_xdata(f)
Experiment.ftdata = (f, Y)