Opérations sur les données PCM
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 33

Opérations sur les données PCM



  1. #1
    invite90e0b50a

    Angry Opérations sur les données PCM


    ------

    Bonjour à toutes et à tous,

    j'utilise un codec audio, le MAX9867 pour ne pas le nommer. Via l'I²S je peux recevoir des données audio PCM et lui en envoyer. Jusqu'ici j'ai pas trop de problème. J'essaie d'extraire la voie gauche et la voie droite et de leur appliquer un gain. Seulement, j'ai dû me tromper dans les opération et/ou je ne dois pas avoir bien compris le pcm car je n'arrive pas à mes fins.

    Voilà ce que je fais avec mon microcontrôleur(SAM3S4C de chez ATMEL) :

    1) je reçois dans un registre 32bits les deux mots 16 bits correspondant à la voie gauche et la voie droite depuis mon codec audio;
    2) j'extrais la voie gauche depuis les 16 bits de poids fort, j'extrais la voie droite depuis les 16 bits de poids faible
    3) je multiplie voie gauche par ma valeur de volume, de même pour la voie droite
    4) je concatène voie gauche et voie droite pour mise dans le registre 32bits en vue d'un envoie
    5) envoie vers le codec audio

    Ma valeur de volume est un pourcentage du signal original, donc un gain <= 0

    lorsque le gain vaut 0, le son est ok. Mais lorsque le gain < 0, le son "crache" (Mes excuses aux experts acoustique, je n'ai pas le terme technique correspondant).

    Auriez-vous une idée de quelle(s) erreur(s) j'aurais pu commettre?

    Cordialement.

    -----

  2. #2
    invite90e0b50a

    Re : Opérations sur les données PCM

    Quand je ne fais que renvoyer au codec ce qu'il m'envoie, les voies gauches et droites sont inversées.

    Je précise que ça ne peut pas être une inversion physique des canaux, j'utilise la carte d'évaluation MAX9867EVKIT sur laquelle se trouvent deux connecteurs RCA rouge et blanc auxquels j'ai brancher un cable RCA/JACK que j'ai relié à la sortie casque d'un ordinateur pour tester.

    Cordialement.

  3. #3
    Tropique

    Re : Opérations sur les données PCM

    Bonjour,

    Si tu as une inversion des voies, est-ce que ce n'est pas l'ordre de lecture des 32 bits que tu interprètes mal? Le LSB se retrouverait à la place du MSB et vice-versa. Tant que tu te contentes de recopier bit à bit l'entrée sur la sortie, ça n'a pas d'effet apparent, mais dès qu'entre les deux il y a des opérations qui supposent un certain ordre des bits, c'est le bazar intégral.
    Pas de complexes: je suis comme toi. Juste mieux.

  4. #4
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour,

    merci pour ta réponse rapide. A y réfléchir, je crois que j'ai un problème dans ma configuration de ma communication I2S. En effet, je vois pas pourquoi quand je ne fais que copier la valeur du registre de réception dans le registre de transmission ça me fait une inversion des canaux. Peut être un problème de synchronisation....Je vais creuser déjà ça.

    Par contre. je suis un peu perdu entre les différentes variante du PCM et je n'ai pas vraiment trouvé la méthode utilisée par le MAX9867 pour encoder le signal audio.

    Encore merci.

  5. A voir en vidéo sur Futura
  6. #5
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour,

    J'ai vérifier la configuration : j'ai bien MSBF sur l'entrée comme la sortie du SAM3S4C et les données sont en MSBF selon la datasheet du MAX9867.Lorsque je prends les 16 bits de poids fort de l'entrée et que je les place sur les 16 bits de poids faible du registre de sortie et que je place les 16 bits de poids faible du registre d'entrée sur les 16 bits de poids fort de la sortie, j'obtiens bien une inversion des canaux.

    Je travaille avec des datas PCM Stéréo 48kHz 16 bits. Je n'ai pas très bien compris comment fonctionne l'application d'un gain sur ces datas.
    J'ai donc pour un canal un entier signé sur 16 bits. Si je veux appliquer un gain de -20, dois je soustraire 20 ou dois je diviser par 10 la valeur?

    Cordialement.

  7. #6
    invite90e0b50a

    Re : Opérations sur les données PCM

    Petite précision concernant l'inversion que j'avais au départ :

    j'ai simplement configurer l'I2S du SAM3S avec LRCLK inversé soit état haut pour la voie gauche et état bas pour la voie droite.
    Or, dans le même temps je configurais le MAX9867 en LRCLK non inversé soit état bas pour la voie droite et état haut pour la voie droite.
    D'où l'inversion des canaux (honte à moi je vais me repentir au près de GladOS).

    Cordialement

  8. #7
    invite90e0b50a

    Re : Opérations sur les données PCM

    Je bute toujours sur l'application du volume...

    Quelqu'un aurait-il déjà travaillé avec le PCM?

    Cordialement.

  9. #8
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour

    Je me permet de transmettre les liens vers les datasheet.

    Je suis certainement passé à côté d'un détail important je ne vois pas quoi :

    http://datasheets.maxim-ic.com/en/ds/MAX9867.pdf

    http://www.atmel.com/Images/doc6500.pdf


    Cordialement

  10. #9
    invite90e0b50a

    Re : Opérations sur les données PCM

    UP

    Cordialement.

  11. #10
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour,

    personne ne saurait m'expliquer comment appliquer le gain sur les datas PCM du MAX9867?

    Cordialement.

  12. #11
    Tropique

    Re : Opérations sur les données PCM

    Citation Envoyé par technosvitman Voir le message
    Bonjour,

    personne ne saurait m'expliquer comment appliquer le gain sur les datas PCM du MAX9867?

    Cordialement.
    Sans vouloir te détourner de Futura, je pense que tu aurais plus de chances dans les rubriques ad hoc de forums plus spécifiques par rapport à ton souci.

    Je pense par exemple à DIYaudio, ou à EDAboard, il y en a d'autres (toujours anglophones).
    Pas de complexes: je suis comme toi. Juste mieux.

  13. #12
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour,

    merci pour l'info Tropique. Dès que j'ai la solution je la posterais néanmoins ici.
    Ceci dit, si quelqu'un a une solution à apporter, je suis toute ouïe.

    Merci.

  14. #13
    bobflux

    Re : Opérations sur les données PCM

    > Ma valeur de volume est un pourcentage du signal original, donc un gain <= 0
    > lorsque le gain vaut 0, le son est ok.
    > Mais lorsque le gain < 0, le son "crache"

    Ceci ne veut rien dire, il faut que tu expliques plus clairement ton algo.

    Un gain de 0 correspond à un volume de sortie nul puisque tu multiplies le signal par 0. À moins que ton gain ne soit en dB ? Dans ce cas c'est quoi cette histoire de pourcentage ?

    La façon standard est un calcul en virgule fixe :

    1- prends ton sample sur 16 bits (-32768 .. 32767)
    2- multiplie par une valeur entière G
    3- clipping et dithering
    4- décale à droite de N bits : tu obtiens ta valeur de sortie sur 16 bits
    5- Ne pas oublier lors du recollage des morceaux de 16 bits en double échantillon 32 bits qu'il y a des bits de signe qui traînent dans les MSB donc un petit masquage est nécessaire

    Par exemple tu peux définir que G=256 correspond à un gain de 1 soit 0dB, et N=8 bits. Si G=64 le signal est multiplié par 0.25, si G=1024 il est multiplié par 4. Le gain est donc G / 2^N

    Si ton gain peut être supérieur à 1 le clipping est indispensable : il suffit de tester si le signal dépasse les bornes de la valeur de destination qui n'a que 16 bits, et si oui, de le limiter à la borne supérieure ou inférieure. Sans ça, en cas de dépassement, tu auras un overflow et ça sera dégueulasse.

    Le dithering consiste à ajouter un peu de bruit au signal pour moyenner les erreurs d'arrondis. Si tu ne fais pas de hifi, ce n'est pas nécessaire.

    Au fait ton codec a un contrôleur de volume dedans...
    Dernière modification par bobflux ; 07/05/2012 à 11h46.

  15. #14
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour,

    autant pour moi Bobfuck, j'ai oublié l'unité. Quand je marquais gain 0 c'était Gain = 0dB, donc une amplification de 1 soit 100%. du coup lorsque je disais Gain<0 c'était pour une amplification <1, soit une valeur supérieur ou égale à 0% et strictement inférieur à 100%.
    J'ai précisé les deux différentes notations pour essayer d'être clair mais visiblement ce n'est pas le cas, toutes mes excuses.

    Pour ce qui est de l'algorithme, j'ai visiblement fais ce qu'il fallait.
    Mon erreur viendrais donc dans la récupération des données PCM via le bus I2S.


    J'avais bien vu le contrôle de volume du codec que j'utilise déjà pour régler le volume générale de ma sortie.
    Pourquoi appliquer un nouveau volume dans ce cas sur les données PCM?
    Je dois réaliser un mixage audio avec d'autres données PCM.
    C'est pour cela que j'applique des amplification entre 0 et 1.

    En te remerciant, tu viens de m'aider à bien débrousailler le terrain.

  16. #15
    invite90e0b50a

    Re : Opérations sur les données PCM

    J'ai tout de même un soucis :

    Dans mon mot de 32 bits, mes bits de poids forts sont la voie gauche et les bits de poids faible la voie droite

    31 16 15 0
    [ voie gauche] [ voie droite]

    Si j'inverse les deux demi mots :

    31 16 15 0
    [ voie droite] [ voie gauche]

    en faisant en C : Output = ((Input>>16)&0xFFFF) | ((Input&0xFFFF)<<16); avec Input et Output des unsigned long int

    J'obtiens l'inversion des voies mais avec une son dégoutant sur une des voies.

    Lorsque je fais Output = Input, tout se passe bien

    Là moi pas comprendre. Je devrais avoir un son nikel normalement, non?

    Cordialement.

  17. #16
    bobflux

    Re : Opérations sur les données PCM

    Je suppose que Input et Output sont des variables de type entier 32 bits, pas des registres hard, yes ?

    Attention : entiers signés ou unsigned ?

  18. #17
    invite90e0b50a

    Re : Opérations sur les données PCM

    Hello,

    Citation Envoyé par bobfuck Voir le message
    Je suppose que Input et Output sont des variables de type entier 32 bits, pas des registres hard, yes ?

    Attention : entiers signés ou unsigned ?
    Dans mon derniers poste j'ai précisé : Avec Output et Input des Unsigned Long Int.

    Il s'agit donc bien d'entiers non signé sur 32 bits.
    Je copie dans Input un ensemble PCM gauche et droite que je reçois dans mon registre de réception par I2S.
    Je copie depuis Output l'ensemble PCM résultant dans le registre de transmission par I2S

    étant sur une architecture 32 bits, mes registres sont donc eux aussi en 32 bits.

    Merci pour ta réponse.

  19. #18
    bobflux

    Re : Opérations sur les données PCM

    bizarre ton bug

    peux-tu prendre à l'oscillo ce qui sort du codec quand le son est pourri ? avec un sinus en entrée ce serait bien...

  20. #19
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour,

    une partie du problème venait du recouvrement d'interruption et du temps d'exécution de celle-ci.

    Maintenant je tourne avec 3 buffer que je sélectionne tour à tour :

    à l'initialisation :
    buffer 0 en entrée, buffer 0 en traitement, buffer 0 en sortie
    buffer 1 en entrée, buffer 0 en traitement, buffer 0 en sortie

    boucle de fonctionnement :
    buffer 2 en entrée, buffer 1 en traitement, buffer 0 en sortie
    buffer 0 en entrée, buffer 2 en traitement, buffer 1 en sortie
    buffer 1 en entrée, buffer 0 en traitement, buffer 2 en sortie

    Maintenant, lorsque je divise par deux mon signal, j'ai un bruit (qui semble blanc) qui s'ajoute mais le volume s'applique bien.
    Quand je multiplie, le signal est amplifié bien que saturation à partir d'un certain niveau ( ce qui est plus que normal comme tu me l'as confirmé Bobfuck)

    Cordialement.

  21. #20
    bobflux

    Re : Opérations sur les données PCM

    Si ça sature, c'est normal. Ce qui craint, c'est les overflows (ie, sample à 16384, gain 2, résultat -32768 en 16 bits signé)...

  22. #21
    invite90e0b50a

    Re : Opérations sur les données PCM

    En prévention je fais les calcul avec des entiers signés sur 32 bits

    J'ai une valeur de volume entre 0 et 4096

    du coup avec les variable inLeft, inRight, outLeft, outRight et volume, entier 32 bits signés et pcm (l'ensemble des deux canaux), entier 32 bits non signé, j'ai la formule suivante :

    inLeft = (cast préalable en entier signé 16 bits)(pcm>>16);
    inRight = (cast préalable en entier signé 16 bits)(pcm & 0xFFFF);

    outLeft = (inLeft * volume) >> 12;
    outRight = (inRight * volume) >> 12;

    Lorsque volume = 4096, le son est nikel;
    Lorsque volume = 0, les son est bien coupé;
    Lorsque 0 < volume < 4096, le volume est bien appliqué sur le signal d'entrée mais un bruit blanc s'additionne.

    En te remerciant encore pour ton aide

  23. #22
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour à toutes et à tous,

    je reviens avec mon problème.
    Ma question se porte désormais sur le dithering. SI j'ai bien compris il s'agit de générer un bruit et de l'ajouter pour compenser les erreurs d'arrondis.
    Quelqu'un aurait-il un algorithme plutôt léger pour appliquer ce dithering? Je travail sur un SAM3S1B, j'ai donc pas forcément beaucoup de puissance de calcul.

    Cordialement.

  24. #23
    bobflux

    Re : Opérations sur les données PCM

    Le dithering c'est pour avoir une meilleure qualité sonore, es-tu sûr d'en avoir besoin ? Quelle est l'application ?

  25. #24
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour Bobfuck et merci pour ta réponse.

    L'application est la suivante : j'ai plusieurs fichiers wave PCM sur une carte SD. Je mixe les fichiers qui m'intéressent entre eux en appliquant sur chacun un volume spécifique. Le tout ressort dans un codec audio. Le but est d'avoir une qualité sonore correcte sans être du matériel d'audiophile de pointe.

    En fait, j'ai toujours mon problème persistant :

    - quand je mets volume = 0% le signal est coupé,
    - quand je mets volume = 100% le signal est au max et tout à fait nikel,
    - quand je mets toute autre valeur le volume est appliqué, mais un bruit (à priori blanc) s'ajoute.

    Il est vrai que cela me parait bizarre. Je n'ai pas de saturation étant donné que je ne fais qu'atténuer le signal.
    J'avoue ne pas savoir pourquoi j'ai cela, peut être qu'un enregistrement audio te donnerait une meilleur idée de mon problème.
    Je te prépare ça.

    Merci

  26. #25
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bobfuck et ceux que ça peut intéresser,

    j'ai mis en pièce jointe un zip contenant:

    - sinus_440.ogg : le signal d'entrée
    - sinus_440_100.ogg : la sortie pour un volume de 100%
    - sinus_440_90.ogg : la sortie pour un volume de 90%
    - sinus_440_10.ogg : la sortie pour un volume de 10%

    Bien cordialement.
    Fichiers attachés Fichiers attachés

  27. #26
    bobflux

    Re : Opérations sur les données PCM

    Tu as regardé les formes d'ondes ? Je suppose que non !

    La 100 sature à mort, les autres contiennent uen vague trace de fondamentale et du bruit... tu as un gros problème quelque part dans ta chaîne ! Faut tester élément par élément (ADC,DAC...)

    Nom : Capture-8.jpg
Affichages : 68
Taille : 125,3 Ko

  28. #27
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour Bobfuck

    Youps, autant pour moi j'ai envoyé trop fort dans le système. J'ai relié la sortie casque du pc qui me joue le son sur les entrées lignes du MAX9867, donc forcément ça n'aide pas. Les ADC du max9867 ne sont pas en cause. Je vais refaire l'enregistrement. Il risque d'y avoir un léger bruit du à la mauvaise qualité de ma carte son. Cependant, ce que tu entends dans les fichiers pour les volumes 10 et 90 est parfaitement représentatif de mon problème.

    Là encore, un grand merci pour ton aide.

  29. #28
    bobflux

    Re : Opérations sur les données PCM

    OK, pas la peine de poster les wav, mets juste une capture d'écran (oscillo ou audacity ou autre logiciel d'édition de son) de ce qui entre et sort de ta carte... avec ajustement des niveaux pour éviter les saturations.

    Tes wav 10 et 90 ont vraiment une drôle de tronche !

    T'aurais pas inversé le sens des bits ? regarde si tes ADC et DACs sont configurés pareil (avec le LSB du même côté sur la liaison I²S)... et aussi les périph du uC qui sont au bout de la liaison I²S... Ça te fait 4 configs à vérifier. Pour être sûr, mets en entrée du silence, tu auras un peu de bruit dans les LSB, et regarde au scope sur les liaisons I²S si les bits qui bougent sont bien les LSB. Il y a énormément de façons de configurer des transmetteurs série, donc énormément de façons de se planter...

    Aussi puisque tu as la stéréo, modifie ton code pour mettre en sortie sur un canal l'onde numérisée en entrée sans aucun changement, et sur l'autre canal le résultat du traitement de volume. Ça permettra de comparer.
    Dernière modification par bobflux ; 01/06/2012 à 14h20.

  30. #29
    bobflux

    Re : Opérations sur les données PCM

    J'oubliais :

    Vérifie au scope que les liaisons I²S (bitclock, wordclock, data) sont bien comme tu attends, les bits dans le bon ordre, pas décalées d'un ou deux bits dans un sens ou dans l'autre par rapport au word clock, que le bon bit est bien calé sur le bon front du word clock, etc.....

  31. #30
    invite90e0b50a

    Re : Opérations sur les données PCM

    Bonjour Bobfuck,

    encore merci pour toutes ces indications. Le périphérique I2S du microcontrôleur est bien en MSBF en entrée comme en sortie. Le codec audio est lui aussi en MSBF. J'ai fait l'expérience de changer quelques paramètres. Résultat : même pour le volume 100% le son est affreux voir pas du tout transmis.
    Je continue à investiguer ( ainsi que pleurer ).


    Merci.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Opérations sur les cardinaux
    Par Seirios dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 14/10/2010, 08h03
  2. Opérations sur les fonctions
    Par invite1f1adff3 dans le forum Mathématiques du collège et du lycée
    Réponses: 0
    Dernier message: 21/09/2010, 19h50
  3. Opérations sur les puissances
    Par invite93e0873f dans le forum Mathématiques du collège et du lycée
    Réponses: 12
    Dernier message: 20/10/2007, 02h45
  4. Operations sur les fonctions
    Par invite99988267 dans le forum Mathématiques du collège et du lycée
    Réponses: 6
    Dernier message: 16/09/2007, 11h04
  5. Opérations sur les limites
    Par invited6c27078 dans le forum Mathématiques du supérieur
    Réponses: 9
    Dernier message: 15/03/2006, 18h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...