J'ai écrit un petit synthé logiciel pour l'iPhone.
Pour améliorer les performances, j'ai mesuré mon application avec Shark et j'ai constaté que je perdais beaucoup de temps dans les conversions float/SInt16.
J'ai donc réécrit certaines parties pour contourner les conversions en pré-calculant des tables de recherche qui renvoient des échantillons SInt16 «prêts à l'emploi». Cela fonctionne bien jusqu'à présent.
Actuellement, j'essaie de réécrire certains filtres et ma mise en œuvre de l'enveloppe ADSR pour utiliser uniquement l'arithmétique entière, mais je pourrais utiliser quelques conseils pour effectuer des multiplications/divisions sans flottants.
Je ciblez les iPhone canonical format:Éviter l'arithmétique en virgule flottante
- LPCM
- 16 bits échantillons entiers
Quelles sont les bonnes méthodes pour appliquer une amplitude à mon échantillon final sans utiliser un flotteur?
Edit:
La seule chose que je pensais à ce jour est que je peux diviser par des puissances de 2 en décalant à droite mon échantillon actuel.
inBuffer[frame] = wavetable[i % cycleLengthInSamples] >> 4;
Mais je ne peux pas imaginer de façon élégante de créer une enveloppe ADSR lisse avec cela.
Éditez2: Merci pour toutes vos réponses!
Mon approche actuelle:
- apporter toute mon enveloppe ADSR valeurs dans la gamme de SINT16 positif
- se multiplient avec la valeur actuelle de la table d'onde (intermédiaires de magasin comme SINT32)
- posté le résultat par 16 le droit
cela semble fonctionner :)
C'est ce que je pensais. Mais ne multiplieriez-vous pas par une puissance de deux pour obtenir votre point fixe? Cela implique seulement de déplacer des bits. –
Le décalage peut devenir funky lorsque vous utilisez des ints signés. Les pouvoirs de deux sont plus efficaces, mais plus difficiles à déboguer. Si c'est la première fois que j'utilise un point fixe, je recommanderais des pouvoirs de dix. – patros
Merci pour vos réponses! Je n'ai toujours pas trouvé une façon élégante d'implémenter une enveloppe ADSR sans flotteur. Je viens d'essayer de déplacer les échantillons à droite, ce qui entraîne une division par une puissance arbitraire de deux et réduit donc mon amplitude - mais je n'arrive pas à comprendre comment créer une enveloppe lisse avec ça. –