IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème overlap-add kissfft


Sujet :

C++

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Problème overlap-add kissfft
    Salut,
    Alors voilà, j'essaye d'écrire un plugin VST (traitement audio en temps-réel) qui ferait du filtrage par FFT, et je n'y arrive pas trop...

    J'ai essayé d'implémenter la méthode overlap-add, en remplissant donc l'autre moitié du buffer avec des 0 et en faisant la transformée de fourier de tout ça.

    Voilà mon code :
    (Tous les buffers outdata, indata ont une taille 1024). Pour l'instant je recopie sur les deux canaux de sortie le canal gauche d'entrée, la stéréo viendra quand ça ça marchera...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    for (int s = 0; s < nFrames; ++s, ++in1, ++in2, ++out1, ++out2)
      {
     
    	  if(current_buf == 0)
    	  {
    		  *out1 = outdata1[pos_in_data]  + outdata2[pos_in_data + 512];
    		  *out2 = outdata1[pos_in_data]  + outdata2[pos_in_data + 512];
    		  indata1[pos_in_data] = *in1;
    		  if(++pos_in_data > 512)
    		  {
    			   memset(indata1 + 512, 0, sizeof(kiss_fft_scalar) * 512);
     
    			   kiss_fftr(fftcfg, indata1, sdata);
    			   kiss_fftri(ifftcfg, sdata, outdata1);
    			   for(int i = 0; i < 1024; ++i)
    				   outdata1[i] = outdata1[i] / 1024.;
    			   pos_in_data = 0;
    			   current_buf = 1;
    		  }
    	  }
    	  else
    	  {
     
    		  *out1 = outdata2[pos_in_data] + outdata1[pos_in_data + 512];
    		  *out2 = outdata2[pos_in_data] + outdata1[pos_in_data + 512];
    		  indata2[pos_in_data] = *in1;
     
    		  if(++pos_in_data > 512)
    		  {
    			   memset(indata2 + 512, 0, sizeof(kiss_fft_scalar) * 512);
     
    			   kiss_fftr(fftcfg, indata2, sdata);
    			   kiss_fftri(ifftcfg, sdata, outdata2);
    			   for(int i = 0; i < 1024; ++i)
    				   outdata2[i] = outdata2[i] / 1024.;
    			   pos_in_data = 0;
    			   current_buf = 0;
    		  }
    	  }
     
      }

    Voilà, merci de votre aide !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    Tu te rends compte qu'ici, notre spécialité, c'est le C++, pas le son.

    Si tu as un problème lié au langage, on va pouvoir t'aider, mais si c'est un problème "métier", mieux vaut regarder si une autre section du forum n'irai pas mieux.

    Qui plus est, je ne vois aucun aspect C++, mais du code dans le style du C. Tu ne te serai pas trompé de langage?

    Enfin, pour t'aider, il nous faut une (ou plusieurs) questions plus précises que "je n'y arrive pas trop". Et plus interrogatives, aussi

    Quand a ton code:
    • Ca sent la variable globale
    • les noms sont assez mal choisis
    • il y a trop de constantes magiques
    • Ca manque un peu de protection de données (encapsulation, classes?)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Salut,
    Je dois t'avouer que j'ai pas mal hésité avant de poster dans cette section, mais le framework VST (et à vrai dire la grande majorité des frameworks audio) est en C++, donc je me suis dit que les développeurs vst auraient plus tendance à être dans cette section. Mais c'est vrai que le code que j'ai paste aurait aussi bien marché dans un programme C.

    De plus j'ai cherché une section relative aux DSPs mais je ne l'ai pas trouvée... J'ai peut-être mal regardé, tu pourrais me l'indiquer si elle existe ? Je changerai mon topic de place. Merci!

    Sinon :
    . Ca sent la variable globale => je t'assure, il n'y en a pas. fftcfg et ifftcfg sont des attributs de la classe ou se trouve cette fonction, et toutes les autres variables sont locales (je n'ai pas copié leur initialisation).

    . les noms sont assez mal choisis => lesquels ? inx et outx sont assez standards, et pour les autres c'est un peu du brouillon, ceci dit je veux bien des conseils pour m'améliorer.

    . il y a trop de constantes magiques => qu'appelles-tu une constante magique ?

    . Ca manque un peu de protection de données (encapsulation, classes?) => ben disons qu'il faut un maximum de performance donc bof je pense...

    Merci bien !

    Edit: ah oui, un peu plus de précision sur mon problème : bah c'est simple, il y a de la distorsion aïgue, forte et très moche dans le son après traitement.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    les constantes magiques sont les nombres différentes de 0, 1 et -1, et encore.
    512 et 1024, dans ton cas.
    Il faut créer des constantes explicites, de facon à pouvoir les changer sans impacter le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace {
        const int buffer_size = 1024;
    }
    Pour les noms de fonctions ifftcfg, ca ressemble quand même beaucoup à ssittypwd, autrement dit, à un nom comprimé, inintelligible pour un relecteur
    Le max de perf ne veut pas dire ignorer les classes, qui sont facilement inlinables par les compilateurs.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Bon, j'ai corrigé mon problème tout seul, c'était juste un <= au lieu d'un <

    Merci de tes remarques, voici un code un peu plus propre (et qui ne fait pas de distorsion) pour ceux qui passeront un jour par là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    // pos_in_data et current_buf sont initialisés à 0 dans le constructeur
    void IPlugEffect::ProcessDoubleReplacing(double** inputs, double** outputs, int nFrames)
    {
      double* in1 = inputs[0];
      double* in2 = inputs[1];
      double* out1 = outputs[0];
      double* out2 = outputs[1];
     
      for (int s = 0; s < nFrames; ++s, ++in1, ++in2, ++out1, ++out2)
      {
    		*out1 = outdata[current_buf][pos_in_data] + outdata[1 - current_buf][pos_in_data + halfFFT_size];
    		*out2 = outdata[current_buf][pos_in_data] + outdata[1 - current_buf][pos_in_data + halfFFT_size];
    		indata[current_buf][pos_in_data] = *in1;
    		if(++pos_in_data >= halfFFT_size)
    		{
    			memset(indata[current_buf] + halfFFT_size, 0, sizeof(kiss_fft_scalar) * halfFFT_size);
     
    			kiss_fftr(fftcfg, indata[current_buf], sdata);
                            // Faire le traitement spectral ici
    			kiss_fftri(ifftcfg, sdata, outdata[current_buf]);
    			for(int i = 0; i < FFT_size; ++i)
    				outdata[current_buf][i] = outdata[current_buf][i] / (double)FFT_size;
    			pos_in_data = 0;
    			current_buf = 1 - current_buf;
    		}
      }
    }

Discussions similaires

  1. Problème "overlaps with VirtualHost" avec plusieurs VHost
    Par catapicultrophe dans le forum Apache
    Réponses: 2
    Dernier message: 27/10/2014, 11h59
  2. Problème overlaps [inter routage]
    Par ff4pierre dans le forum Hardware
    Réponses: 10
    Dernier message: 03/05/2014, 20h48
  3. Problème HYPERLINKS.ADD ou ADDRESS
    Par jeancalvet dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/12/2013, 13h40
  4. Réponses: 0
    Dernier message: 04/08/2009, 11h30
  5. Problème "route add"
    Par bibiodp dans le forum Réseau
    Réponses: 2
    Dernier message: 08/11/2007, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo