DCMOTO - Emulateur universel Thomson 8 bits : Forum - Programmation - Compression des sons
Retour : Accueil » Programmation
Pages : 1 - 2
Auteur Message
Daniel
Visiteur
Date : 15/04/2005 à 11h30
Pour jouer de la musique sur Thomson, en 6 bits mono 22050 Hz, j'utilise une technique de compression rudimentaire : plutot que de stocker des echantillons 6 bits, je calcule la différence avec l'échantillon précédent et je la stocke sur 4 bits. Dans 99,99% des cas il n'y a pas de dépassement de capacité. Si ça se produit, je fais de la propagation d'erreur.

L'avantage de cette technique est l'évidente simplicité du décodage. Le programme de restitution ne dépasse pas une vingtaine d'instructions. Par contre le taux de compression n'est que de 33%.

Ma question est de savoir s'il existe d'autres méthodes plus subtiles, adaptées à un processeur 8 bits 1 MHz
Ne répondez pas MP3, je ne saurais pas le décoder, même en 50 instructions

Daniel
en haut - en bas
Yoann
Visiteur
Date : 15/04/2005 à 11h54
Tu pourrais faire des valeurs sur 4 bits, et extrapoler entre 2 valeurs pour rajouter de la qualite (perdu par la reduction)

Donc, 1 octet = 2 info sonores

LDA ,X // On charge dans A la valeur a jouer
ASRA // On decale de 4 bits
ASRA
ASRA
ASRA
ANDA #$0F // On masque au cas ou ( a verifier)
STA $E7CD // On joue

// synchro // ... tu te debrouilles ... ca depend a quelle frequence tu joues ton son

LDB ,X+ // On met dans B, et on increment X pour l'octet suivant
ANDB #$0F // La partie inferieur de l'octet
STB TEMP // On stock en memoire
ADDA TEMP // On ajoute A
ASRA // On divise par 2 pour faire la moyenne des 2

STA $E7CD // On joue

// Synchro

STB $E7CD // On joue (B contient toujours la partie inferieure de l'octet)

// Synchro

-> On recommence au debut
en haut - en bas
Yoann
Visiteur
Date : 15/04/2005 à 12h04
Sinon, tu peux encore faire quelque chose de meilleur qualite en :

1. Stockant 6 valeurs (6 bits) sur 3 octets
2. Decompressant le tout en memoire (dans une autre banque par exemple)
3. Jouant le tout en extrapolant a nouveau

La qualite risque d'etre bonne. Si je ne m'abuse, c'est ce que fait le logiciel de HMEL (TOSON)

Sinon, autre solution :

Utilise ta methode (difference avec le son suivant), et decompresse tout en memoire (autre bank) en n'ayant que des octets avec des valeurs sur 6Bits, puis joue en extrapolant.
en haut - en bas
Daniel
Visiteur
Date : 15/04/2005 à 17h08
Yoann a écrit :
Tu pourrais faire des valeurs sur 4 bits, et extrapoler entre 2 valeurs pour rajouter de la qualite (perdu par la reduction)

Je n'ai pas bien compris. En réduisant à 4 bits les echantillons 6 bits, on perd de l'information et on déforme le signal. Aucune extrapolation ne peut le reconstituer.

Prenons par exemple les échantillons 6 bits &h22, &h10, &h01, &h03, &h02, &h00, &h12, &h30, &h33
En les réduisant à 4 bits on obtient &h08, &h04, &h00, &h00, &h00, &h00, &h04, &h0d, &h0d
Avec cette technique, il est impossible de reconstituer le signal de départ.

Je cherche une méthode de compression permettant de réduire la taille de façon significative, au prix d'une déformation presque imperceptible du son original.

Formulé autrement, je voudrais simplifier les techniques classiques de compression audio pour rendre la décompression possible en temps réel sur Thomson.

Daniel
en haut - en bas
Fool-DupleX
Visiteur
Date : 15/04/2005 à 17h59
D'accord avec Daniel.

Daniel ta technique fait partie de la famille ADPCM. Il en existe plusieurs dont une qui utilise une prediction statistique sur l'erreur au lieu de la reporter (ex: "connaissant les trois dernieres differences, quelle est la plus probable erreur commise?"). Un autre algo lossless est LPAC, base sur un mecanisme de prediction dont on ne code que la difference de la prediction a l'original, minime si le modele de prediction est bon. La decompression est relativement aisee, mais ces algo necessitent des look-up tables qui prennent de la place en memoire. Quand la taille du son est enorme par rapport a la LUT, le gain est interessant, mais sur un Thomson, j'ai bien peur que la LUT ne soit plus grande que le son Enfin a verifier toutefois, je ne connais pas les performances exactes de ces algos.

Fool
en haut - en bas
jasz
Visiteur
Date : 15/04/2005 à 20h48
Il faut peut-être prendre l'exemple des automations (st et amiga) qui donnent d'excellents résultats... mais je doute qu'en 50 instructions on arrive à quelque chose. Mais on peut s'en inspirer
en haut - en bas
Daniel
Visiteur
Date : 15/04/2005 à 21h11
jasz, as-tu un lien vers une description de ces méthodes utilisées sur atari et amiga ?
Pour la qualité, il est évident que le lossless est préférable, mais sur PC il est difficile de gagner plus de 35%. Je ne sais pas si les rapports obtenus en stereo 16 bits 44,1 kHz sont applicables au 6 bits mono 22,05 kHz. Intuitivement, je pense que c'est du même ordre de grandeur. C'est pourquoi je voudrais explorer des solutions avec perte, pour obtenir une réduction de plus de 50% avec une qualité encore acceptable.

Daniel
en haut - en bas
jasz
Visiteur
Date : 16/04/2005 à 08h48
Je vais essayer de te trouver ça dans mon tas de disquettes. Ensuite restera à savoir si la routine peut servir dans son ensemble sur thomson ou simplement si on doit s'en inspirer pour faire un packer spécial. Une chose me semble certaine, c'est que la routine de décrunching peut être adaptée.
en haut - en bas
jasz
Visiteur
Date : 16/04/2005 à 11h17
Bon, ça y est. J'ai retrouvé la d7

Maintenant, je vais isoler la routine et te la mettre en ligne dés que possible.
en haut - en bas
Daniel
Visiteur
Date : 23/04/2005 à 15h27
Pour illustrer ma méthode de compression, j'ai réalisé une petite démo.
Vous pouvez la charger à la page Programmes du site dcmoto : Agathe Rage (Live).



C'est un son 6 bits 22050 Hz compressé en 4 bits, et décompressé en temps réel sur TO8
Si vous trouvez une meilleure méthode de compression, je suis toujours preneur

Daniel
en haut - en bas
Daniel
Visiteur
Date : 23/04/2005 à 21h59
Les mélomanes ne semblent pas aimer le style Jimi Hendrix, j'ai fait une autre démo à leur intention.
Même page web que la précédente, triez la colonne catégorie pour trouver les démos, ou cherchez à la lettre B



Edit (24/04/05) : après une heure d'écoute on finit par se lasser. Je cherche toujours une compression plus efficace, pour jouer des morceaux moins répétitifs
Autre point : je m'aperçois avec horreur que le son original du Boléro est en 11025 Hz. Je joue donc du 22050 Hz pour rien. Je vais recommencer, patientez un peu...

Update 24/04/05 12h06 : Nouvelle version à partir d'un original 44,1 kHz 16 bits stereo (Dutoit - Montreal). Vous pouvez jeter la première version sans regret, et charger la nouvelle. Les aigus sont bien meilleurs, ça mérite presque de connecter la chaîne HiFi sur le TO8.

Dernières précisions : sur les 45 cycles entre 2 échantillons, il reste 9 cycles disponibles pour le décodage du demi-octet de gauche et 22 pour le demi-octet de droite. En optimisant on pourrait gagner 2 ou 3 cycles, mais guère plus. On pourrait aussi équilibrer le nombre de cycles disponibles (par exemple 15/16) en inversant les deux demi-octets.
Pour le Boléro, sur les 400000 échantillons, il n'y a eu que 8 overflows pour le codage sur 4 bits, et la propagation d'erreur n'a jamais dépassé l'échantillon suivant. Il y en a eu un plus pour le codage de Rage, mais la distorsion affecte au plus 2 échantillons successifs, et est totalement indiscernable. Ce n'est pas du lossless, mais presque

Daniel
en haut - en bas
Daniel
Visiteur
Date : 25/04/2005 à 09h19
La réponse de Fool-DupleX m'oriente sur une piste intéressante : au lieu de coder la différence avec l'échantillon précédent, coder la différence avec une valeur prévisible, extrapolée à partir des deux ou trois échantillons précédents. Sur Thomson on ne peut pas faire trop compliqué, je vais essayer des approximations polynomiales, en commençant par la plus simple : le 1er degré. Si j'arrive à coder un échantillon sur 3 bits, la compression sera de 50%. Pour faire mieux, il faudrait descendre à 2 bits. Intuitivement, je pense que c'est impossible.

Daniel
en haut - en bas
Daniel
Visiteur
Date : 26/04/2005 à 09h48
La méthode prédictive de degré 0 (prédiction = échantillon précédent) permet de compresser un son 6 bits sur 4 bits, comme dans les deux démos précédentes.

J'ai fait des statistiques avec une méthode prédictive de 1er degré (prédiction = extrapolation linéaire à partir des deux échantillons précédents). Elle devrait permettre de compresser sur 3 bits avec un taux d'erreur de l'ordre de 5% (donc assez loin du lossless).

J'étudie maintenant une méthode prédictive de 2eme degré (extrapolation polynomiale de degré 2 à partir des 3 échantillons précédents). J'ai espoir d'arriver à un taux d'erreur minime (voire nul) sur 3 bits. Il reste à faire des essais sur des sons variés, je publierai prochainement les résultats.

Evidemment la décompression est plus longue si le degré de la prédiction est plus élevé. C'est encore possible (du moins je l'espère) au deuxième degré en 22050 Hz. Mais on ne peut certainement pas faire mieux sur Thomson.

Une autre piste intéressante à explorer : en filtrant les aigus, on rend le signal beaucoup plus facile à compresser. Par exemple, avec un filtre passe-bas à 18000 Hz, il n'y a plus aucun overflow dans la démo du Boléro de Ravel. Il faudrait faire plus de statistiques, et aussi des tests d'écoute, pour déterminer s'il vaut mieux limiter la bande passante ou accepter quelques erreurs dûes à la compression.

Daniel
en haut - en bas
Fool-DupleX
Visiteur
Date : 26/04/2005 à 10h34
Cool tout ca. J'ai hate de voir les resultats. Mais je me pose une question : pourquoi est-ce plus long avec un degre eleve ? Tu fais du calcul pour decomprimer ?

Fool
en haut - en bas
Daniel
Visiteur
Date : 26/04/2005 à 11h16
Oui, le calcul de la prédiction est de plus en plus compliqué quand on augmente le degré. Si les échantillons précédents sont x1, x2, x3 (x3 étant le plus ancien), voici le calcul de la prédiction x :

degré 0 : x = x1
degré 1 : x = x1 + x1 - x2
degré 2 : x = x1 + x1 + x1 - x2 - x2 - x2 + x3

J'ai évidemment évité les multiplications (temps de calcul prohibitif).
En degré 2 il faudra une programmation subtile pour tenir en 45 cycles.
Je n'ose même pas calculer la formule du degré 3, c'est trop compliqué pour un pauvre Thomson.

Après avoir calculé la prédiction, il suffit d'ajouter la valeur lue (sur 3 bits) pour obtenir l'échantillon 6 bits à jouer.

Daniel
en haut - en bas
Fool-DupleX
Visiteur
Date : 26/04/2005 à 14h08
Les valeurs x sont sur 3 bits ? Si oui, ne peux-tu pas utiliser une look-up table de 512 valeurs precalculees ?

Fool
en haut - en bas
Daniel
Visiteur
Date : 26/04/2005 à 15h15
Les prédictions (comme les échantillons originaux) sont sur 6 bits. C'est trop pour travailler avec des tables.

J'ai pu faire des essais d'extrapolation de degré 2. Ils se révèlent finalement moins bons qu'en degré 1

Mais j'ai trouvé d'autres idées intéressantes ici . En particulier, le codage des entiers en longueur variable (Rice Code et Elias Code), particulièrement bien adapté pour stocker les différences avec la prédiction. C'est zéro dans près de 50% des cas, et zéro se code sur un bit, d'où un taux de compression très élevé. Autre avantage, cette méthode permet le lossless, puisqu'il n'y a pas de limite dans la taille du nombre. Voir en particulier TechRep137.pdf.

Je m'oriente donc maintenant vers une extrapolation linéaire et un codage des différences en longueur variable. A suivre...

Daniel
en haut - en bas
Daniel
Visiteur
Date : 26/04/2005 à 16h25
Pour me motiver dans ces recherches de méthodes de compression, vous devriez me donner vos réactions pour les 2 démos.

Les avez-vous écoutées
Vous préférez Agathe ou Charles Dutoit
Est-ce intéressant ou pas, comparé à ce qui a déjà été fait

Daniel
en haut - en bas
Daniel
Visiteur
Date : 26/04/2005 à 20h16
Nouveaux tests effectué sur le Bolero de Ravel de la démo précédente :

Original 6 bits 22050 Hz, 425984 échantillons, 16,3 secondes = 319488 octets
Compression lossless avec prédiction de degré 1, en 4 bits = 212992 octets
Compression lossless degré 1, longueur variable Rice code = 127683 octets

Y-a-pas-photo La dernière solution donne un taux de compression de plus de 60% en lossless.
Il ne reste plus qu'à programmer tout ça...

Que voulez-vous comme genre de musique pour la prochaine démo

Daniel
en haut - en bas
Fool-DupleX
Visiteur
Date : 27/04/2005 à 09h11
Bravo pour tes resultats Daniel. Combiner la prediction avec les codes de Rice etait une excellente idee. Ca donne envie de faire une disquette avec un maximum de son combine avec un formattage a 760 Ko ca ferait pret d'une minute 30 de son en haute qualite... miam ... bon mais je suppose qu'on est limite par les 512 ko de ram max de la machine puisqu'on va tout charger d'abord...

J'espere que tu nous feras profiter de ton code ? Quand tu dis lossless, ca veut dire qu'il n'y a eu aucune erreur de prediction ?

Fool
en haut - en bas
Pages : 1 - 2