HectorDuino
Modérateurs : Papy.G, fneck, Carl
Re: HectorDuino
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).
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.
L'obstacle augmente mon ardeur.
Re: HectorDuino
ok, merci de l'info
JJ
JJ
Re: HectorDuino
Question : Avec un son 1 bit à 15Khz, croyez vous que le son serait reconnaissable ?
-
- Messages : 7983
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: HectorDuino
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: HectorDuino
Tu as des fichiers de cette lointaine époque ?
Je ferais bien un essai...
si oui, le format du fichier ? 00 ou FF en raw ?
Je ferais bien un essai...
si oui, le format du fichier ? 00 ou FF en raw ?
-
- Messages : 7983
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: HectorDuino
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.
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: HectorDuino
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).
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).
Re: HectorDuino
Bon cet aprem j'ai essayé un peu de son...
A part des crachouillis (en rythme quand même) ça donne pas beaucoup.
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...
A part des crachouillis (en rythme quand même) ça donne pas beaucoup.
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...
-
- Messages : 7983
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: HectorDuino
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!yo_fr a écrit :Vout = (Vin >0 ) ? 0, FF
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: HectorDuino
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.... ).
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....
Merci d'avance !
[EDIT] : Integer 32 bits signés, bien sur !
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.... ).
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....
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.
-
- Messages : 7983
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: HectorDuino
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:Est-ce que ca améliore quelque chose ?
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)
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: HectorDuino
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 !
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... )
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 !
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... )
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
-
- Messages : 7983
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: HectorDuino
Attention avec 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 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 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.
Code : Tout sélectionner
d1 = Sample - (CInt(out) * CInt(255 / 128))
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;
Code : Tout sélectionner
d1 = (Sample_nonsigné - 128) - (2*Cout - 128)
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.
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: HectorDuino
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 !!!
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 !!!
-
- Messages : 7983
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: HectorDuino
Fais aussi attention dans la définition de d1. C'est au sample signé qu'il faut soustraire, càd (Sample-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).
Code : Tout sélectionner
d1 = (Sample_nonsigné - 128) - (2*Cout - 128)
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos