2009-11-13 8 views
0

Je suis novice en programmation DSP et je me demande comment procéder au mieux pour le fonctionnement de base du niveau. Dites que j'ai un nombre de 8 bits qui représente l'amplitude que je veux qu'un signal soit en 256 étapes. J'ai un ensemble de nombres de 16 bits représentant les données de signal. Quel est le meilleur moyen de mettre à l'échelle les données de signal sur la base du paramètre "volume" de sorte que 0 indique une atténuation complète et 255 laisse les données inchangées?Ajustement de base DSP

Répondre

2

Que diriez-vous

out_sample = in_sample * volume/255; 

Un changement d'échelle linéaire droite. Cela suppose que le calcul peut être fait en utilisant une plus grande précision, pour capturer le résultat de la multiplication sans troncature.

6

Qu'est-ce dérouleur dit:

out_sample = in_sample * volume/255; 

Si vous travaillez sur une puce réelle DSP ou matériel sans séparateurs rapides que vous pouvez utiliser cette astuce pour obtenir les mêmes valeurs sans division:

int product = in_sample * volume; 
out_sample = (product + (product>>8) + 1)>>8; 

sur un DSP moderne comme le C64x + ce code dure environ 10 fois plus rapide ...

aussi:

Vous parlez de volume, et vous appliquez actuellement un volume de 8 bits comme facteur de gain linéaire. Cependant, nos oreilles interprètent le volume comme un effet logarithmique. Vous voudrez peut-être faire une conversion de db (vos 8 bits) en gain linéaire avant la multiplication. Précalculez-les et placez-les dans une table. Pendant que vous faites cela, vous pouvez également augmenter l'échelle de la valeur à 2^15 pour plus de précision.

Cela vous donnera une réponse beaucoup plus agréable et beaucoup moins de clics de vous font des fondus de volume.