Le module audioop contient des opérations utiles sur des fragments sonores. Il travaille sur des fragments sonores qui consistent en échantillons d'entiers signés de 8, 16 ou 32 bits, stockés dans des chaînes de caractères Python. C'est le même format que celui utilisé pour les modules al et sunaudiodev. Tous les éléments scalaires sont des entiers, sauf indication contraire
Ce module fournit un support pour les codages en loi u et Intel/DVI ADPCM.
Quelques-unes des opérations les plus complexes n'admettent que des
échantillons de 16 bits, sinon la taille de l'échantillon (en octets) est
toujours un paramètre de l'opération.
Le module définit les variables et fonctions suivantes :
Le temps pris par cette routine est proportionnel à
La routine prend un temps proportionnel à etat est un tuple contenant l'état du codeur. Le codeur
retourne un tuple etat est un tuple qui contient l'état du convertisseur. Le
convertisseur retourne un tuple Les arguments poidsA et poidsB sont des paramètres pour un simple
filtre numérique et prennent par défaut les valeurs Notez bien que des opérations telles que mul() ou
max() ne distinguent pas les fragments mono et stéréo,
c'est-à-dire que tous les échantillons sont traités de la même
façon. Si cela pose un problème, alors le fragment stéréo doit
d'abord être séparé en deux fragments mono, qui sont recombinés
ensuite. Voici un exemple de la façon de procéder :
Si vous utilisez le codeur ADPCM pour construire des paquets réseau et
que vous voulez que votre protocole soit sans état (c'est-à-dire qu'il
puisse tolérer des pertes de paquets) vous ne devez pas seulement transmettre
les données mais aussi l'état. Notez que vous devez envoyer l'état
initial (celui que vous avez passé à lin2adpcm()) au
décodeur, pas l'état final (celui qui est retourné par le codeur). Si vous
voulez utiliser struct.struct() pour stocker l'état en binaire
vous pouvez coder le premier élément (la valeur prévue) sur 16 bits et
le second (l'index du delta) sur 8.
Les codeurs ADPCM n'ont jamais été essayés sur d'autres codeurs ADPCM,
seulement sur eux-mêmes. Il se pourrait bien que j'aie mal interprété
les standards, auquel cas ils ne seront pas interopérables avec les
standards respectifs.
Les routines find*() peuvent paraître assez curieuses au premier
abord. Elles ont pour objet principal l'annulation d'écho. Une façon raisonnablement
rapide de le faire est de prélever la partie la plus énergique de l'échantillon
de sortie, de le localiser dans l'échantillon d'entrée et de soustraire tout
l'échantillon de sortie de l'échantillon d'entrée :
error
add(fragment1, fragment2, taille)
1, 2 ou 4. Les deux fragments doivent avoir
la même longueur.
adpcm2lin(adpcmfragment, taille, etat)
(echantillon, nouveletat)
où l'échantillon a la taille spécifiée par taille.
adpcm32lin(adpcmfragment, taille, etat)
avg(fragment, taille)
avgpp(fragment, taille)
bias(fragment, taille, biais)
cross(fragment, taille)
findfactor(fragment, reference)
rms(add(fragment, mul(reference, -F))) est
minimal, c'est-à-dire retourne le facteur avec lequel il faudrait
multiplier reference pour qu'il corresponde le mieux possible
à fragment. Les fragments doivent tous les deux contenir des
échantillons sur 2 octets.
len(fragment).
findfit(fragment, reference)
(decalage, facteur) où decalage est
le décalage (entier) dans fragment où la meilleure correspondance
commence, et facteur est le facteur (nombre flottant) comme dans
findfactor().
findmax(fragment, longueur)
rms(fragment[i*2:(i+length)*2])est maximum. Les fragments doivent contenir des échantillons de deux octets.
len(fragment).
getsample(fragment, taille, index)
lin2lin(fragment, taille, nouvelletaille)
lin2adpcm(fragment, taille, etat)
(fragadpcm, nouveletat), et le
nouveletat doit être passé au prochain appel de
lin2adpcm(). Pour l'appel initial, None peut être
passé dans l'état. fragadpcm est le fragment ADPCM codé
compressé à deux valeurs de 4 bits par octet.
lin2adpcm3(fragment, taille, etat)
lin2ulaw(fragment, taille)
max(fragment, taille)
maxpp(fragment, taille)
mul(fragment, taille, facteur)
ratecv(fragment, taille, nbrecanaux, freqentree, freqsortie,
etat[, poidsA[, poidsB]])
(nouveaufragment, nouveletat),
et nouveletat doit être passé lors de l'appel suivant à
ratecv().
1 et 0
respectivement.
reverse(fragment, taille)
rms(fragment, taille)
\catcode`_=8
\sqrt{\frac{\sum{{S_{i}}^{2}}}{n}}
tomono(fragment, taille, facteurg, facteurd)
tostereo(fragment, taille, facteurg, facteurd)
ulaw2lin(fragment, taille)
def mul_stereo(echantillon, taille, facteurg, facteurd):
echantillong = audioop.tomono(echantillon, taille, 1, 0)
echantillond = audioop.tomono(echantillon, taille, 0, 1)
echantillong = audioop.mul(echantillon, taille, facteurg)
echantillond = audioop.mul(echantillon, taille, facteurd)
echantillong = audioop.tostereo(echantillong, taille, 1, 0)
echantillond = audioop.tostereo(echantillond, taille, 0, 1)
return audioop.add(echantillong, echantillond, taille)
def annuleecho(donneessortie, donneesentree):
pos = audioop.findmax(donneessortie, 800) # un dixième de seconde
test_sortie = donneessortie[pos*2:]
test_entree = donneesentree[pos*2:]
ipos, facteur = audioop.findfit(test_entree, test_sortie)
# Optionnal (pour une meilleure annulation):
# facteur = audioop.findfactor(test_entree[ipos*2:ipos*2+len(test_sortie)],
# test_sortie)
prebourrage = '\0'*(pos+ipos)*2
postbourrage = '\0'*(len(donneesentree)-len(prebourrage)-len(donneessortie))
donneessortie = prebourrage + audioop.mul(donneessortie,2,-factor) + postbourrage
return audioop.add(donneesentree, donneessortie, 2)