Example #1
0
/* Trigger function for Pure Data DSP 
 *  @param  Vector which contains DSP add informations 
 *  @return Size of Vector and add one 
 */
t_int *synthe_perform(t_int *w){

  t_synthe *x=(t_synthe*)(w[1]);  
  t_sample *in1=(t_sample *)(w[2]);  
  t_sample *in2=(t_sample *)(w[3]);  
  t_sample *out=(t_sample *)(w[4]);  
  int n=(int)(w[5]),i=0,j=0;

  t_sample *dup1,*dup2,*tmp1,*tmp2,*res;
  t_sample a1,a2,b1,b2;
  float ampSum,freqSum,factor;
	
  dup1=malloc(n*(sizeof*dup1));
  dup2=malloc(n*(sizeof*dup2));
  tmp1=malloc(n*(sizeof*tmp1));
  tmp2=malloc(n*(sizeof*tmp2));
  res=malloc(n*(sizeof*res));
  
  // Recopier l'in1 dans l'out et sortir
  if (x->bypass==1) {
    copy_to_out_signal(in1,out,n);
    return (w+6);
  }
  
  // Appliquer la fenetre aux buffer dupliqués (dup1 et dup2)
  apply_blackman(dup1,in1,x->window,n);
  apply_blackman(dup2,in2,x->window,n);
  
  // Application de la fonction rfdt aux deux buffers
  rdft(n,1,dup1,x->bitshuffle,x->weighting);
  rdft(n,1,dup2,x->bitshuffle,x->weighting);
	
  // Conversion des valeurs complexe en coordonne polaires
  for(i=0;i<n;i=i+2){
    a1=dup1[i];b1=dup1[i+1];
    a2=dup2[i];b2=dup2[i+1];
    tmp1[i]=distance_euclidienne(a1,b1);
    tmp1[i+1]=-atan2(b1,a1);
    tmp2[i]=distance_euclidienne(a2,b2);
    tmp2[i+1]=-atan2(b2,a2);
  }
  for(i=0;i<n;i=(i+x->shapeWidth*2)) {
    ampSum=0;
    freqSum=0;
    for(j=0;j<(x->shapeWidth)*2;j=j+2) {
      ampSum+=tmp2[i+j];
      freqSum+=tmp1[i+j];
    }
    factor=ampSum/freqSum;
    for(j=0;j<(x->shapeWidth)*2;j=j+2) {
      tmp1[i+j]*=factor;
    }
  }

  // reconvertir en valeurs complexes
  for(i=0;i<n;i=i+2){
    res[i]=tmp1[i]*cos(tmp1[i+1]);
    res[i+1]=-tmp1[i]*sin(tmp1[i+1]);
  }
  rdft(n,-1,res,x->bitshuffle,x->weighting);	
  if(x->autonorm==1){
    for(i=0;i<n;i++){
      res[i]=res[i]/500;
    }
  }
  copy_to_out_signal(res,out,n);
	
  free(dup1);
  free(dup2);
  free(tmp1);
  free(tmp2);
  free(res);
	
  return w+6;
}
Example #2
0
/*
 * Q.5 - Fonction centrale effectuant le calcul
 */
t_int           *scs_tilde_perform(t_int *w)
{
	t_scs_tilde *x = (t_scs_tilde *)(w[1]);
	t_sample   *in1 =     (t_sample *)(w[2]);
	t_sample   *in2 =     (t_sample *)(w[3]);
	t_sample   *out =     (t_sample *)(w[4]);
	int           n =            (int)(w[5]);
	int 	   	  i =                      0;
	int 	   	  j =                      0;
	t_sample  *dup1, *dup2, *tmp1, *tmp2, *res;
	t_sample     a1, a2, b1, b2;
	float    ampSum;
	float   freqSum;
	float    factor;

	// Allocation
	dup1 = malloc (n * sizeof * dup1);
	dup2 = malloc (n * sizeof * dup2);
	tmp1 = malloc (n * sizeof * tmp1);
	tmp2 = malloc (n * sizeof * tmp2);
	res  = malloc (n * sizeof * res);

	// Renvoi directement le in1 en sortie
	if (x->bypass == 1) {
		for(i = 0; i<n; i++) {
			out[i] = in1[i];
		}
		if (x->autonorm == 1) {
			for(i = 0; i < n; i++){
				out[i] = out[i] / 250;
			}
		}
		return (w+6);
	}

	// Duplication des inputs in1 et in2 dans dup1 et dup2
	for(i = 0; i<n; i++) {
		dup1[i] = in1[i] * x->window[i];
		dup2[i] = in2[i] * x->window[i];
	}

	// Application de rdft sur dup1 et dup2
	rdft(n, 1, dup1, x->bitshuffle, x->weighting);
	rdft(n, 1, dup2, x->bitshuffle, x->weighting);

	//Conversion des valeurs

	for(i = 0; i<n; i = i+2) {
		a1 = dup1[i];
		b1 = dup1[i+1];
		a2 = dup2[i];
		b2 = dup2[i+1];
		tmp1[i] = distance_euclidienne(a1, b1);
		tmp1[i+1] = -atan2(b1, a1);
		tmp2[i] = distance_euclidienne(a2, b2);
		tmp2[i+1] = -atan2(b2, a2);
	}

	for(i = 0; i<n; i = i + x->shapeWidth * 2) {
		ampSum = 0;
		freqSum = 0;
		for(j = 0; j < (x->shapeWidth) * 2; j = j + 2) {
			ampSum += tmp2[i+j];
			freqSum += tmp1[i+j];
		}
		factor = ampSum / freqSum;
		for(j = 0; j<(x->shapeWidth) * 2; j = j + 2) {
			tmp1[i+j] *= factor;
		}
	}

	for(i = 0; i<n; i = i + 2) {
		res[i] = tmp1[i] * cos(tmp1[i+1]);
		res[i + 1] = -tmp1[i] * sin(tmp1[i+1]);
	}

	rdft(n, -1, res, x->bitshuffle, x->weighting);

	if (x->autonorm == 1) {

		for(i = 0; i < n; i++){
			res[i] = res[i] / 1000;
		}
	}
	for(i = 0; i < n; i++){
		out[i] = res[i];
	}

	free(dup1);
	free(dup2);
	free(tmp1);
	free(tmp2);
	free(res);

	return w+6;
}