// samples should be u-law encoded void modem_decode(buffer_t *input, buffer_t *output) { static int phase = -1; int max_idx; size_t i; int16_t max_mag; int16_t samples[SAMPLES_PER_ITER]; for (i = 0; i < SAMPLES_PER_ITER; i++) { uint8_t byte; buffer_read_bytes(input, &byte, 1); samples[i] = comp_decode(byte) * 4; } // apply band-pass filter to remove noise bandpass_filter(samples); // apply convolution with delay line convolution(samples); // apply low-pass filter to remove high-frequency artifacts lowpass_filter(samples); // try and find the middle of the phase if (phase == -1) { max_mag = 0; max_idx = 0; for (i = 0; i < SAMPLES_PER_ITER; i++) { if (samples[i] > max_mag) { max_mag = samples[i]; max_idx = i; } else if (-samples[i] > max_mag) { max_mag = -samples[i]; max_idx = i; } } phase = (max_idx) % (SAMPLES_PER_BIT / 2); } // sample at baudrate to get output for (i = phase; i < SAMPLES_PER_ITER; i += SAMPLES_PER_BIT) { int avg = 0; int j; for (j = 0; j < SAMPLES_PER_BIT / 4; j++) avg += samples[i + j]; //< 0 ? -1 : 1; avg /= SAMPLES_PER_BIT / 4; int bit = avg < 0 ? 1 : 0; buffer_write_bit(output, bit); } }
int main(int argc,char *argv[]) { QCoreApplication app(argc,argv); //important for qApp->applicationDirPath() in processtracker // test_armadillo(); // test_pca_2(); // return 0; CLParams CLP; QStringList required; CLP=get_command_line_params(argc,argv,required); ProcessTracker PT; register_processors(PT); if (CLP.unnamed_parameters.count()>1) { printf("Only one command parameter may be specified.\n"); return -1; } QString command=CLP.unnamed_parameters.value(0); if (command.isEmpty()) { printf("\nmountainsort processors:\n"); for (int i=0; i<PT.processorCount(); i++) { QString cmd=PT.processor(i).command; printf("%s ",cmd.toLatin1().data()); } printf("\n\n"); return -1; } PTProcessor PP=PT.findProcessor(command); printf("%s version %s\n",PP.command.toLatin1().data(),PP.version.toLatin1().data()); if (!CLP.named_parameters.value("force").toInt()) { if (PT.processAlreadyCompleted(CLP)) { printf("Process already completed.\n"); return 0; } } CLP.named_parameters.remove("force"); QTime timer; timer.start(); if (command=="extract") { QString input_path=CLP.named_parameters["input"]; QString output_path=CLP.named_parameters["output"]; int num_channels=CLP.named_parameters["num_channels"].toInt(); long t1=CLP.named_parameters["t1"].toLong(); long t2=CLP.named_parameters["t2"].toLong(); QStringList channels_str=CLP.named_parameters["channels"].split(","); int M=channels_str.count(); int channels[M]; for (int m=0; m<M; m++) channels[m]=channels_str[m].toInt(); if ((input_path.isEmpty())||(output_path.isEmpty())) {extract_usage(); return -1;} if (M==0) {extract_usage(); return -1;} if (!extract(input_path.toLatin1().data(),output_path.toLatin1().data(),num_channels,M,channels,t1,t2)) { printf("Error in extract.\n"); return -1; } } else if (command=="bandpass_filter") { QString input_path=CLP.named_parameters["input"]; QString output_path=CLP.named_parameters["output"]; double samplefreq=CLP.named_parameters["samplefreq"].toDouble(); double freq_min=CLP.named_parameters["freq_min"].toDouble(); double freq_max=CLP.named_parameters["freq_max"].toDouble(); double outlier_threshold=CLP.named_parameters["outlier_threshold"].toDouble(); if ((input_path.isEmpty())||(output_path.isEmpty())) {bandpass_filter_usage(); return -1;} if ((samplefreq==0)||(freq_min==0)||(freq_max==0)) {bandpass_filter_usage(); return -1;} if (!bandpass_filter(input_path.toLatin1().data(),output_path.toLatin1().data(),samplefreq,freq_min,freq_max,outlier_threshold)) { printf("Error in bandpass_filter.\n"); return -1; } } else if (command=="normalize_channels") { QString input_path=CLP.named_parameters["input"]; QString output_path=CLP.named_parameters["output"]; if ((input_path.isEmpty())||(output_path.isEmpty())) {normalize_channels_usage(); return -1;} if (!normalize_channels(input_path.toLatin1().data(),output_path.toLatin1().data())) { printf("Error in normalize_channels.\n"); return -1; } } else if (command=="whiten") { QString input_path=CLP.named_parameters["input"]; QString output_path=CLP.named_parameters["output"]; int ncomp=CLP.named_parameters["ncomp"].toInt(); if ((input_path.isEmpty())||(output_path.isEmpty())) {whiten_usage(); return -1;} if (ncomp==0) {whiten_usage(); return -1;} if (!whiten(input_path.toLatin1().data(),output_path.toLatin1().data(),ncomp)) { printf("Error in whiten.\n"); return -1; } } else if (command=="detect") { QString input_path=CLP.named_parameters["input"]; QString output_path=CLP.named_parameters["output"]; int inner_window_width=CLP.named_parameters["inner_window_width"].toInt(); int outer_window_width=CLP.named_parameters["outer_window_width"].toInt(); float threshold=CLP.named_parameters["threshold"].toFloat(); if ((input_path.isEmpty())||(output_path.isEmpty())) {detect_usage(); return -1;} if (inner_window_width==0) {detect_usage(); return -1;} if (outer_window_width==0) {detect_usage(); return -1;} if (threshold==0) {detect_usage(); return -1;} if (!detect(input_path.toLatin1().data(),output_path.toLatin1().data(),inner_window_width,outer_window_width,threshold)) { printf("Error in detect.\n"); return -1; } } else if (command=="features") { QString input_path=CLP.named_parameters["input"]; QString detect_path=CLP.named_parameters["detect"]; QString adjacency_path=CLP.named_parameters["adjacency"]; QString output_path=CLP.named_parameters["output"]; int num_features=CLP.named_parameters["num_features"].toInt(); int clip_size=CLP.named_parameters["clip_size"].toInt(); if ((input_path.isEmpty())||(detect_path.isEmpty())||(adjacency_path.isEmpty())||(output_path.isEmpty())) {features_usage(); return -1;} if (num_features==0) {features_usage(); return -1;} if (clip_size==0) {features_usage(); return -1;} if (!features(input_path.toLatin1().data(),detect_path.toLatin1().data(),adjacency_path.toLatin1().data(),output_path.toLatin1().data(),num_features,clip_size)) { printf("Error in features.\n"); return -1; } } else if (command=="cluster") { QString input_path=CLP.named_parameters["input"]; QString output_path=CLP.named_parameters["output"]; if ((input_path.isEmpty())||(output_path.isEmpty())) {cluster_usage(); return -1;} if (!cluster(input_path.toLatin1().data(),output_path.toLatin1().data())) { printf("Error in cluster.\n"); return -1; } } else if (command=="split_clusters") { QString input_path=CLP.named_parameters["input"]; QString cluster_path=CLP.named_parameters["cluster"]; QString output_path=CLP.named_parameters["output"]; int num_features=CLP.named_parameters["num_features"].toInt(); int clip_size=CLP.named_parameters["clip_size"].toInt(); if ((input_path.isEmpty())||(cluster_path.isEmpty())||(output_path.isEmpty())) {cluster_usage(); return -1;} if (num_features==0) {cluster_usage(); return -1;} if (clip_size==0) {cluster_usage(); return -1;} if (!split_clusters(input_path.toLatin1().data(),cluster_path.toLatin1().data(),output_path.toLatin1().data(),num_features,clip_size)) { printf("Error in cluster.\n"); return -1; } } else if (command=="templates") { QString input_path=CLP.named_parameters["input"]; QString cluster_path=CLP.named_parameters["cluster"]; QString output_path=CLP.named_parameters["output"]; int clip_size=CLP.named_parameters["clip_size"].toInt(); if ((input_path.isEmpty())||(output_path.isEmpty())) {templates_usage(); return -1;} if (clip_size==0) {templates_usage(); return -1;} if (!templates(input_path.toLatin1().data(),cluster_path.toLatin1().data(),output_path.toLatin1().data(),clip_size)) { printf("Error in templates.\n"); return -1; } } else if (command=="consolidate") { QString cluster_path=CLP.named_parameters["cluster"]; QString templates_path=CLP.named_parameters["templates"]; QString cluster_out_path=CLP.named_parameters["cluster_out"]; QString templates_out_path=CLP.named_parameters["templates_out"]; QString load_channels_out_path=CLP.named_parameters["load_channels_out"]; if ((cluster_path.isEmpty())||(templates_path.isEmpty())) {consolidate_usage(); return -1;} if ((cluster_out_path.isEmpty())||(templates_out_path.isEmpty())) {consolidate_usage(); return -1;} if (load_channels_out_path.isEmpty()) {consolidate_usage(); return -1;} if (!consolidate(cluster_path.toLatin1().data(),templates_path.toLatin1().data(),cluster_out_path.toLatin1().data(),templates_out_path.toLatin1().data(),load_channels_out_path.toLatin1().data())) { printf("Error in consolidate.\n"); return -1; } } else if (command=="fit") { QString input_path=CLP.named_parameters["input"]; QString cluster_path=CLP.named_parameters["cluster"]; QString templates_path=CLP.named_parameters["templates"]; QString cluster_out_path=CLP.named_parameters["cluster_out"]; if ((input_path.isEmpty())||(cluster_path.isEmpty())||(templates_path.isEmpty())) {fit_usage(); return -1;} if ((cluster_out_path.isEmpty())) {fit_usage(); return -1;} if (!fit(input_path.toLatin1().data(),templates_path.toLatin1().data(),cluster_path.toLatin1().data(),cluster_out_path.toLatin1().data())) { printf("Error in fit.\n"); return -1; } } else if (command=="extract_clips") { QString input_path=CLP.named_parameters["input"]; QString cluster_path=CLP.named_parameters["cluster"]; QString output_path=CLP.named_parameters["output"]; QString index_out_path=CLP.named_parameters["index_out"]; int clip_size=CLP.named_parameters["clip_size"].toInt(); if ((input_path.isEmpty())||(cluster_path.isEmpty())) {extract_usage(); return -1;} if ((output_path.isEmpty())||(index_out_path.isEmpty())) {extract_usage(); return -1;} if (!extract_clips(input_path.toLatin1().data(),cluster_path.toLatin1().data(),output_path.toLatin1().data(),index_out_path.toLatin1().data(),clip_size)) { printf("Error in extract_clips.\n"); return -1; } } else { printf("Unknown command: %s\n",command.toLatin1().data()); return -1; } PT.reportProcessCompleted(CLP); printf("Elapsed time for %s: %.2f seconds\n",command.toLatin1().data(),timer.elapsed()*1.0/1000); return 0; }