示例#1
0
fextract_t *fextract_pitch_energy_create(int frame_len, char *m_e_params) {
	fextract_t *fex;
	dsp_fextract_t *mfcc;

	fex = (fextract_t *) rs_malloc(sizeof(fextract_t),"emotion feature extraction data");
  
	fex->n_features = V2_N_FEATURES;

  
	/* Abtastrate etc. ... */
	fex->samplerate = SAMPLERATE;
	fex->frame_len = frame_len; /* global frame length (in frames) */
  
	fex->pitch = pitch_create(AC_GAUSS);
    
	fex->frame_shift = fex->frame_len - ((fex->pitch->method == AC_GAUSS? 2 : 1 ) * fex->pitch->periodsPerWindow / fex->pitch->minimumPitch - fex->pitch->dt) * fex->samplerate ; /* global shift (in frames) */
  

	fex->hnr = NULL;
  
	fex->vq = NULL;
  
	/* MFCCs ... */
	mfcc = (dsp_fextract_t *) rs_malloc(sizeof(dsp_fextract_t), "feature extraction data");
	mfcc->type = dsp_fextype_MFCC;
	mfcc->version = DSP_MK_VERSION(1, 4);
	if (!dsp_mfcc_create(mfcc, m_e_params)) {
		rs_free(mfcc);
		mfcc = NULL;
		rs_warning("Could not initialize MFCC configuration!");
	}
	fex->mfcc=mfcc;
  
	return(fex);
}
示例#2
0
svm_classifier_t *svm_update_classifier(svm_classifier_t *svm, int class_ind, mx_real_t *features) {
    int i, j, cur;
    struct svm_problem *prob = &(svm->problem);

	if (svm->finished)
		rs_warning("SVM classifier is being updated after training!");

    cur=prob->l++;
    if (prob->l > svm->max_instances) {
		svm->max_instances += MAX_INSTANCES;
		prob->x = (struct svm_node **) rs_realloc(prob->x,sizeof(struct svm_node *)*svm->max_instances,"SVM list of instances");
		prob->y = (double *) rs_realloc(prob->y,sizeof(double)*svm->max_instances,"SVM number of instances");
    }

	prob->y[cur] = (mx_real_t) class_ind;
    prob->x[cur]= (struct svm_node *) rs_malloc(sizeof(struct svm_node)*(svm->feature_dim+1),"SVM instance");
    for (i=0,j=0;i<svm->feature_dim;i++) {
		if (features[i]) {
			prob->x[cur][j].index=i+1;
			prob->x[cur][j++].value=features[i];
		}
    }
    prob->x[cur][j].index=-1;

    return svm;
}
示例#3
0
int _asegment_fixed(char *seg_info, dsp_sample_t *signal, int n_samples, dsp_sample_t ***signal_segment, int **length) {
	int i, frame_length, frame_shift;
	int n_segments =0;
	int *_length;
	dsp_sample_t **_segments;
	
	if (sscanf(seg_info,"%d:%d",&frame_length,&frame_shift) != 2) {
		rs_error("Frame length and/or frame shift information in wrong format!");
		return -1;
	}
	n_segments= (n_samples - frame_length) / frame_shift + 1;

	_segments = (dsp_sample_t **) rs_malloc(n_segments * sizeof(dsp_sample_t *),"Signal segments");
	_length = (int *) rs_malloc(n_segments*sizeof(int),"Segment lengths");

	for (i=0;i<n_segments;i++) {
		_segments[i] = (dsp_sample_t *) rs_malloc(frame_length * sizeof(dsp_sample_t),"signal segments"); 
		_length[i]=frame_length;
	
		if (!memcpy(_segments[i],signal+i*frame_shift,frame_length*sizeof(dsp_sample_t))) {
			rs_warning("Signal was shorter than expected!");
			return -1;
		}
	}

	*signal_segment=_segments;
	*length=_length;
	return n_segments;
}
示例#4
0
文件: ev_io.c 项目: hcmlab/mobileSSI
char *rs_line_read(FILE *fp, char comment_char)
	{
	static char *line = NULL;

	char *cp;
	int len, i;

	/* evtl. Zeilenpuffer erzeugen ... */
	if (line == NULL)
		line = rs_malloc(_line_len * sizeof(char), "line buffer");

	/* ... und solange noch Zeilen gelesen werden koennen ... */
	while (fgets(line, _line_len, fp) != NULL) {
		/* ... ggf. '\n' am Zeilenende loeschen ... */
		while (line[(len = strlen(line)) - 1] != '\n') {
			/* ... bei Pufferueberlauf ggf. erweitern ... */
			rs_warning("line longer than %d characters read - expanding!",
				_line_len);

			/* ... falls ueberlange TEXT-Zeile ... */
			for (i = 0; i < len; i++)
				if (!(isprint(line[i]) || isspace(line[i])))
					rs_error("non-printable character '0x%02x' encountered in excess text line!", line[i]);

			_line_len += RS_LINE_LEN_DEFAULT;
			line = rs_realloc(line, _line_len * sizeof(char),
					"extended line buffer");

			if (fgets(line + len, _line_len - len, fp) == NULL) {
				len++;
				break;
				}
			}
		line[len - 1] = '\0';

		/* ... ggf. Kommentare ueberspringen ... */
		if (comment_char && line[0] == comment_char)
			continue;

		/* ... und am Zeilenende loeschen falls nicht "escaped" ... */
		if (comment_char) {
			cp = line + 1;
			while (cp = strrchr(cp, comment_char)) {
				if (cp[-1] != '\\') {
					*cp = '\0';
					break;
					}
				}
			}

		/* ... und Zeilen mit Inhalt zurueckgeben */
		for (cp = line; *cp; cp++)
			if (!isspace(*cp))
				return(line);
		}

	/* ... sonst Dateiende signalisieren */
	return(NULL);
	}
示例#5
0
naive_bayes_classifier_t *nB_fscan(naive_bayes_classifier_t *nB, char *filename, fx_select_t *sel) { 
	int class_ind, start, end, i;
    FILE *fp = NULL, *feature_fp = NULL;
    mx_real_t *features=NULL;
    char *line=NULL, *token;
    char *fname =NULL;
    char *class_name = (char *) rs_malloc(STRING_LENGTH*sizeof(char),"String");
    int full_feature_dim=sel?sel->n_features:nB->feature_dim;

    if (!nB)
		rs_error("classifier could not be initialised!");
     
	fp = fopen(filename,"r");
    if (fp == NULL) {
		rs_error("Cannot open file %s!",filename);
    }
    else {
		features = (mx_real_t *) rs_calloc(full_feature_dim, sizeof(mx_real_t), "feature vector");
	 
	 	while ((line= (char *) rs_line_read(fp,';'))) {
	    	fname = (char *) strtok(line,"\t ");
	     	feature_fp = fopen(fname, "r");
	     	if (feature_fp == NULL) {
		 		rs_warning("can't open '%s '!", fname);
		 		while (getchar() != '\n');
		 			continue;
	     	}
	     	line+= strlen(fname)+1;

		    if (feature_fp) {
				for (token = (char *) strtok(line," "); token != NULL; token = (char *) strtok(NULL, " ")) {
		     		if (sscanf(token,"%[^[]s",class_name) !=1 ) 
						rs_error("wrong length information for file %s!",fname);
		     		token += strlen(class_name);
		     		if (sscanf(token,"[%d..%d]",&start,&end) !=2)
			 			rs_error("wrong length information for file %s!",fname);
		     		for (i=start;i<=end;i++) {
			 			if (fread(features,sizeof(mx_real_t),full_feature_dim,feature_fp)!=full_feature_dim)
			     			rs_perror("fread stopped after %d elements in file %s -- %d", i, fname, errno);
			 			else {
							if (sel) 
							    if ( fx_select_apply(&features,sel,features)!= sel->n_features)
									rs_error("Feature selection did not succeed!");
							class_ind = cl_name2number(&(nB->mapping),class_name,nB->n_classes);
							nB=nB_update_classifier(nB,class_ind,features);
			 			}
		     		}
				}
				fclose(feature_fp);
	     	}
		}
		nB_finish_classifier(nB);
	}
    fclose(fp);
    rs_free(class_name);
    rs_free(features);
    
    return nB;
}
示例#6
0
文件: ev_io.c 项目: hcmlab/mobileSSI
rs_IO *rs_fopen(char *name, char *mode)
	{
	FILE *fp;
	rs_IO *io;
	int mode_read, mode_mapped;
	void *buf;
	int buf_size;

	/* Lese-/Schreibmodus bestimmen ... */
	if (strchr(mode, 'w') || strchr(mode, 'a'))
		mode_read = 0;
	else if (strchr(mode, 'r'))
		mode_read = 1;
	else	rs_error("illegal mode '%s' for 'rs_fopen()'!", mode);

	/* ... ggf. ge-"mapped" (nur lesend) ... */
	if (strchr(mode, 'm')) {
		if (mode_read)
			mode_mapped = 1;
		else	{
			mode_mapped = 0;
			rs_warning("mapped file IO not supported for writing!");
			}
		}
	else	mode_mapped = 0;

	/* ... Spezialnamen '-' umsetzen ... */
	if (strcmp(name, "-") == 0) {
		if (mode_mapped)
			rs_error("mapped file IO not supported for stdin/out!");

		fp = (mode_read) ? stdin : stdout;
		}
	else	fp = fopen(name, (mode_read) ? "r" : "w");
	if (!fp)
		return(NULL);
	
	if (!mode_mapped) {
		io = rs_malloc(sizeof(rs_IO), "IO data");
		io->type = rs_iotype_file;
		io->base_size = RS_BINIO_BASE_SIZE_DEFAULT;
		io->fp = fp;
		}
	else	{
		fseek(fp, 0, SEEK_END);
		buf_size = ftell(fp);
		rewind(fp);

		buf = rs_malloc(buf_size, "mapped file buffer");
		fread(buf, buf_size, 1, fp);

		io = rs_mopen(buf, buf_size, "r");
		}

	return(io);
	}
示例#7
0
svm_classifier_t *svm_finish_classifier(svm_classifier_t *svm) {
    int i, j, nr_fold=5, total_correct, best_correct=0, best_c=svm->param.C, best_g=svm->param.gamma;
    const char *error_msg;
    double *result = (double *) rs_malloc(sizeof(double)*svm->problem.l,"cross validation result");

    rs_msg("Building SVM classifier...");

    if (svm->finished)
	rs_warning("SVM classifier is already trained!");

    error_msg = svm_check_parameter(&(svm->problem),&(svm->param));
    
    if(error_msg) 
	rs_error("%s",error_msg);
    
    /* Skalierung */
    _create_scaling(svm->problem,svm->feature_dim,&(svm->max),&(svm->min));
    
    for (i=0;i<svm->problem.l;i++) 
	_scale_instance(&(svm->problem.x[i]),svm->feature_dim,svm->max,svm->min);
    
    /* Cross-Validation, um C und G zu bestimmen bei RBF-Kernel */
    if (svm->param.kernel_type == RBF) {
	svm->param.probability = 0;
	for (i=0;i<C_G_ITER;i++) {
	    total_correct=0;
	    svm->param.C=pow(2,C[i]);
	    svm->param.gamma=pow(2,G[i]);
	    svm_cross_validation(&(svm->problem),&(svm->param),nr_fold,result);
	    for(j=0;j<svm->problem.l;j++) {
		if(result[j] == svm->problem.y[j])
		    ++total_correct;
	    }
	    if (total_correct > best_correct) {
		best_correct=total_correct;
		best_c=C[i];
		best_g=G[i];
	    }
	    rs_msg("C-G-Selektion-Iteration # %d: tried c=%g and g=%g => CV rate is %g; current best c=%g and g=%g with CV rate %g",i+1,pow(2,C[i]),pow(2,G[i]),total_correct*100.0/svm->problem.l,pow(2,best_c),pow(2,best_g),best_correct*100.0/svm->problem.l);
	}
	
	/* Training */
	svm->param.C=pow(2,best_c);
	svm->param.gamma=pow(2,best_g);
	svm->param.probability = 1;
    }
    
    svm->model=svm_train(&(svm->problem),&(svm->param));
    svm->finished=1;

	// @begin_add_johannes
	rs_free (result);
	// @end_add_johannes

    return svm;
}
示例#8
0
naive_bayes_classifier_t *nB_finish_classifier(naive_bayes_classifier_t *nB) {

    int i,j;
    
    if (!nB->finished) {
	for (j=0;j<nB->n_classes;j++) {
	    if (nB->n_instances[j] <1) 
		rs_warning("creating model for unseen class %s!",nB->mapping[j]);
	    for (i=0;i<nB->feature_dim;i++) {
		if (nB->n_instances[j] <1) {
		    nB->means[j][i] = 0;
		    nB->std_dev[j][i] = 0;
		}
		else {
		    nB->means[j][i]/=(1.0*nB->n_instances[j]);
			// @begin_change_johannes
		    //if (isnan(nB->means[j][i]))
			if (_isnan(nB->means[j][i]))
			// @end_change_johannes
			nB->means[j][i]=0;
		    nB->std_dev[j][i]= sqrt(nB->std_dev[j][i]/(1.0*nB->n_instances[j]) - nB->means[j][i] * nB->means[j][i]);
			// @begin_change_johannes
		    //if (isnan(nB->std_dev[j][i]))
			if (_isnan(nB->std_dev[j][i]))
			// @end_change_johannes
			nB->std_dev[j][i]=0;
		}
	    }

	    if (nB->n_instances[nB->n_classes] <1)
		nB->class_probs[j] = 0;
	    else
		nB->class_probs[j] = 1.0*nB->n_instances[j]/nB->n_instances[nB->n_classes];
	}
	nB->finished=1;
    }
    else
	rs_warning("Trying to finish finished classifier!");

    return nB;
}
示例#9
0
int emo_afile_segment(char *file, asegmentation_method_t *method, asegmentation_type_t type, dsp_sample_t ***signal_segment, int **segment_length) {
	int size=SEGMENT_LENGTH, n_samples=0, n_segments, samples_read;
	FILE *fp;
	dsp_sample_t *signal=NULL;
	dsp_vad_t *Vad;

	signal = (dsp_sample_t *) rs_malloc(sizeof(dsp_sample_t) * size, "Signal data");
	if (!method)
		method = (asegmentation_method_t *) rs_malloc(sizeof(asegmentation_method_t),"Audio segmentation method");

	if (strcmp(file,"-")==0)
		fp = stdin;
	else 
		fp = fopen(file,"r");
	if (!fp) {
		rs_warning("Cannot open file %s!",file);
		return -1;
	}

	while ((samples_read =fread(signal+n_samples,sizeof(dsp_sample_t),BLOCKSIZE,fp)) && samples_read >0) {
		n_samples+=samples_read;
		if (size <= n_samples) {
			size +=SEGMENT_LENGTH;
			signal = (dsp_sample_t *) rs_realloc(signal,sizeof(dsp_sample_t) * size, "Signal data");
		}
		if (samples_read != BLOCKSIZE)
			break;
	}
	fclose(fp);


	if (type == vad && !method->vad) {
		Vad  = dsp_vad_create(DSP_MK_VERSION(1,0),VAD_FRAME_LEN);
		method->vad = Vad;
	}

	n_segments = emo_asegment(method,type,signal,n_samples,signal_segment,segment_length);
	if (n_segments == -1)
		rs_error("Aborting during procession of file %s!",file);

	rs_free(signal);

	return n_segments;
}
示例#10
0
/**
 * _vonMises_Iteration(result, lambda, A, startvec, threshold, maxiter, dim)
 *     eine komplette von Mises-Iteration auf der Matrix 'A' ['dim' x 'dim']
 *     ergibt den zum groessten Eigenwert 'lambda' gehoerenden Eigenvektor 
 *     'result' ['dim'] bei Vorgabe der Konvergenzschwelle 'threshold'
 **/
static int _vonMises_Iteration(mx_vector_t *result, mx_real_t *lambda, 
			       mx_matrix_t A, mx_vector_t startvec,
			       mx_real_t threshold, int maxiter, int dim)
	{
 	int iter = 0, i;
	mx_real_t dist, _dist;
	mx_vector_t oldvec = mx_vector_create(dim);

	for (i = 0; i < dim; i++)
		oldvec[i] = startvec[i];

	do {
		dist = _dist = 0.00;
		if (_vonMises_Step(result, lambda, A, oldvec, dim) <= 0) {
			dist = MX_REAL_MAX;
			break;
		}

		for (i = 0; i < dim; i++) {
			_dist = fabs((*result)[i]) - fabs(oldvec[i]);
			dist +=  _dist * _dist;
		}
		dist = sqrt(dist);

		for (i = 0; i < dim; i++) {
			oldvec[i] = (*result)[i];
		}
		
		if (dist < threshold) 
			break;
	} while (iter++ < maxiter);

	if (dist > threshold) {
		rs_warning("Abort in vonMises-Iteration (%f)", dist);
		mx_vector_destroy(oldvec);
		return(0);
		}

	mx_vector_destroy(oldvec);
	return(1);
	}
示例#11
0
int _asegment_vad(dsp_vad_t *vad, dsp_sample_t *signal, int n_samples, dsp_sample_t ***signal_segment, int **length) {
	int va=0, i, out_sample;
	int n_segments =0, last_va=0, samples=0;
	int max_segments=MAX_SEGMENTS, segment_length = SEGMENT_LENGTH;
	int delay_len=vad->sigbuf->length;
	int *_length;
	dsp_sample_t *voice;
	dsp_sample_t **_segments;
	int temp=0;
	dsp_sample_t *_signal;

	_signal = (dsp_sample_t *) rs_malloc(n_samples*sizeof(dsp_sample_t),"signal copy");
	for (i=0;i<n_samples;i++)
		_signal[i]=signal[i];

	if (!vad) {
		rs_warning("No voice activity detection info available!");
		return -1;
	}
	voice = (dsp_sample_t *) rs_malloc(vad->frame_len * sizeof(dsp_sample_t),"Voice frame");

	_segments = (dsp_sample_t **) rs_malloc(max_segments * sizeof(dsp_sample_t *),"Signal segments");
	_length = (int *) rs_malloc(max_segments * sizeof(int),"Segment lengths");
    
	for (i=0;i<=n_samples-VAD_FRAME_SHIFT || va >=0;i+=VAD_FRAME_SHIFT) {
		if (i > n_samples-VAD_FRAME_SHIFT) {
			va = dsp_vad_calc(voice,vad,NULL);
		}
		else {
			if (i>n_samples-vad->frame_len) {
				int j, new_len=i+vad->frame_len;
				_signal= (dsp_sample_t *) rs_realloc(_signal,new_len*sizeof(dsp_sample_t),"Signal buffer");
				for (j=n_samples;j<new_len;j++)
					_signal[j]=0;
			}
			va = dsp_vad_calc(voice, vad, _signal+i);
		}
		if (va >=0 && ((va && !last_va) || (!va && last_va)) && samples >0) {
			out_sample=i-(delay_len-vad->sigbuf->need_elems)*160;
			if (out_sample>=n_samples)
				out_sample=n_samples-1;
			if (va) {
				if (n_segments >= max_segments) {
					max_segments += MAX_SEGMENTS;
					_segments = (dsp_sample_t **) rs_realloc(_segments,max_segments * sizeof(dsp_sample_t *),"Signal segments");
					_length = (int *) rs_realloc(_length,max_segments * sizeof(int),"Segment lengths");
				}
				_segments[n_segments] = (dsp_sample_t *) rs_malloc(segment_length * sizeof(dsp_sample_t),"Signal segment");
				if (output)
					fprintf(stderr,"[%d..",out_sample);
			}
			else {
				if (output)
					fprintf(stderr,"%d] ",out_sample-1);
				_length[n_segments]=last_va*VAD_FRAME_SHIFT;
				n_segments++;
				segment_length=SEGMENT_LENGTH;
			}
		}


		if (!va) 
			last_va=0;
	
		if (va==1 && samples>0) {
			if ((last_va+1)*VAD_FRAME_SHIFT > segment_length) {
				segment_length += SEGMENT_LENGTH;
				_segments[n_segments] = (dsp_sample_t *) rs_realloc(_segments[n_segments],segment_length * sizeof(dsp_sample_t),"Signal segment");
			}
			samples+=VAD_FRAME_SHIFT;
			memcpy(_segments[n_segments]+last_va*VAD_FRAME_SHIFT,voice,VAD_FRAME_SHIFT*sizeof(dsp_sample_t));
			last_va++;
		}
	
		temp=0;
		while (va==0) {
			temp++;
			samples+=VAD_FRAME_SHIFT;
			va = dsp_vad_calc(voice, vad, NULL);
		}
	}

	if (last_va && samples >0) {
		out_sample=i-(delay_len-vad->sigbuf->need_elems)*160;
		if (out_sample>=n_samples)
			out_sample=n_samples;
		if (output)
			fprintf(stderr,"%d] ",out_sample-1);
		_length[n_segments]=last_va*VAD_FRAME_SHIFT;
		n_segments++;
	}
	if (output)
		fprintf(stderr,";\n");
    
	rs_free(voice);
	rs_free(_signal);
	*signal_segment=_segments;
	*length=_length;
	return n_segments;
}
示例#12
0
/*
 * Check/fix OS header fields and data.
 *
 * The OS header is much simpler than an application header, and its
 * correctness is not as crucial to validation.  The most important
 * parts of the OS header are the key ID and (for newer calculators)
 * the hardware compatibility level.  There is no date stamp required.
 * The page count is not required, and if present, is used only to
 * display the transfer percentage (when using the 84+ boot code.)
 *
 * TI only sets the OS and program image size fields in their TI-73 OS
 * headers.  (Bizarrely, they are set in the true OS header, but not
 * in the fake OS header that is transferred to page 1A.  Furthermore,
 * the OS size field is incorrect.)  In any case, these fields appear
 * to be ignored by all versions of the boot code.
 */
int rs_repair_ti8x_os(RSProgram* os,      /* OS */
		      unsigned int flags) /* flags */
{
  unsigned long hdrstart, hdrsize, fieldhead, fieldstart,
    fieldsize, ossize;
  unsigned char* hdr;
  int i;

  /* Pad the OS to a multiple of 16384.  (While strictly speaking we
     could get away with only padding each page to a multiple of 256,
     such "partial OSes" are not supported by most linking
     software.) */

  rs_program_set_length(os, ((os->length + 0x3fff) & ~0x3fff));

  /* If no OS header was provided in the input, try to get a header
     from page 1A instead */

  if (os->header_length < 6
      || os->header[0] != 0x80
      || os->header[1] != 0x0f) {
    for (i = 0; i < os->npagenums; i++) {
      if (os->pagenums[i] == 0x1a) {
	rs_free(os->header);
	if (!(os->header = rs_malloc(256)))
	  return RS_ERR_OUT_OF_MEMORY;
	memcpy(os->header, os->data + ((unsigned long) i << 14), 256);
	os->header_length = 256;
	break;
      }
    }
  }

  /* Clear old header/signature (not done on the TI-73 because
     official TI-73 OSes contain a fake header; I don't recommend
     doing this for third-party OSes) */

  if (os->calctype != RS_CALC_TI73)
    for (i = 0; i < os->npagenums; i++)
      if (os->pagenums[i] == 0x1a)
	memset(os->data + ((unsigned long) i << 14), 0xff, 512);

  /* Fix header size.  OS headers must always begin with an 800x field
     and end with an 807x field (TI always uses 800F and 807F, as for
     apps; I'm not sure whether it's required.) */

  if (os->header_length < 6
      || os->header[0] != 0x80
      || (os->header[1] & 0xf0) != 0) {
    rs_error(NULL, os, "no OS header found");
    return RS_ERR_MISSING_HEADER;
  }

  rs_get_field_size(os->header, &hdrstart, NULL);
  hdr = os->header + hdrstart;
  hdrsize = os->header_length - hdrstart;

  if (rs_find_app_field(0x8070, hdr, hdrsize,
			&fieldhead, &fieldstart, &fieldsize)) {
    rs_error(NULL, os, "OS header has no program image field");
    return RS_ERR_MISSING_PROGRAM_IMAGE;
  }

  hdrsize = fieldstart;
  os->header_length = hdrstart + hdrsize;

  if ((os->header_length % 64) == 55) {
    if (flags & RS_IGNORE_ALL_WARNINGS) {
      rs_warning(NULL, os, "OS header has length 55 mod 64");
      rs_warning(NULL, os, "(this will fail to validate on TI-83+ BE)");
    }
    else {
      rs_error(NULL, os, "OS header has length 55 mod 64");
      rs_error(NULL, os, "(this will fail to validate on TI-83+ BE)");
      return RS_ERR_INVALID_PROGRAM_SIZE;
    }
  }

  /* Fix OS / OS image sizes if requested */

  if (flags & RS_FIX_OS_SIZE) {
    ossize = os->length + hdrsize;
    if (rs_set_field_size(os->header, ossize)) {
      rs_error(NULL, os, "cannot set OS length");
      return RS_ERR_FIELD_TOO_SMALL;
    }

    if (rs_set_field_size(hdr + fieldhead, os->length)) {
      rs_error(NULL, os, "cannot set OS image length");
      return RS_ERR_FIELD_TOO_SMALL;
    }
  }

  /* Check for key ID */

  if (rs_find_app_field(0x8010, hdr, hdrsize, NULL, NULL, NULL)) {
    if (flags & RS_IGNORE_ALL_WARNINGS) 
      rs_warning(NULL, os, "OS header has no key ID field");
    else {
      rs_error(NULL, os, "OS header has no key ID field");
      return RS_ERR_MISSING_KEY_ID;
    }
  }

  /* Check/fix page count */

  if (rs_find_app_field(0x8080, hdr, hdrsize,
			NULL, &fieldstart, &fieldsize)) {
    if (os->length != 14 * 0x4000L) {
      rs_warning(NULL, os, "OS header has no page count field");
    }
  }
  else if (fieldsize != 1) {
    rs_warning(NULL, os, "OS header has an invalid page count field");
  }
  else if (flags & RS_FIX_PAGE_COUNT) {
    hdr[fieldstart] = os->length >> 14;
  }
示例#13
0
/**
 * mx_matrix_eigenv_n(_ew, _ev, _a, dim, n)
 *      berechnet die ersten 'n' Eigenwrte bzw. -vektoren von '_a'
 *      und gibt diese in '_ew' bzw. '_ev' zurueck
 *      gibt die (auf 1 normierten) Eigenvektoren spaltenweise in 'ev' 
 *	zurueck, dabei Sortierung nach Eigenwerten
 **/
int mx_matrix_eigenv_n(mx_real_t **_ew, mx_matrix_t *_ev, mx_matrix_t _a, 
		       int dim, int n)
	{
	mx_real_t *ew;
	mx_matrix_t a, ev, __a, calcW;
	mx_vector_t startvec = mx_vector_create(dim);
	int i, j;
	int maxiter = MAXITER;
	mx_real_t threshold = VONMISES_THRESH;
	int n_ew = n;
	ew_sort_t *ew_sort = NULL;

	if (n_ew > dim) {
		rs_warning("# requested eigenvects (%d) larger than dim (%d), "
			   "bounding to %d",
			   n_ew, dim, dim);
		n_ew = dim;
		}

	/* ggf. Ergebnisvektor erzeugen */
	if(!*_ew)
		*_ew = mx_vector_create(n_ew);
	ew = *_ew;

	/* Rechenmatrix erzeugen */
	calcW = mx_matrix_create(dim, dim);

	a = _a;
	__a = mx_matrix_create(dim, dim);

	startvec[0] = 1;
	for (j = 1; j < dim; j++)
		startvec[j] = j;

	for (i = 0; i < n_ew; i++) {
		/* ... i-ter Eigenvektor ... */
		if(!_vonMises_Iteration(&(calcW[i]),
					&(ew[i]),
					a,
					startvec,
					threshold,
					maxiter,
					dim))
			break;

		/* ... Originalmatrix bzgl. i-tem Eigen{wert,vektor} 
		   deflatieren ... */
		_matrix_deflate(&__a,
				a,
				calcW[i],
				ew[i],
				dim);

		a = __a;
	}

	if (i < n_ew) {
		rs_warning("vonMises-Iteration aborted after %d eigenvals", i);
		n_ew = i;
	}

	/* ... cleanup ... */
	mx_matrix_destroy(__a, dim);
	mx_vector_destroy(startvec);

	/* ... Eigenvektoren normieren ... */
	for (i = 0; i < n_ew; i++)
		mx_vector_norm(&(calcW[i]), calcW[i], dim);

	/* ... spaltenweises return! ... */
	a = mx_matrix_dup(calcW, dim, dim);
	mx_matrix_transp(&calcW, a, dim, dim);
	
	/* ... sortieren ... */
	ew_sort = rs_malloc(dim*sizeof(ew_sort_t), "ew_sort");
	for(i = 0; i < n_ew; i++) {
		ew_sort[i].val = ew[i];
		ew_sort[i].org_pos = i;
	}
	qsort(ew_sort, n_ew, sizeof(ew_sort_t), _ew_sort_f);

	mx_matrix_destroy(a, dim);
	a = mx_matrix_dup(calcW, dim, dim);

	for (i = 0; i < dim; i++)
		for(j = 0; j < n_ew; j++)
			calcW[i][j] = a[i][ew_sort[j].org_pos];
	for(i = 0; i < n_ew; i++)
		ew[i] = ew_sort[i].val;

	mx_matrix_destroy(a, dim);
	free(ew_sort);

	/* ggf. Ergebnismatrix erzeugen */
	if(!*_ev) 
		*_ev = mx_matrix_create(dim, n_ew);
	ev = *_ev;

	for (i = 0; i < dim; i++)
		for (j = 0; j < n_ew; j++)
			ev[i][j] = calcW[i][j];

	mx_matrix_destroy(calcW, dim);

	return(n_ew);
	}
示例#14
0
/**
 * mx_matrix_eigenv(ew, ev, _a, dim)
 *	berechnet Eigenwerte 'ew' und Eigenvektoren 'ev' der 'dim' dimensionalen
 *	matrix '_a' (Jacoby-Rot)
 *      gibt die (auf 1 normierten) Eigenvektoren spaltenweise in 'ev' 
	zurueck, dabei Sortierung nach Eigenwerten
 **/
int mx_matrix_eigenv(mx_real_t **_ew, mx_matrix_t *_ev, mx_matrix_t _a, int dim)
	{
	int r,c,p,q,i,j;
	mx_real_t phi, *ew;
	mx_matrix_t a, ev;
	ew_sort_t *ew_sort = NULL;

	/* ggf. Ergebnismatrix erzeugen */
	if(!*_ev) 
		*_ev = mx_matrix_create(dim, dim);
	ev = *_ev;
	/* ggf. Ergebnisvektor erzeugen */
	if(!*_ew)
		*_ew = mx_vector_create(dim);
	ew = *_ew;
	a = mx_matrix_dup(_a, dim, dim);

	__mfill(ev,dim,r,c,(r == c) ? 1 : 0);

	for (p=1; p<dim-1; p++)
		for (q=p+1; q<dim; q++) { 
			if(a[p-1][p] == 0) {	    
				phi = (a[p-1][q] < 0) ? 
					M_PI_2 : ((a[p-1][q] == 0) ? 
						  0 : -M_PI_2);
				rs_warning("mx_matrix_eigenw(): zero value in "
					   "Jacobi-Rot, bounding phi to "
					   "default! (%f/%f/%f)\n", 
					a[p-1][p],
					a[p-1][q],
					phi);
			} else
				phi=atan(-a[p-1][q]/a[p-1][p]);
			_matrix_mrot(a,dim,p,q,phi);
			_matrix_mrotr(ev,dim,p,q,phi);
		}			
	while (_matrix_pivot(a,dim,&p,&q) > LOCAL_EPSILON) {
		/*       fprintf(stderr, "pivot: %d / %d\n", p ,q); */
		/* emergency break; atan is defined in [-Pi/2...Pi/2]
		   set phi manually */
		if(a[q][q] == a[p][p]) {
			phi = (a[p][q] < 0) ? 
				-M_PI_4 : ((a[p][q] == 0) ? 
					   0 : M_PI_4);
				rs_warning("mx_matrix_eigenw(): zero value in "
					   "Jacobi-Rot, bounding phi to "
					   "default! (%f/%f/%f/%f)\n", 
				a[p][q],
				a[q][q],
				a[p][p],
				phi);
		} else
			/* see Numerical Recipes 11.1.8 and cot->tan */
			phi=0.5*atan(2.0*a[p][q]/(a[q][q]-a[p][p]));
		_matrix_mrot(a,dim,p,q,phi);
		_matrix_mrotr(ev,dim,p,q,phi);
	}
	for(i=0;i<dim;i++)
		ew[i] = (fabs(a[i][i]) < LOCAL_EPSILON) ? 0.00 : (a[i][i]);

	/* sort ew/ev */
	ew_sort = rs_malloc(dim*sizeof(ew_sort_t), "ew_sort");
	for(i=0;i<dim;i++) {
		ew_sort[i].val = ew[i];
		ew_sort[i].org_pos = i;
	}
	qsort(ew_sort, dim, sizeof(ew_sort_t), _ew_sort_f);
	mx_matrix_destroy(a, dim);
	a = mx_matrix_dup(ev, dim, dim);
	for(i=0;i<dim;i++)
		for(j=0;j<dim;j++)
			ev[i][j] = a[i][ew_sort[j].org_pos];
	for(i=0;i<dim;i++)
		ew[i] = ew_sort[i].val;
	mx_matrix_destroy(a, dim);

	free(ew_sort);
	return(dim);
	}
示例#15
0
int _asegment_info(char *seg_info, dsp_sample_t *signal, int n_samples, dsp_sample_t ***signal_segment, int **length) {
	char delim;
	int stat=0, frame_length, start, end, i;
	int last=0, n_segments=0;
	int max_segments=MAX_SEGMENTS;
	int *_length;
	dsp_sample_t **_segments;
    
	_segments = (dsp_sample_t **) rs_malloc(max_segments * sizeof(dsp_sample_t *),"Signal segments");
	_length = (int *) rs_malloc(max_segments * sizeof(int),"Segment lengths");    
	if ((seg_info = strchr(seg_info,'[')))
		seg_info++;
    

	while (seg_info && (stat = sscanf(seg_info, "%d..%d%c", &start,&end,&delim)) == 3) {
		if (end +1 > n_samples) {
			rs_warning("Wrong segmentation info: Trying to read %d samples from an audio signal that is only %d samples long!",end,n_samples);
			return -1;
		}
		if (n_segments >= max_segments) {
			max_segments+=MAX_SEGMENTS;
			_segments = (dsp_sample_t**) rs_realloc(_segments,max_segments*sizeof(dsp_sample_t *),"Signal segments");
			_length = (int *) rs_realloc(_length,max_segments*sizeof(int),"Segment lengths");
		}
	    
		frame_length = end-start+1;
		if (last) {
			_segments[n_segments] = (dsp_sample_t *) rs_realloc(_segments[n_segments],(last+frame_length)*sizeof(dsp_sample_t),"signal segments");
			_length[n_segments]+=frame_length;
		}
		else {
			_segments[n_segments] = (dsp_sample_t *) rs_malloc(frame_length *sizeof(dsp_sample_t),"signal segments");
			_length[n_segments]=frame_length;
		}

		memcpy(_segments[n_segments]+last,signal+start,frame_length*sizeof(dsp_sample_t));
	
		switch (delim) {
			case '-': 
				last+=frame_length;
				if ((seg_info = strchr(seg_info,'-')))
					seg_info++;
				break;
			case ']':
				last=0;
				n_segments++;
				if ((seg_info = strchr(seg_info,'[')))
					seg_info++;
				break;
			default:
				rs_warning("Problem with segmentation information: wrong delimiter '%c'!",delim);
				rs_free(_length);
				for (i=0;i<n_segments;i++)
					rs_free(_segments[i]);
				rs_free(_segments);
				return -1;
		}
	}
    
	if (stat !=3) {
		rs_warning("Problem with segmentation information: %s!",seg_info);
		return -1;
	}
    
	*signal_segment=_segments;
	*length=_length;
	return n_segments;
}
示例#16
0
int _fextract_calc(fextract_t *fex, mx_real_t *features, dsp_sample_t *signal, char *pfile) {
	mx_real_t *pitch=NULL, *hnr=NULL;
	mx_real_t **_mfcc_series, **_energy_series;
	mx_real_t overall_max=0, overall_max_ind=0;
	int nframes=0, i, j, n_voiced_frames, max;
	int last_max=0, last_min=0, ser=0, max_sum=0, en_mean=0, fcount=0;
	fextract_series_t * serie=NULL;
	
	if (fex->frame_len==0) {
		rs_warning("Cannot compute features for segment of size 0!");
		return -1;
	}
	
	fex->n_features=V1_N_FEATURES;
	
	_mfcc_series= (mx_real_t **) rs_malloc(MFCC_FEATURES * sizeof(mx_real_t *), "mfcc feature series");
	for (i=0;i<MFCC_FEATURES;i++)
		_mfcc_series[i]= (mx_real_t *) rs_malloc(MAX_FRAMES * sizeof(mx_real_t), "mfcc features");
	_energy_series= (mx_real_t **) rs_malloc(ENERGY_FEATURES * sizeof(mx_real_t *), "energy feature series");
	for (i=0;i<3;i++)
		_energy_series[i]= (mx_real_t *) rs_malloc(MAX_FRAMES * sizeof(mx_real_t), "energy features");

	if (pfile) {
		FILE *pfile_fp= fopen(pfile,"r");
		if (!pfile_fp)
			rs_warning("pitch file %s not found!",pfile);
		/* read external pitch values */
		pitch = (mx_real_t *) rs_malloc(MAX_FRAMES * sizeof(mx_real_t),"external pitch values");
		j=MAX_FRAMES;
		i=0;
		while (fscanf(pfile_fp,"%g",&pitch[i])==1) {
			if (j == i+1) {
				j+=MAX_FRAMES;
				pitch = (mx_real_t *) rs_realloc(pitch,j*sizeof(mx_real_t),"external pitch values");
			}
			i++;
		}
		nframes=i;
		fclose(pfile_fp);
	}
	else {
		pitch= pitch_calc (fex->pitch,signal,fex->frame_len);
		nframes=fex->pitch->nframes;
	}

	if (!pitch) {
		for (;fcount<STATS*9+7;fcount++)
			features[fcount]=-1.0;
		n_voiced_frames=-1.0;
	}
	else {
		const int series_size=9;
		// @begin_change_johannes
		//fextract_series_t *serien[series_size];
		fextract_series_t *serien[9];
		// @end_change_johannes
	
//		printRawXML(pitch,nframes,"pitch");

		pitch_frame_candidates_destroy(fex->pitch);
		for (i=0;i<series_size;i++)
			serien[i]=series_create(MAX_SERIES);
	
		if (pitch[0]!=0)
			series_add(serien[0],pitch[0]);
	
		for (i=1;i<nframes-1;i++) {
			if (pitch[i]!=0)
				series_add(serien[0],pitch[i]);
	    
			if (pitch[i-1]<pitch[i] && pitch[i]>pitch[i+1]) {
				series_add(serien[1],pitch[i]);
				if (pitch[i] > overall_max) {
					overall_max=pitch[i];
					overall_max_ind=i;
				}
				series_add(serien[2],i-last_min);
				series_add(serien[3],pitch[i]-pitch[last_min]);
				series_add(serien[4],(pitch[i]-pitch[last_min])/(i-last_min));
				last_max=i;
			}
			else
				if (pitch[i-1]>pitch[i] && pitch[i]<pitch[i+1]) {
				series_add(serien[5],pitch[i]);
				series_add(serien[6],i-last_max);
				series_add(serien[7],pitch[i]-pitch[last_max]);
				series_add(serien[8],(pitch[i]-pitch[last_max])/(i-last_max));
				last_min=i;
				}
		}
	
		overall_max_ind = 1.0 * (overall_max_ind+1) / nframes;
	
		if (nframes >1 && pitch[nframes-1]!=0)
			series_add(serien[0],pitch[nframes-1]);
	
		for (i=0; i<series_size; i++) {
			getStatistics(features+fcount,serien[i]->series,serien[i]->nSeries); //pitch statistics features
			fcount+=STATS;
		}
      
	// normierter Mittelwert, normierter Median, normiertes 1. Quartil, normiertes 3. Quartil
		if (features[1]-features[2]) {
			features[fcount++]=(features[0]-features[2])/(features[1]-features[2]);
			features[fcount++]=(features[5]-features[2])/(features[1]-features[2]);
			features[fcount++]=(features[6]-features[2])/(features[1]-features[2]);
			features[fcount++]=(features[7]-features[2])/(features[1]-features[2]);
		}
		else {
			features[fcount++]=0;
			features[fcount++]=0;
			features[fcount++]=0;
			features[fcount++]=0;
		}
	
		features[fcount++]=1.0 * serien[1]->nSeries/nframes; // Anzahl Maxima pro Frames pro Segment
		features[fcount++]=1.0 * serien[5]->nSeries/nframes; // Anzahl Minima pro Frames pro Segment
		features[fcount++]=overall_max_ind; // Position des Maximums
		n_voiced_frames=serien[0]->nSeries;
	
		for (i=0;i<series_size;i++)
			series_destroy(serien[i]);
	}

	getEnergy_and_MFCC(fex->mfcc, signal, fex->frame_len, &_energy_series, &_mfcc_series, &ser);
//  ser=0;
	if (ser) {
		const int series_size = 8;
		// @begin_change_johannes
		//fextract_series_t *serien[series_size];
		fextract_series_t *serien[8];
		// @end_change_johannes
		for (i=0;i<series_size;i++)
			serien[i]=series_create(MAX_SERIES);

		fcount+=getMFCCFeatures(features+fcount, _mfcc_series,ser);

		/* Energie-Merkmale: */

		last_max=last_min=0;

		for (i=1;i<ser-1;i++) {
			if (_energy_series[0][i-1]<_energy_series[0][i] && _energy_series[0][i]>_energy_series[0][i+1]) {
				series_add(serien[0], _energy_series[0][i]); //Maxima
				max_sum += _energy_series[0][i];
				series_add(serien[1], i-last_min); // Laenge der Maxima
				series_add(serien[2], _energy_series[0][i]-_energy_series[0][last_min]); // Groesse der Maxima
				series_add(serien[3], (_energy_series[0][i]-_energy_series[0][last_min])/(i-last_min)); // Steigung der Maxima
				last_max=i;
			}
			else
				if (_energy_series[0][i-1]>_energy_series[0][i] && _energy_series[0][i]<_energy_series[0][i+1]) {
				series_add(serien[4], _energy_series[0][i]); //Maxima
				series_add(serien[5], i-last_max); // Laenge der Maxima
				series_add(serien[6], _energy_series[0][i]-_energy_series[0][last_max]); // Groesse der Maxima
				series_add(serien[7], (_energy_series[0][i]-_energy_series[0][last_min])/(i-last_max)); // Steigung der Maxima
				last_max=i;
				}
		}

		getStatistics(features+fcount,_energy_series[0],ser); // energy statistics
		en_mean=features[fcount+1];
		fcount+=STATS;

		for (i=0;i<series_size;i++) {
			getStatistics(features+fcount,serien[i]->series,serien[i]->nSeries);
			fcount+=STATS;
		}

		max=serien[0]->nSeries;

		for (j=1;j<3;j++) {

			series_reset(serien[0]); series_reset(serien[1]);

			for (i=1;i<ser-1;i++) {
				if (_energy_series[j][i-1]<_energy_series[j][i] && _energy_series[j][i]>_energy_series[j][i+1]) {
					series_add(serien[0], _energy_series[j][i]);
				}
				else
					if (_energy_series[j][i-1]>_energy_series[j][i] && _energy_series[j][i]<_energy_series[j][i+1]) {
					series_add(serien[1], _energy_series[j][i]);
					}
			}

			getStatistics(features+fcount,_energy_series[j],ser); // energy delta statistics
			fcount+=STATS;
			getStatistics(features+fcount,serien[0]->series,serien[0]->nSeries);
			fcount+=STATS;
			getStatistics(features+fcount,serien[1]->series,serien[1]->nSeries);
			fcount+=STATS;
		}


  
		features[fcount++]= max? (1.0 * max_sum/max) - en_mean:0; // Mittelwert der Maxima minus globaler Mittelwert
		features[fcount++]= (1.0 * max)/ser; // Anzahl Maxima pro Frames pro Segment
		for (i=0;i<series_size;i++)
			series_destroy(serien[i]);
	} 
	else {
		for (;fcount < 141*STATS+9;fcount++)
			features[fcount]=-1;
	}

	/* Voiced/Unvoiced-Merkmal: */
	features[fcount++]=nframes ? (1.0 * n_voiced_frames)/nframes : -1;  // Anzahl stimmloser Frames pro Frames pro Segment
  
	/* Spectral Center of gravity-Merkmale: */
	serie = getOnlyCoG(signal,fex->frame_len);
	if (serie) {
		getStatistics(features+fcount,serie->series,serie->nSeries);
		series_destroy(serie);
		fcount+=STATS;
	}
	else
		for (;fcount< 142*STATS+10;fcount++)
			features[fcount]=-1;

	/* Dauer-Merkmal: */
	features[fcount++]=fex->frame_len;

	/* Harmonics-to-Noise-Ratio-Merkmale: */
	hnr=hnr_calc(fex->hnr,signal,fex->frame_len);
	nframes=fex->hnr->nframes;

	if (!hnr) 
		for (;fcount<145*STATS+11;fcount++) 
			features[fcount]=-1.0;
	else {
		const int series_size=3;
		// @begin_change_johannes
		//fextract_series_t *serien[series_size];
		fextract_series_t *serien[3];
		// @end_change_johannes

		pitch_frame_candidates_destroy(fex->hnr);
		for (i=0;i<series_size;i++)
			serien[i]=series_create(MAX_SERIES);

		if (hnr[0]!=0)
			series_add(serien[0],hnr[0]);

		for (i=1;i<nframes-1;i++) {
			if (hnr[i]!=-200) {
				series_add(serien[0],hnr[i]);
 
				if ((hnr[i-1]!=-200) && (hnr[i+1]!=200)) { // stimmlose Bereiche nicht beruecksichtigen
					if (hnr[i-1]<hnr[i] && hnr[i]>hnr[i+1])
						series_add(serien[1],hnr[i]);
					else
						if (hnr[i-1]>hnr[i] && hnr[i]<hnr[i+1])
							series_add(serien[2],hnr[i]);
				}
			}
		}

		if (nframes >1 && hnr[nframes-1]!=0)
			series_add(serien[0],hnr[nframes-1]);

		for (i=0; i<series_size; i++) {
			getStatistics(features+fcount,serien[i]->series,serien[i]->nSeries); //hnr statistics features
			fcount+=STATS;
		}
	}
  
	/* Aufraeumen... */
	for (i=0;i<MFCC_FEATURES;i++)
		if (_mfcc_series[i])
			rs_free(_mfcc_series[i]);
	if (_mfcc_series)
		rs_free(_mfcc_series);
  
	for (i=0;i<ENERGY_FEATURES;i++)
		if (_energy_series[i])
			rs_free(_energy_series[i]);
	if (_energy_series)
		rs_free(_energy_series);

	if (pitch)
		rs_free(pitch);
	if (hnr)
		rs_free(hnr);

	/*   for (;fcount<V1_N_FEATURES;fcount++) */
	/*       features[fcount]=0.0; */

	if (fcount != V1_N_FEATURES)
		rs_error("number of features is not correct (%d expected, %d calculated)!",V1_N_FEATURES,fcount);

	return V1_N_FEATURES;
} 
示例#17
0
int Criterion(double *value, int* indices, int dim, int n_classes, fx_select_t *sel, char **file_names, int n_splits, cType classifier, char *cparam) {
	int i, n_feat=-1, j, n_instances=0,n; 
	int *evaluation=NULL, *_eval=NULL;
	fx_select_t *sel_subset = fx_select_create(sel->n_features);
	classifier_t *cl = NULL; 
	double val=0;
	
	if (ev_verbose) {	
		fprintf(stderr,"Now evaluating subset ");
		printFset(indices,dim);
	}	

		
	j=0;
	for (i=0; i<sel_subset->n_features && j<dim;i++) {
		if (sel->selected[i]==1) {
			n_feat++;
			if (indices[j]==n_feat) {
				sel_subset->selected[i]=1;
				j++;
			}
		}
	}
	if (j!=dim) {
		rs_warning("Problem with feature subset selection!");
		return -1;
	}
	sel_subset->n_selected=dim;
	
	for (i=0;i<n_splits*2;i+=2) {
		char *tmpparam=NULL;
		if (cparam) {
			tmpparam=(char *) rs_malloc((strlen(cparam)+1)*sizeof(char),"classifier param");
			strcpy(tmpparam,cparam);
		}
		cl=cl_new_classifier(classifier,n_classes,sel_subset->n_selected,tmpparam);
		cl=cl_fscan(cl,classifier,file_names[i],sel_subset);
		n=cl_classify_file(cl,classifier,file_names[i+1],sel_subset,&_eval);
		n_instances+=n;
		if (n_instances-n==0) 
			evaluation=rs_malloc(n_instances*2*sizeof(int),"evaluation data");
		else
			evaluation=rs_realloc(evaluation,n_instances*2*sizeof(int),"evaluation data");
		for (j=0;j<n*2;j++) 
				evaluation[j+(n_instances-n)*2]=_eval[j];
		rs_free(_eval);
		if (tmpparam)
			rs_free(tmpparam);
		cl_destroy(cl,classifier);
	}
	
	if (evaluation)
		val=cl_eval(evaluation,n_classes,n_instances);
	
	rs_free(evaluation);
 
	fx_select_destroy(sel_subset);
	
	if (ev_verbose)
		fprintf(stderr,"... has evaluation %g\n",val);

	*value=val;
	return 0;
}
示例#18
0
/* 
   Gibt die Segmente einer Datei aus, entweder in Dateien oder auf die 
   Standardausgabe

   Argumente:
     file:           Name der Audiodatei, die segmentiert werden soll
     outdir:         Verzeichnis, in dem die Segmente gespeichert werden sollen
     n_segments:     Anzahl der Segmente der Audiodatei
     signal_segment: Array, der die Signaldaten der Segmente enthaelt
     segment_length: Array, der die Laenge der Segmente enthaelt

     Rueckgabe:
       0:            Kein Fehler
       -1:           Fehler
                     (besser: Anzahl der geschriebenen Segmente...)
     
*/
int emo_afile_output(char *file, char *outdir, int n_segments, dsp_sample_t **signal_segment, int *segment_length){
	int i=0, n_segments_out=0;
	char outfile[STRING_LENGTH], *name;
	FILE *out_fp;
   
	if (outdir && strcmp(outdir,"-")==0) {
		for (i=0;i<n_segments;i++) {
			if (output)
				fprintf(stderr,"%d\n",segment_length[i]);
			fwrite(signal_segment[i],sizeof(dsp_sample_t),segment_length[i],stdout);
			n_segments_out++;
		}
	}
	else {
		if (strcmp(file,"-")!=0) {
			int len;
			i=strlen(file)-1;
			while (i>=0 && file[i] != '.' && file[i] != '/')
				i--;
			if (i<0 || file[i] == '/')
				i=strlen(file);
			len=strrchr(file,'/')?strlen(strrchr(file,'/')):0;
			len = i+1-(strrchr(file,'/')?strlen(file)-strlen(strrchr(file,'/'))+1:0);
			name = (char *) rs_malloc(len*sizeof(char),"Target file name");
			strncpy(name,strrchr(file,'/')?strrchr(file,'/')+1:file,len-1);
			name[len-1]='\0';
		    
			while (i>=0 && file[i] != '/')
				i--;
		}
		else 
			name = "";
	
		if (!outdir) {
			if (strcmp(file,"-")!=0) {
				i=strlen(file);
				outdir = (char *) rs_malloc((i+1)*sizeof(char),"Target directory name");
				outdir[i]='\0';
				//
				while (i>-1) {
					outdir[i]=file[i];
					i--;
				}
			}
			else 
				outdir="";
		}
		else
			if (outdir[strlen(outdir)-1] != '/') {
			int len=strlen(outdir);
			char *temp= rs_malloc((len+2)*sizeof(char),"Audio output directory name");
			for (i=0;i<len;i++)
				temp[i]=outdir[i];
			temp[len]='/';
			temp[len+1]='\0';
			outdir=temp;
			}
	
			for (i=0;i<n_segments;i++) {
				if (i<9)
					sprintf(outfile,"%s%s_0%d.pcm",outdir,name,i+1);
				else 
					sprintf(outfile,"%s%s_%d.pcm",outdir,name,i+1);
				out_fp = fopen(outfile,"w");
				if (!out_fp) {
					rs_warning("Cannot write signal segment %d to file %s!",i,outfile);
					break;
				}
				if (output)
					fprintf(stderr,"\tSegment %d has length %d\n",i+1,segment_length[i]);
				if (fwrite(signal_segment[i],sizeof(dsp_sample_t),segment_length[i],out_fp) == segment_length[i])
					n_segments_out++;
				fclose(out_fp);
			}
			rs_free(name);
	}
	return n_segments_out;
}
示例#19
0
/*
    Segmentiert eine Liste von Dateien
  
    Argumente:
      filelist:   Name der Datei, die die Dateien enthaelt, die segmentiert 
                  werden sollen
      method: dsp_vad_t*    fuer voice activity detection, 
              int           fuer frames mit fester Laenge
	      char*         fuer Segmentierungsinfo 
      type:   vad, fixed oder info

    Rueckgabewert:
      Anzahl der Signalabschnitte in signal_segment; 
      -1, falls ein Fehler aufgetreten ist
 */
int emo_afilelist_segment(char *filelist, asegmentation_method_t *method, asegmentation_type_t type,int audio_output){
	FILE *fp;
	int n_segments=0;
	int *segment_length=NULL;
	dsp_sample_t **signal_segment=NULL;

	fp = fopen(filelist,"r");
	if (!fp) {
		rs_warning("Cannot open input file: %s!",filelist);
		return -1;
	}

	switch (type) {
		case vad: {
			int stat=0, x=0;
			char filename[STRING_LENGTH], outdir[STRING_LENGTH];
	    
			if (!method)
				method = (asegmentation_method_t *) rs_malloc(sizeof(asegmentation_method_t),"Audio segmentation method");
			if (!method->vad)
				method->vad = dsp_vad_create(DSP_MK_VERSION(1,0),VAD_FRAME_LEN);
	    //rest der zeile ueberspringen
			while(fscanf(fp,"%s\t%s",filename,outdir)==2 && stat >=0) {
				if (output)
					fprintf(stderr,"%s\t%s\t",filename,outdir);
				stat=emo_afile_segment(filename,method,vad,&signal_segment,&segment_length);
				if (stat == -1){
					rs_warning("Segmentation of file %s failed!",filename);
					return -1;
				}
				if (audio_output && stat != emo_afile_output(filename,outdir,stat,signal_segment,segment_length)) {
					rs_warning("Output of segments of file %s failed!",filename);
					return -1;
				}
				if (segment_length)
					rs_free(segment_length);
				if (signal_segment) {
					int i;
					for (i=0;i<stat;i++)
						if (signal_segment[i])
							rs_free(signal_segment[i]);
					rs_free(signal_segment);
				}
				n_segments+=stat;
				while (x != '\n' && x != EOF)
					x=fgetc(fp);
				x=0;
			}
			break;
		}
		case fixed: {
			int stat=0, x=0;
			char filename[STRING_LENGTH], outdir[STRING_LENGTH];
	    
			if (!method->segmentation_info) {
				rs_warning("No segment length or shift info available!");
				return -1;
			}
	    
			while(fscanf(fp,"%s\t%s",filename,outdir)==2 && stat >=0) {
				stat=emo_afile_segment(filename,method,fixed,&signal_segment,&segment_length);
				if (stat == -1){
					rs_warning("Segmentation of file %s failed!",filename);
					return -1;
				}
				if (audio_output) {
					stat = emo_afile_output(filename,outdir,stat,signal_segment,segment_length);
					if (stat == -1){
						rs_warning("Output of segments of file %s failed!",filename);
					}
		    
					return -1;
				}
				n_segments+=stat;
				while (x != '\n' && x != EOF)
					x=fgetc(fp);
				x=0;
			}
			break;
		}
		case info: {
			int stat=0;
			char filename[STRING_LENGTH], outdir[STRING_LENGTH], seg_info[10*STRING_LENGTH];

			if (!method->segmentation_info) {
				rs_warning("No segment length or shift info available!");
				return -1;
			}
	    
			while(fscanf(fp,"%s\t%s\t%[^\n]s",filename,outdir,seg_info)==3 && stat >=0) {
				method->segmentation_info=seg_info;
				stat=emo_afile_segment(filename,method,info,&signal_segment,&segment_length);
	    
				if (stat == -1){
					rs_warning("Segmentation of file %s failed!",filename);
					return -1;
				}

				if (audio_output && stat != emo_afile_output(filename,outdir,stat,signal_segment,segment_length)) {
					rs_warning("Output of segments of file %s failed!",filename);
					return -1;
				}
				n_segments+=stat;
			}
			break;
		}
		default: rs_warning("Unknown segmentation type: %d",type);
		return -1;
	}
    
	fclose(fp);
	return n_segments;
}
示例#20
0
/*
 * _dsp_mfcc_1_3_configure(fex, params)
 */
int _dsp_mfcc_1_3_configure(dsp_fextract_t *fex, char *params)
	{
	dsp_mfcc_t *cfg = fex->config;
	struct channel_t *ch = NULL;
	int i, pos, status;
	char *cp;
	mx_real_t *param;

	/* Abtastrate etc. ... */
	fex->samplerate =	V1_1_SAMPLERATE;
	fex->n_channels =	V1_1_N_CHANNELS;
	fex->frame_len =	V1_1_FRAME_LEN;
	fex->frame_shift =	V1_1_FRAME_SHIFT;
	fex->n_features =	V1_1_N_FEATURES;

	/* Verzoegerungselement fuer Ableitung erzeugen ... */
	cfg->wderiv = dsp_delay_create(V1_1_W_LENGTH,
			sizeof(mx_real_t),
			V1_1_N_BASEFEATURES);

	/* Kanaladaption erzeugen/initialisieren */
	if (!params || rs_line_is_empty(params)) {
		ch = channel + 0;

		rs_warning("no channel type for MFCCs v%d.%d given"
			" - using '%s'!",
			DSP_VERSION_MAJOR(fex->version),
			DSP_VERSION_MINOR(fex->version),
			ch->name);
		}
	else	{
		for (i = 0; i < V1_3_N_PARAM_DEFAULTS; i++) {
			if (strcmp(params, channel[i].name) == 0) {
				rs_msg("MFCCs v%d.%d use channel type '%s'!",
					DSP_VERSION_MAJOR(fex->version),
					DSP_VERSION_MINOR(fex->version),
					ch->name);
				break;
				}
			}
		
		}

	/* ... falls kein impliziter/gegebener Kanaltyp, Parameter einlesen */
	if (!ch && params) {
		/* ... create temporary channel data ... */
		ch = rs_calloc(1, sizeof(struct channel_t),
				"temporary channel data");

		/* ... scan parameters from 'params' string ... */
		cp = params;

		for (i = 0; i < V1_3_N_PARAMS; i++) {
			status = sscanf(cp, "%g%n", ch->param + i, &pos);

			if (status != 1) {
				if (!rs_line_is_empty(cp))
					rs_error("error in channel definition: '%s'!",
						params);
				break;
				}
			cp += pos;
			}
		for (/* i = <implicit> */; i < V1_3_N_PARAMS; i++)
			ch->param[i] = 0.0;
/********
		rs_msg("MFCC channel parameters set to '%s'!", params);
********/
		}

	cfg->channel = dsp_channel_init(V1_1_N_BASEFEATURES,
				V1_2_I_ENERGY, V1_3_MINTIME, V1_3_MAXTIME,
				V1_2_DECAY, V1_2_ENERGY_PERCENT,
				ch->param);

	return(0);
	}