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)