France Hardware : Forums de discussion
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
22 637 membres enregistrés - 1 883 812 posts - 96 197 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Sujets divers
                [Algo/Maths/C++] Mon topic synthèse sonore/DSP
15 connectés(record : 207 le 05 juin 2007 - 05 h 23)

Vous devez vous connecter pour répondre au topic.
Precedent | 1,2
[Algo/Maths/C++] Mon topic synthèse sonore/DSP

iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 20 août 2005 - 22 h 36 m 58 s
Reprise du message précédent :


Je suis sceptique sur un point :

i = (Fs * k * SINTABSIZE) / Fe;

T'es pas forcement sur que c'est un int ... :chepa:




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


tempo
Zen

Messages : 2 177
Inscrit le 14/09/02
Ville : Grenoble (SMH)
Non connecté
  Posté le 21 août 2005 - 01 h 08 m 02 s


Le 20 août 2005 - 22 h 36, iraysyvalo a écrit :

Je suis sceptique sur un point :

i = (Fs * k * SINTABSIZE) / Fe;

T'es pas forcement sur que c'est un int ... :chepa:


c'est un peu la base du C :o
si tu fais des calcul entre entiers (+-/*), le resultat est un entier amoins de 'caster' un des entiers en float ou double...

t'as qu'a faire un gcc -S et voir le code assembleur:

Dans l'initialisation de la table de valeur, tu trouves du code qui manipule des flottants (les mnemo commencent par f: fildl, fmulp, ...)

    Code     
 1. 
 2. initSinTab:
 3.         pushl   %ebp
 4.         movl    %esp, %ebp
 5.         pushl   %ebx
 6.         subl    , %esp
 7.         movl    {TEXTE}, -20(%ebp)
 8.         jmp     .L2
 9. .L3:
10.         fildl   -20(%ebp)
11.         fldl    .LC0
12.         fmulp   %st, %st(1)
13.         fldl    .LC1
14.         fdivrp  %st, %st(1)
15.         fstpl   -16(%ebp)
16.         movl    -20(%ebp), %ebx
17.         subl    , %esp
18.         pushl   -12(%ebp)
19.         pushl   -16(%ebp)
20.         call    sin
21.         addl    , %esp
22.         fstpl   -32(%ebp)
23.         movl    -32(%ebp), %eax
24.         movl    -28(%ebp), %edx
25.         movl    %eax, sintab(,%ebx,8)
26.         movl    %edx, sintab+4(,%ebx,8)
27.         leal    -20(%ebp), %eax
28.         incl    (%eax)
29. .L2:
30.         cmpl    23, -20(%ebp)
31.         jle     .L3
32.         movl    -4(%ebp), %ebx
33.         leave
34.         ret
35.         .size   initSinTab, .-initSinTab
36. .globl compute
37.         .type   compute, @function
et dans le calcul du buffer de sortie, y'a que du traitement bien propre d'entiers et de pointeurs (hum, a mon gout ca passe trop par la pile, un codage 'a la mano' est plus joli que ce jus de gcc...)
    Code     
 1. 
 2. compute:
 3.         pushl   %ebp
 4.         movl    %esp, %ebp
 5.         subl    , %esp
 6.         movl    {TEXTE}, -8(%ebp)
 7.         jmp     .L7
 8. 
 9. .L8:
10.         movl    -8(%ebp), %eax
11.         movl    %eax, -4(%ebp)
12.         movl    -4(%ebp), %eax
13.         imull   16(%ebp), %eax
14.         movl    %eax, -4(%ebp)
15.         leal    -4(%ebp), %eax
16.         sall    , (%eax)
17.         movl    -4(%ebp), %edx
18.         leal    20(%ebp), %eax
19.         movl    %eax, -20(%ebp)
20.         movl    %edx, %eax
21.         movl    -20(%ebp), %ecx
22.         movl    {TEXTE}, %edx
23.         divl    (%ecx)
24.         movl    %eax, -20(%ebp)
25.         movl    -20(%ebp), %eax
26.         movl    %eax, -4(%ebp)
27.         leal    -4(%ebp), %eax
28.         andl    23, (%eax)
29.         movl    -8(%ebp), %eax
30.         sall    , %eax
31.         movl    %eax, %ecx
32.         addl    12(%ebp), %ecx
33.         movl    -4(%ebp), %eax
34.         movl    sintab+4(,%eax,8), %edx
35.         movl    sintab(,%eax,8), %eax
36.         movl    %eax, (%ecx)
37.         movl    %edx, 4(%ecx)
38.         leal    -8(%ebp), %eax
39.         incl    (%eax)
40. .L7:
41.         movl    -8(%ebp), %eax
42.         cmpl    8(%ebp), %eax
43.         jb      .L8
44.         leave
45.         ret
46.         .size   compute, .-compute
47.         .section        .rodata
48. .LC3:
49.         .string "%u\t%f\n"
50.         .text

(PS: dans ce compute, j'ai remplace la multiplication TABSIZE par un decalage a gauche)




tempo
Zen

Messages : 2 177
Inscrit le 14/09/02
Ville : Grenoble (SMH)
Non connecté
  Posté le 21 août 2005 - 11 h 25 m 41 s
allez, je me defoule un peu...
donc toujours la meme fonction 'compute' mais cette fois ci compilée avec l'option -mcpu=pentium3 de gcc. on passe moins par la pile... (nos variables sont directement dans les registres 32 bits de la CPU). A noter que les seules instructions sur de flottants sont un fldl (lecture de la table de valeur) et fstpl (ecriture dans le buffer de sortie)

    Code     
 1. compute:
 2.         pushl   %ebp
 3.         xorl    %ecx, %ecx
 4.         movl    %esp, %ebp
 5.         pushl   %edi
 6.         movl    16(%ebp), %edi
 7.         pushl   %esi
 8.         movl    8(%ebp), %esi
 9.         pushl   %ebx
10.         movl    20(%ebp), %ebx
11.         cmpl    %esi, %ecx
12.         jae     .L16
13.         .p2align 4,,15
14. .L14:
15.         movl    %ecx, %eax
16.         xorl    %edx, %edx
17.         imull   %edi, %eax
18.         sall    , %eax
19.         divl    %ebx
20.         andl    23, %eax
21.         fldl    sintab(,%eax,8)
22.         movl    12(%ebp), %eax
23.         fstpl   (%eax,%ecx,8)
24.         incl    %ecx
25.         cmpl    %esi, %ecx
26.         jb      .L14
27. .L16:
28.         popl    %ebx
29.         popl    %esi
30.         popl    %edi
31.         popl    %ebp
32.         ret
33.         .size   compute, .-compute
34.         .section        .rodata.str1.1,"aMS",@progbits,1
35. .LC4:
36.         .string "%u\t%f\n"
37.         .text
38.         .p2align 4,,15
39. 


EDIT: ces :nrv: balises de code:
- faudra ajouter l'assembleur (generique, pas besoin de coloration syntaxique car avec tous les types de CPU ca risque d'etre dur de gerer les nom de registre et mnemo...)
- il faut lire sall 'dollar' 10, %eax et andl 'dollar' 1023, %eax


Message édité 3 fois, la dernière par tempo le 21 août 2005 - 11 h 38.


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 21 août 2005 - 18 h 41 m 18 s
Ah oui, je me suis un peu emballé pour la division :dd:
Bon, allez, j'implémente tout ça dès que j'ai fini avec ma modulation de phase (le code est super simple, mais je vais faire appel à tes lumière pour voir si tu peux m'aider à rendre le processus plus facile) et mon BufferViewer (gnuplot a l'air bien mais c'est encore mieux quand les graphiques sont le fruit de nos entrailles :P ).

Je vois que l'assembleur ne te fait pas peur... Ça tombe bien, je comptais me faire un peu d'optimisation en MMX/SSE !

Et tu sais pourquoi gcc prend la syntaxe AT&T ? edit : et c'est quoi, ces l à la fin des mnémos :???: ?

edit : au temps pour moi, ce sont les mnémos avec AT&T... voir http://bulkan.upm.edu.ph/~pfalcone/compsci/lang.html pour que je me réponde à ma question !


Message édité 2 fois, la dernière par Petit_PimoOosE le 22 août 2005 - 05 h 10.

Huile de fraise.

iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 22 août 2005 - 17 h 32 m 20 s

Attends attends tempo ..

Je sais que le compilateur, il s'en fout, pour lui ce sera a un int .. pour lui, t'es sense savoir ce que tu fais.

Le probleme est qu'en toute generalite, le numerateur n'est pas forcement un multiple de la frequence Fe. Bref, bon, je m'egare ! :lol:




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 22 août 2005 - 18 h 43 m 35 s
Ah c'est sûr, mais de toute façon, il nous faut un int en sortie, et c'est un peu le principe de la table, de ne pas faire les valeurs intermédiaires. Après, il faut interpoler... Allez, je me bouge !



Huile de fraise.

Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 22 août 2005 - 19 h 31 m 58 s
Bon, je suis en train de créer un projet SourceForge. Par contre, je ne sais pas encore quelle license utiliser, sachant que je ne suis pas sûr que la GPL soit celle que je veux...

Par ailleurs, je ne suis pas sûr qu'il reste intéressant de faire de l'interpolation quand on utilise une table, à partir du moment où on dispose de méthodes comme la synthèse récursive. Je suis bon pour faire des benchs...



Huile de fraise.

tempo
Zen

Messages : 2 177
Inscrit le 14/09/02
Ville : Grenoble (SMH)
Non connecté
  Posté le 22 août 2005 - 20 h 03 m 49 s
pour la division, si le resultat n'est pas entier il est arrondi a l'entier inferieur.
evidement on genere une erreur sur l'index i.

de la, on peut evidement interpoler entre sintab[i] et sintab[i+1].

mais si le nombre d'elements n dans le tableau est suffisament important l'erreur est assimilable au plus a celle due a un dephasage de 2*PI/n: elle est bornée entre 0 (cas ou la division est precisement i) et sin (2*PI*i/n)-sin(2*PI*(i+1)/n) (cas ou la division tend vers i+1) ...
(la j'ai plus mes formules de developpements limités trigo...)

A comparer a la distorsion due a l'echantillonage... (alors, la DHT ? :D )

Pour la licence: LGPL !!! :yes: (si tu veux vraiment que ce soit libre de chez libre...)




iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 23 août 2005 - 11 h 33 m 05 s

Ok, effectivement, entre les bruits, les distorsions et autres :)

Huh, c'est quoi la synthese recursive de signal ?




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


tempo
Zen

Messages : 2 177
Inscrit le 14/09/02
Ville : Grenoble (SMH)
Non connecté
  Posté le 23 août 2005 - 13 h 35 m 45 s


Le 23 août 2005 - 11 h 33, iraysyvalo a écrit :

Ok, effectivement, entre les bruits, les distorsions et autres :)

Huh, c'est quoi la synthese recursive de signal ?


il faut revenir au debut (voir premier post de Pimooose... :bla: :bla: :bla:):
calcul de l'echantillon k du buffer a partir des echantillons precedents.

j'avoue que je ne connaissais pas cette technique appliquée a la génération d'un signal. :jap:
Par contre les systèmes recursifs sont tres classiques dans le filtrage de signaux
(par exemple filtres RII - a reponse impulsionnelle infinie -...)




iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 23 août 2005 - 14 h 29 m 02 s


Le 23 août 2005 - 13 h 35, tempo a écrit :


Le 23 août 2005 - 11 h 33, iraysyvalo a écrit :

Ok, effectivement, entre les bruits, les distorsions et autres :)

Huh, c'est quoi la synthese recursive de signal ?


il faut revenir au debut (voir premier post de Pimooose... :bla: :bla: :bla:):
calcul de l'echantillon k du buffer a partir des echantillons precedents.

j'avoue que je ne connaissais pas cette technique appliquée a la génération d'un signal. :jap:


Huh, ah, il parlait de ca .. j'appelerais plutot ca utiliser la periodicite et une formule de transformationt somme-produit.



Par contre les systèmes recursifs sont tres classiques dans le filtrage de signaux
(par exemple filtres RII - a reponse impulsionnelle infinie -...)


J'y connais peu de chose, a part les filtres passe-bande :P




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 23 août 2005 - 16 h 52 m 04 s


Le 23 août 2005 - 14 h 29, iraysyvalo a écrit :
Huh, ah, il parlait de ca .. j'appelerais plutot ca utiliser la periodicite et une formule de transformationt somme-produit.


le site que j'avais trouvé en parlait comme ça, j'ai pas cherché à approfondir :P

En parlant de filtres passe/coupe, je pense mettre le sujet sur la table un de ces 4 :)



Huile de fraise.

iraysyvalo
-

Messages : 9 647
Inscrit le 19/11/02
Ville : Lyon
Non connecté
  Posté le 23 août 2005 - 19 h 28 m 32 s


Le 23 août 2005 - 16 h 52, Petit_PimoOosE a écrit :


Le 23 août 2005 - 14 h 29, iraysyvalo a écrit :
Huh, ah, il parlait de ca .. j'appelerais plutot ca utiliser la periodicite et une formule de transformationt somme-produit.


le site que j'avais trouvé en parlait comme ça, j'ai pas cherché à approfondir :P


Je pensais a un truc plus avance mais la c'est juste donner un nom ronflant a ce qu'il a fait ;)




Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 27 août 2005 - 17 h 22 m 16 s
Bon, ne vous en faites pas, je ne suis pas très actif en ce moment mais c'est juste pour des raisons indépendantes de ma volonté. Je reviendrai !



Huile de fraise.

Precedent | 1,2
Page genérée en 1.5830 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL |Actualité ADSL | e-commerce | Commande Au Volant
Creative Commons
Message Boards and Forums Directory