Comment puis-je convertir des fichiers float -> double -> float lors du traitement d’un tampon audio en c ++

Je développe actuellement une application dans laquelle les trames d’échantillons audio sont traitées dans le rappel suivant.

void Eav07AudioProcessor::processBlock (AudioSampleBuffer& buffer) { for (int channel = 0; channel < getNumInputChannels(); ++channel) { float* channelData = buffer.getSampleData (channel); // ..do something to the data... DoSomeHeavyweightDSPon(&channelData[0]); // in the header, DoSomeHeavyweightDSPon(double data[somebignumber]) } } 

La fonction qui remplacera le processus de gain ci-dessus s’attend à ce que channelData soit à double précision. Le paramètre channelData est float precision. Dois-je en quelque sorte lancer channelData de float à doubler, puis de double à flotter après le traitement ou suis-je en train de manquer un tour?

Si une conversion explicite est nécessaire, quel est le moyen le plus efficace de le faire, sachant que cette méthode est appelée 100 fois par seconde.

Non, le fait de doubler et renverser le flottant ne fera pas ce que la fonction gain () – attend. La fonction de gain attend un pointeur sur un tableau de doublons et aucune quantité de transtypage ne le fera.

La meilleure chose à faire est de remplacer la fonction gain (). Je voudrais simplement utiliser le “code démo” que vous avez inclus (la boucle for interne).

Si vous devez appeler la fonction de gain (double *), vous pouvez effectuer les opérations suivantes:

  • créez un second tampon avec size: malloc(buffer.getNumSamples()*sizeof(double)) et copiez-le à la main (memcpy ne fonctionne pas car il ne génère pas les quatre octets de zéro dont vous avez besoin entre).

  • [bidouillage]: utilisez simplement le tampon que vous avez mais définissez chaque seconde de flottant sur 0, puis signe prolongez l’autre flottant dans celui-ci. Cela réduit effectivement de moitié le nombre d’échantillons que vous avez mais génère très peu de frais généraux.

La fonction mentionnée prend-elle double ou double* ? Ce dernier cas nécessitera toujours de copier tous les channelData dans un double tampon, et inversement après l’exécution de la fonction. Si vous voulez vraiment un moyen efficace, vous devrez (copier et) changer la fonction problématique pour prendre float* lieu de double*

si la fonction prend simplement double , aucune conversion explicite n’est nécessaire.