/* 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; }
/* * 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; }