9 typedef ublas::matrix<double>
Matrix;
15 double const pi = M_PI;
18 double logb(
int base, T value)
20 return log(value)/log(base);
40 plugin_name =
"Pass Band";
49 ublas::matrix<double> PassBand::use(
const ublas::matrix<double> &data)
57 int nfeatures =
nrow(data);
59 ublas::matrix<double> var_ret =
createMatrix(0,0,data.size2());
62 for(
int i=0;i<num_bands;i++)
68 if(states.size() <= i)
71 new_state.
empty =
true;
72 states.push_back(new_state);
80 means.push_back(temp);
84 states[i] = temp.
state;
101 var_matrix.resize(data.size1(),data.size2());
103 for(
int feature=0;feature<data.size1();feature++)
107 if(means[i].size() <= feature)
109 vars[i].push_back(0);
110 means[i].push_back(0);
112 ublas::vector<double> row = ublas::row(temp.
filtered,feature);
114 for(
int col=0; col<data.size2(); col++)
116 means[i][feature] = gamma * means[i][feature]
117 + (1.0-gamma)*(row[col]);
118 vars[i][feature] = gamma * vars[i][feature]
119 + (1.0-gamma)*(pow(row[col]-means[i][feature],2));
121 var_matrix(feature,col) = vars[i][feature];
124 var_ret =
rbind(var_ret,var_matrix);
129 bool use_variance = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_variance));
142 GtkWidget *PassBand::getGuiInterface()
144 return gui_container;
153 void PassBand::save(boost::archive::text_oarchive &ar,
const unsigned int &version)
const
160 void PassBand::load(boost::archive::text_iarchive &ar,
const unsigned int &version)
170 void PassBand::train()
173 for(
int i=0;i<num_bands;i++)
176 int pass = int((row.
low + row.
high) / 2.0);
178 if(configurations.count(sample_rate) == 0
179 || configurations[sample_rate].count(row.
low) == 0
180 || configurations[sample_rate][row.
low].count(row.
high) == 0)
183 configurations[sample_rate][row.
low][row.
high]
188 filters[i] = configurations[sample_rate][row.
low][row.
high];
190 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_trained),
true);
206 void PassBand::ChangeOptions(
int pos)
208 bool new_config =
false;
209 for(
int i=0; i<num_bands; i++)
213 int low = int(gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget_rows[i].spin_low)));
214 int high = int(gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget_rows[i].spin_high)));
217 if(i < config_rows.size())
219 config_rows[i].low = low;
220 config_rows[i].high = high;
227 config_rows.push_back(temp);
236 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget_rows[i].spin_low),high-1);
242 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget_rows[i].spin_high),low+1);
248 if(configurations.count(sample_rate) == 0
249 || configurations[sample_rate].count(low) == 0
250 || configurations[sample_rate][low].count(high) == 0)
262 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_trained),
false);
267 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_trained),
true);
283 void PassBand::InitGUI()
289 gui_container = gtk_vbox_new(
false,0);
292 GtkWidget *hbox_row1 = gtk_hbox_new(
false,0);
294 gtk_box_pack_start(GTK_BOX(gui_container),hbox_row1,
false,
false, 0);
300 spin_bands = gtk_spin_button_new_with_range(1,50,1);
301 gtk_widget_set_size_request(spin_bands, 40, 18);
302 g_signal_connect(G_OBJECT(spin_bands),
304 G_CALLBACK(CB_ChangeNumBands),
306 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_bands),1);
307 gtk_box_pack_start(GTK_BOX(hbox_row1), gtk_label_new(
"Number of Bands: "),
false,
false,0);
308 gtk_box_pack_start(GTK_BOX(hbox_row1), spin_bands,
false,
false,0);
310 spin_gamma = gtk_spin_button_new_with_range(0,1,0.001);
311 gtk_widget_set_size_request(spin_gamma, 80, 18);
312 g_signal_connect(G_OBJECT(spin_gamma),
314 G_CALLBACK(CB_ChangeGamma),
316 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_gamma),gamma);
317 gtk_box_pack_start(GTK_BOX(hbox_row1), gtk_label_new(
"Gamma: "),
false,
false,0);
318 gtk_box_pack_start(GTK_BOX(hbox_row1), spin_gamma,
false,
false,0);
324 check_variance = gtk_check_button_new_with_label(
"Use Variance");
325 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_variance),
true);
326 gtk_box_pack_end(GTK_BOX(hbox_row1), check_variance,
false,
false, 0);
331 check_trained = gtk_check_button_new_with_label(
"Trained");
332 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_trained),
false);
333 gtk_widget_set_sensitive(check_trained,
false);
335 gtk_box_pack_end(GTK_BOX(hbox_row1), check_trained,
false,
false, 0);
342 table_bands = gtk_table_new(2,2,
true);
343 gtk_table_set_row_spacings(GTK_TABLE(table_bands),4);
344 gtk_table_set_col_spacings(GTK_TABLE(table_bands),4);
346 gtk_table_attach_defaults(GTK_TABLE(table_bands),
347 gtk_label_new(
"Lower (Hz)"),
350 gtk_table_attach_defaults(GTK_TABLE(table_bands),
351 gtk_label_new(
"Upper (Hz)"),
354 gtk_box_pack_start(GTK_BOX(gui_container),table_bands,
false,
false, 4);
361 gtk_widget_show_all(gui_container);
372 void PassBand::ChangeNumBands(
int force_bands)
378 new_bands = int(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_bands)));
380 new_bands = force_bands;
382 if(new_bands == num_bands)
385 gtk_widget_show_all(table_bands);
388 for(
int i=0;i<widget_rows.size();i++)
390 gtk_widget_hide(widget_rows[i].spin_low);
391 gtk_widget_hide(widget_rows[i].spin_high);
395 num_bands = new_bands;
398 if(num_bands > widget_rows.size())
399 gtk_table_resize(GTK_TABLE(table_bands),num_bands+1,2);
403 for(
int i=0;i<num_bands;i++)
407 if(i >= widget_rows.size())
411 temp.spin_low = gtk_spin_button_new_with_range(0,1000,1);
412 gtk_spin_button_set_value(GTK_SPIN_BUTTON(temp.spin_low),20);
413 g_signal_connect(G_OBJECT(temp.spin_low),
415 G_CALLBACK(CB_ChangeOptionsLow),
421 temp.spin_high = gtk_spin_button_new_with_range(1,1000,1);
422 gtk_spin_button_set_value(GTK_SPIN_BUTTON(temp.spin_high),30);
423 g_signal_connect(G_OBJECT(temp.spin_high),
425 G_CALLBACK(CB_ChangeOptionsHigh),
427 widget_rows.push_back(temp);
429 gtk_table_attach_defaults(GTK_TABLE(table_bands),
430 widget_rows[i].spin_low,
433 gtk_table_attach_defaults(GTK_TABLE(table_bands),
434 widget_rows[i].spin_high,
438 gtk_widget_show(widget_rows[i].spin_low);
439 gtk_widget_show(widget_rows[i].spin_high);
443 gtk_widget_show(widget_rows[i].spin_low);
444 gtk_widget_show(widget_rows[i].spin_high);
461 void PassBand::CB_ChangeNumBands(GtkWidget *spin, gpointer data)
463 ((PassBand*)data)->ChangeNumBands();
465 void PassBand::CB_ChangeGamma(GtkWidget *spin, gpointer data)
467 ((PassBand*)data)->gamma = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
469 void PassBand::CB_ChangeOptionsLow(GtkWidget *spin, gpointer data)
471 ((PassBand*)data)->ChangeOptions(0);
473 void PassBand::CB_ChangeOptionsHigh(GtkWidget *spin, gpointer data)
475 ((PassBand*)data)->ChangeOptions(2);
486 printf(
"Shared Library Says: Creating a Lag object.\n");