DCMOTO - Emulateur universel Thomson 8 bits : Forum - Programmation - Compression des sons
|
|
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 à 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 |
|
|
|