HectorDuino

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: HectorDuino

Message par Daniel »

D'après la documentation, SimpleAudio ne sait lire que le répertoire principal. Et encore, pas dans tous les cas : en FAT32, seul le premier cluster du répertoire principal est exploré. Le nombre de fichiers accessibles est donc limité par la taille du cluster. Si la valeur maximum est choisie lors du formatage, c'est beaucoup. Par contre si le cluster est tout petit ce n'est qu'une dizaine de fichiers. En FAT16 le répertoire principal n'est pas fragmenté, il n'y a pas de limite autre que celle du système.

Pour information, j'ai les mêmes limites dans le programme SDSEL utilisé avec le contrôleur CS91-280. La raison est la complexité du traitement complet de la FAT32, qui ne tiendrait pas en mémoire du MO5. Par contre, contrairement à SimpleAudio, mon programme SDSEL traite les noms longs (limités à 39 caractères pour une lecture plus facile sur un écran de 40 colonnes).
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

ok, merci de l'info
JJ
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

Question : Avec un son 1 bit à 15Khz, croyez vous que le son serait reconnaissable ?
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: HectorDuino

Message par __sam__ »

Oui. Daniel avait fait des essais à une fréquence voisine (17khz) si j'ai bonne mémoire. Ca ne sera pas de la haute qualité, mais une grosse radio "grande ondes": les haute fréquences inaccessible mais les basses correctes. Avec un bon filtre passe pas, tu dois pouvoir en tirer quelque chose.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

Tu as des fichiers de cette lointaine époque ?
Je ferais bien un essai... :oops:
si oui, le format du fichier ? 00 ou FF en raw ?
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: HectorDuino

Message par __sam__ »

J'ai retrouvé le fil qui en parlait: http://forum.system-cfg.com/viewtopic.p ... 428#p96428

Le format c'est 8 bits par octet. Ils sont extraits un à un de chaque octet lu.

Avec 15khz, la qualité devrait être sensiblement la même que du 5khz sur 3 valeurs. C'est pas exceptionnel, mais c'est à essayer. Dans http://forum.system-cfg.com/viewtopic.p ... 22#p107522, il y a un script qu'on peut adapter pour du 15khz. Plus généralement, dans ce fil il y a des pointeurs sur des algorithmes de dither audio pas mauvais du tout. Au fait, les 15khz sont ils une fréquence en bit ou en octets? Si c'est en octet, ca veut ire que tu peux atteinre 8*15=120kbits.. ce qui serait vraiment, vraiment excellent.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

non je suis bien en 1 bit à 15khz.

Le principe serait de modifier Le 1er octet de mes trames de 4 octets pour travailler en 7 bits pour les offset et y glisser le bit audio en bit de poids fort sur ce même octet.
étant à 60ko/s avec des blocs de 4 octets, cela fait 60/4 = 15 ko/s pour le 1er octet d'offset avec son bit de son... donc bien 15KHz sur 1 bit !

Il faudra quand même que je valide la qualité des vidéos produites avec des offsets limités à des pas de 127 octets (soit 2 lignes) au lieu d'offsets à 255 (4 lignes).
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

Bon cet aprem j'ai essayé un peu de son...
A part des crachouillis (en rythme quand même) ça donne pas beaucoup. :cry:
par contre j'ai pas du tout optimisé le code pour monter en fréquence...De plus l'encode se contente de faire un :
Vout = (Vin >0 ) ? 0, FF

Bref pas mal d'optimisation avant de vous présenter le moindre son... C'est ballot car pour la vidéo, ma première était plus prometteuse que le 1er son... :( :(
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: HectorDuino

Message par __sam__ »

yo_fr a écrit :Vout = (Vin >0 ) ? 0, FF
Ah oui. Cette formule est trop simple. Elle encore juste la fréquence, mais aucunement le volume. Jette on œil aux schémas et au script dans le fil sur le PWM sur MO5. Les formules de vrai dither sont simple à mettre en œuvre. Il y a une rétro-action qui change tout!
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

Je veux bien un petit coup de main :
J'ai toujours des sons pas terrible (comme du morse) alors que j'ai mis en place l'une de tes équations, sam...
Je suis en VBNet (Byte = 8bits, Sbyte = 8bits signés, Interger = 32 bits signés , je précise ça car j'ai commencé à regardé le Perl et l'une des choses les plus déstabilisante du Perl et la perte de références de la nature des variables.... :wink: ).

Code : Tout sélectionner

        Dim Fichout(65536) As Byte
        Dim V As SByte
        Dim out As Byte
        Dim Sample, OutTemp, d1, d2 As Integer


        For b = 0 To Longeur          ' Nb de bloc
            For a = 0 To &H10000 - 1  ' Bloc de 64Ko
                Sample = Donnee_Source((a + b * &H10000))  '  Récupération du Sample (mono) 
                OutTemp = Sample - 128                     '  passage en signé
                OutTemp = OutTemp + (d2 * -1)              '  Recupération de l'erreur n-2
                OutTemp = OutTemp + (d1 * 2)               '  Recupération de l'erreur n-1


                If OutTemp > 0 Then
                    out = &H80 'mise en place du bit son
                Else
                    out = &H0  'mise en place du bit son
                End If
                Fichout(a) = out
                d2 = d1             ' Déplacement de l'erreur
                d1 = V - out        ' Calcul nouvelle erreur !
          Next A
          Append au fichier son pour Hector de Fichout()
       Next b

A noter que le sample source est en 22,050 KHz et que le player passe le fichier Fichout() à 19,6 KHz. Je devrais donc entendre le son un peu au ralentis, mais c'est même pas reconnaissable....

:oops: Merci d'avance !


[EDIT] : Integer 32 bits signés, bien sur !
Dernière modification par yo_fr le 26 oct. 2015 09:46, modifié 1 fois.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: HectorDuino

Message par __sam__ »

En perl les variables sont non typées. Elles contiennent des nombres ou des strings qui sont connverties au bon format suivant le contexte. En pratique tu peux considérer que les nombres sont tous des doubles.

En première lecture du basic un truc me semble suspect. V (utilisé dans la formule finale) n'est pas initialisé. Il faudrait utiliser "Sample" (l'échantillon désiré). Par ailleurs, on soustrait V ou Echantillon (non signé: 0..255) à out (non-signé 0 ou 128). Il faudrait que out vaille 0 ou 255 pour être cohérent avec les valeurs de l'échantillon.

Je tenterais la formule:

Code : Tout sélectionner

d1 = Sample - (out*255/128)
Est-ce que ca améliore quelque chose ?
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

Oops,
J'ai propreté mon code pour le montrer et la variable Sample devait remplacer V....
(Cela ne change pas mon problème, sauf depuis que j'ai publié le code modifié avec la mauvaise variable ce qui donnait ... aussi pire ! :x

De toutes façon c'est pareil...
Pour être sur voici la nouvelle mouture... (c'est vrai que pour le coup c'est ch..ant de devoir caster à tour de bras... :wink: )

Code : Tout sélectionner

        For b = 0 To Longeur          ' Nb de bloc
            For a = 0 To &H10000 - 1  ' Bloc de 64Ko
                Sample = Donnee_Source((a + b * &H10000))  '  Récupération du Sample (mono) 
                OutTemp = Sample - 128                     '  passage en signé
                OutTemp = OutTemp + (d2 * -1)              '  Recupération de l'erreur n-2
                OutTemp = OutTemp + (d1 * 2)               '  Recupération de l'erreur n-1


                If OutTemp > 0 Then
                    out = &H80 'mise en place du bit son
                Else
                    out = &H0  'mise en place du bit son
                End If
                Fichout(a) = out
                d2 = d1             ' Déplacement de l'erreur
                d1 = Sample - out   ' Calcul nouvelle erreur !
                d1 = Sample - (CInt(out) * CInt(255 / 128))

            Next a
            If (b = Longeur) Then
                Fichout(a) = 1 ' Fin de fichier en place !
            End If
            'Sauvegarde du fichier !
            Try
                Microsoft.VisualBasic.FileIO.FileSystem.WriteAllBytes(Directory & "\" & "Sound", Fichout, (b <> 0)) ' Append pour B=0
            Catch
                'Error sur fichier ! 

            End Try

        Next b
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: HectorDuino

Message par __sam__ »

Attention avec

Code : Tout sélectionner

 d1 = Sample - (CInt(out) * CInt(255 / 128))
CInt(255/128) vaut 1 donc ca ne change rien avec la formule d'avant.

On va y arriver. C'est juste que le filtre écrit tel qu'il est ne fait absolument pas le bon calcul.

Si je relis le script perl

Code : Tout sélectionner

$out = $v>0?$lvl:-$lvl;
signifie que out vaut -128 ou +128 suivant le signe de $v. Du coup d1 vaut Sample_signé - (+/- 128), ce qui n'est pas trop la formule du basic. Je pense qu'il faut faire

Code : Tout sélectionner

d1 = (Sample_nonsigné - 128) - (2*Cout - 128)
comme va avec un Cout=0 ou 128, on a d1 = Sample_signé +/- 128, ce qui est la bonne formule.

Par ailleurs OutTemp est déclaré intéger, dont tu signale que c'est 32bits non-signé. Donc le test OutTemp>0 est forcément toujours vrai, sauf si OutTemp est nul. Je préconise de laisser tomber les unsigned et les trucs sur 8 bits. Avec des entiers signés 32bits pour tout le monde, ca doit être bon (d1/d2 peuvent dépasser les capacités d'un byte).

Comment disent les Shadoks: plus ca rate, et plus on a de chance que ca réussisse la prochaine fois. :D
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: HectorDuino

Message par yo_fr »

Aie, ma fourche à langué !!
Interger c'est 32 bits signé.

Un truc aussi que j'ai vu :
Lors que je soustraits
d1 = Sample - (CInt(out) * CInt(255 / 128))

Out est limité aux valeurs 0 et 80h. J'ai donc changé le out pour qu'il soit = à -128 ou à 127.

(je corrige mon post pour l'integer unsigned)


PS : Pour l'instant c'est vrai que ça fait plus Shadok que Gibi !!!
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: HectorDuino

Message par __sam__ »

Fais aussi attention dans la définition de d1. C'est au sample signé qu'il faut soustraire, càd (Sample-128).

Code : Tout sélectionner

d1 = (Sample_nonsigné - 128) - (2*Cout - 128)
C'est le mix unisgned/signed qui complique tout.

Les filtres numériques ce sont des maths, c'est à dire des entiers relatifs ou des réels. Les unsigned c'est des trucs de bas niveau. Ils ne doivent pas intervenir dans la partie maths ou ca fait des trucs abominables (style il existe des valeurs sans inverse additif: -(-128)==-128 sur les SByte). Il faut s'en débarrasser au plus tôt dans le traitement des données par le filtre pour que ce dernier ne s'occupe que des maths. Dans ce monde là, la valeur -128 est autorisée, mais +128 aussi. Il faut donc oublier les bytes et travailler sur 16 bits mini.

En simplifiant: Ce sont donc les étages initiaux et finaux qui s'occupent de convertir de unsigned<->signed. Typiquement en entrée on soustrait 128, et en sortie ou l'ajoute (et on clamp à 255 quand ca dépasse). Au milieu tout est integer 16 bits mini voire double s'il y a des coefs à virgules (ce qui est le cas avec les autre valeurs de $DAMP dans le script perl).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Répondre