Précédent   Forum des professionnels en informatique > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2012, 15h07   #1
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Somme (Picardie)

Informations forums :
Inscription : janvier 2012
Messages : 12
Points : 0
Points : 0
Par défaut Conversion d'un code MATLAB en C

Bonjour mes amis,
j'ai un programme qui est écrit avec matlab mais je dois l'écrire en langage C pour que je puisse l'intégrer dans une carte DSP
(en fait je suis un peu nulle en C)

code .m :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/////////////////////////////////////clear
f0=493.88;
f=f0.*(1:30);

%harmonique
Af=493.88*[
      0.8897,    2.0001;
    1.7834,    0.7463;
    2.6808,    1.2558;
    3.5879,    0.9798;
    4.4991,    0.3173;
    5.4244,    0.1693;
    6.3598,    0.2432;
    7.3115,    0.1432;
    8.2915,    0.0108;
    9.2715,    0.0494;
   10.2697,    0.0554;
   11.2902,    0.0431;
   12.3107,    0.0209;
   13.4324,    0.0131;
   14.5339,    0.0322;
   15.6657,    0.0071;
   16.8219,    0.0052;
   18.0165,    0.0010;
   19.2294,    0.0018;
   20.4908,    0.0008;
   21.7867,    0.0012;
   23.0825,    0.0009;
   24.4391,    0.0003;
   25.8565,    0.0003;
   27.2941,    0.0004;
   28.7114,    0.0001;
   30.2705,    0.0001;
   31.6271,    0.0001;
   32.3965,    0.0011;
   33.1862,    0.0006];   
t=0:1/44.1e3:4;
for i=1:25 
    y(i,:)=1.5e-4.*Af(i,2).*exp(-3.5.*t)...
    .*sin(2.*pi.*f(i).*t);
                                        

end

Y=sum(y);


subplot(211)
plot(t,Y)
sound(Y,44.1e3)
/////////////////////////
jmour est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 15h16   #2
Membre Expert
 
Homme
Développeur informatique
Inscription : décembre 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2011
Messages : 692
Points : 1 203
Points : 1 203
Citation:
Envoyé par jmour Voir le message
(en fette je suis un peut nulle en langages c ..)
Et en français.
mala92 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 07h27   #3
Membre éclairé
 
Inscription : juillet 2006
Messages : 290
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 290
Points : 370
Points : 370
Citation:
Envoyé par jmour Voir le message
Bonjour mes amis,
j'ai un programme qui est écrit avec matlab mais je dois l'écrire en langage C pour que je puisse l'intégrer dans une carte DSP
(en fait je suis un peu nulle en C)

code .m :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/////////////////////////////////////clear
f0=493.88;
f=f0.*(1:30);

%harmonique
Af=493.88*[
      0.8897,    2.0001;
    1.7834,    0.7463;
    2.6808,    1.2558;
    3.5879,    0.9798;
    4.4991,    0.3173;
    5.4244,    0.1693;
    6.3598,    0.2432;
    7.3115,    0.1432;
    8.2915,    0.0108;
    9.2715,    0.0494;
   10.2697,    0.0554;
   11.2902,    0.0431;
   12.3107,    0.0209;
   13.4324,    0.0131;
   14.5339,    0.0322;
   15.6657,    0.0071;
   16.8219,    0.0052;
   18.0165,    0.0010;
   19.2294,    0.0018;
   20.4908,    0.0008;
   21.7867,    0.0012;
   23.0825,    0.0009;
   24.4391,    0.0003;
   25.8565,    0.0003;
   27.2941,    0.0004;
   28.7114,    0.0001;
   30.2705,    0.0001;
   31.6271,    0.0001;
   32.3965,    0.0011;
   33.1862,    0.0006];   
t=0:1/44.1e3:4;
for i=1:25 
    y(i,:)=1.5e-4.*Af(i,2).*exp(-3.5.*t)...
    .*sin(2.*pi.*f(i).*t);
                                        

end

Y=sum(y);


subplot(211)
plot(t,Y)
sound(Y,44.1e3)
/////////////////////////
Est-il possible d'avoir une explication de l'algo ?
_-Slash-_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h01   #4
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 806
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 806
Points : 1 364
Points : 1 364
La définition de Af est quand même un peu difficile... Tu l'as obtenu d'un calcul cette matrice ? Pourquoi entrer les valeurs à la main avec tellement de risques de se tromper ? Les fonctions plot et subplot ne sont je présume pas à porter sur ton DSP ?

J'ai fait une fois un portage de code Matlab vers DSP, pour un préamplificateur pour guitare. On a porté les codes des filtres et de la distorsion. Ce n'est pas super facile.

La première remarque que je peux faire est ta boucle for. L'utilisation d'une écriture telle que y(i, est très pratique et performante en Matlab mais elle n'est pas possible en C. Je te conseille déjà de la transformer en deux boucles for imbriquées. Encore que.... certains DSP permettent de travailler avec des vecteurs d'entrées, il faut étudier cette possibilité.

Tu utilises la fonction sound (pour générer du son vu son nom ^^). Ton application DSP va prendre du son en entrée, le modifier et l'envoyer sur la sortie ? Ton entrée est ici t ?
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 13h22   #5
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Somme (Picardie)

Informations forums :
Inscription : janvier 2012
Messages : 12
Points : 0
Points : 0
Citation:
Envoyé par _-Slash-_ Voir le message
Est-il possible d'avoir une explication de l'algo ?
Le programme cree un son d'une note de piano (synthese sonore)

t=0:1/44.1e3:4; créé le vecteur temps d'une durée de 4s avec une fréquence d'échantillonnage de 44.1kHz.

* Le terme exp(-3.5.*t) permet l'atténuation du signal au fil du temps.
* Le terme heaviside(t) n'a ici pas grande utilité ici vu que ton vecteur temps t d'entrée est positif. If ne fait que mettre des NaN sur les premières valeurs y(:,1).
* Le terme sin(2.*pi.*f(i).*t) permet de générer le signal à la fréquence d'harmonique f(i).
* Le terme Af(i,2) permet de fixer l'amplitude de l'harmonique correspondante.

Tu as alors à la fin de la boucle une harmonique sur chaque ligne y(i, de ton tableau y.
Ton signal final Y est la somme de toutes ces harmoniques Y=sum(y);.
jmour est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 01h05   #6
Membre éclairé
 
Homme
Enseignant
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 380
Points : 380
Par défaut @jmour

salut !

si tu dois faire ça une seule fois, copier-coller les données dans un éditeur de texte digne de ce nom, ainsi que les fonctions que tu donnes dans ton dernier post, et tu places tout çà dans un fichier source.c

si tu dois faire cette gymnastique très souvent, il vaut mieux utiliser les procédures fopen, fprintf, fclose de MATLAB (j'ai vu que ça existe google -> http://www.mathworks.fr/help/techdoc.../f5-15544.html) pour lui faire imprimer un fichier source.c.

dans source.c main fait une boucle sur le temps et produit un tableau ou un fichier des échantillons donnés par Y(t). perso j'ai utilisé un fichier, un échantillonnage 16 bits. je l'ai importé dans audacity (plot et sound) !

le résultat audio : c'est un piano sans pédale (amortissement un peu trop rapide)

merci d'avoir ouvert le sujet : je n'avais jamais envisager de créer des samples en C. si tu es intéressé le petit bout de code que j'ai écrit.

A+
anacharsis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h29.


 
 
 
 
Partenaires

Hébergement Web