IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Conversion d'un code MATLAB en C


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 10
    Points
    10
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    /////////////////////////

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Citation Envoyé par jmour Voir le message
    (en fette je suis un peut nulle en langages c ..)
    Et en français.

  3. #3
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 482
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    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 ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    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);.

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    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+

Discussions similaires

  1. Conversion d'un code matlab en code C
    Par Fighters03 dans le forum MATLAB
    Réponses: 0
    Dernier message: 23/05/2014, 23h57
  2. conversion d'un code matlab à un autre en C
    Par mielle dans le forum C++
    Réponses: 4
    Dernier message: 29/04/2013, 10h08
  3. Conversion de code MATLAB en Qt
    Par latifah dans le forum Débuter
    Réponses: 8
    Dernier message: 15/05/2012, 02h31
  4. [Débutant] Conversion code MATLAB en code Python 2.6
    Par frisou65 dans le forum MATLAB
    Réponses: 1
    Dernier message: 28/09/2011, 19h52
  5. Conversion d'un code Matlab .m en code Cpp
    Par MDiabolo dans le forum C++
    Réponses: 5
    Dernier message: 10/03/2010, 13h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo