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

Signal Discussion :

Modification fréquence sinusoide au cours du temps


Sujet :

Signal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Modification fréquence sinusoide au cours du temps
    Bonjour,

    Je souhaite synthétiser un signal composé d'un sinus dont la fréquence à chaque instant t dépend de la valeur d'un paramètre. Le paramètre en question est dans un premier temps constant, puis croissant et enfin de nouveau constant (cf. plot 1). La fréquence du sinus est correctement calculée à chaque instant t (cf. plot 2).
    Mon problème est que, lorsque je trace le spectrogramme du signal, l'évolution de la fréquence au cours du temps ne correspond pas à celle qui a été calculée et qui est visible sur le plot 2. Plus précisement, la fréquence du signal est correcte lorsque le paramètre est constant mais, lors de la phase de croissance du paramètre, la fréquence du signal est "décalée" (cf. spectrogramme). Je ne comprends pas la raison de ce phénomène...

    Je vous remercie par avance pour toute idée/explication/aide que vous pourrez m'apporter.

    Arthur.

    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
     
    % Initialisation des paramètres
    Fs = 22050;
    d = 3;
    t = 0:1/Fs:d-1/Fs;
    finit = 200;
     
    % Création du profil du paramètre
    a = 15/(t(2*length(t)/3)-t(length(t)/3));
    b = 5-t(length(t)/3)*a;
    param = [5*ones(1,length(t)/3)...
        a*t(length(t)/3+1:2*length(t)/3)+b...
        20*ones(1,length(t)/3)];
     
    % Calcul de la fréquences et du signal à chaque instant t
    f = zeros(1, length(t));
    y = zeros(1, length(t));
    for i=1:length(t)
        f(i) = param(i)*finit/5;
        y(i) = sin(2*pi*f(i)*t(i));
    end
     
    % Tracés
    figure, plot(t,param), xlabel('Temps'), ylabel('Paramètre');
    figure, plot(t,f), xlabel('Temps'), ylabel('Fréquence du sinus');
    figure, spectrogram(y,blackman(128),56,128,Fs,'yaxis');

  2. #2
    Futur Membre du Club
    Profil pro
    Ingénieur Traitement de signal/Image
    Inscrit en
    Août 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Traitement de signal/Image

    Informations forums :
    Inscription : Août 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    A première vue le code semble correct. C'est effectivement bizarre.
    Au passage, tu peux remplacer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    f = zeros(1, length(t));
    y = zeros(1, length(t));
    for i=1:length(t)
        f(i) = param(i)*finit/5;
        y(i) = sin(2*pi*f(i)*t(i));
    end
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    f=param*finit/5;
    y=sin(2*pi*f.*t);
    C'est plus rapide à lire, à comprendre et surtout ça évite les boucles qui sont à proscrire au maximum sous Matlab.

    Je continue à regarder le code dès que j'ai le temps. Quand j'ai trouvé l'erreur, je reviens.
    Au passage, étant donné que tu n'as qu'une seule fréquence à chaque instant, il serait plus judicieux et beaucoup plus précis de visualiser la fréquence instantanée (avec la dérivée de la phase du signal analytique par exemple) que le spectrogramme.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Tout d'abord, merci pour l'intérêt que tu portes à mon problème !
    Je suis tout à fait d'accord avec l'optimisation que tu proposes pour les boucles présentes dans mon code. Je vais modifier cela.
    Par contre, j'utilise le spectrogramme car les sinus sont au nombre de 5 dans la version finale de mon srcipt.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    producer
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : producer

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 6
    Points
    6
    Par défaut objectif commun
    bonjour Arthurs, j'ai projet similaire et je coince un peu, vus que celas fait deux ans que tu est dessus peut être pourrais tu m'aiguiller un peu
    pour l'instant j'ai réussis a synthétiser une sin avec la sdl mais je suis pas sur que c'est le plus adapté, qu'en pense tu? recommande-tu mathlab? (je code en c)

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juillet 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Juillet 2014
    Messages : 46
    Points : 111
    Points
    111
    Par défaut
    La formule d'un chirp (excursion en fréquence) n'est pas sin(2.pi.f(t).t)
    http://fr.wikipedia.org/wiki/Chirp

    Il faut calculer la phase instantanée, pas la fréquence instantanée.

    La version anglophone donne l'équation en x(t) = sin(2.pi.(f0.t + k.t^2/2) avec k = (f1-f0)/t1
    http://en.wikipedia.org/wiki/Chirp

    Il existe aussi la fonction chirp dans MATLAB. Attention, elle donne un cosinus.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    producer
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : producer

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    yep merci;
    avec mon collègue on a trouver cette solution la sur un site anglais

    Code C : 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
    unsigned int sampleFrequency = 0;
    unsigned int audioBufferSize = 0;
    unsigned int outputAudioBufferSize = 0;
     
    unsigned int freq1 = 1000;
    unsigned int fase1 = 0;
    unsigned int freq2 = 5000;
    unsigned int fase2 = 0;
     
    void example_mixaudio(void *unused, Uint8 *stream, int len) {
     
        unsigned int bytesPerPeriod1 = sampleFrequency / freq1;
        unsigned int bytesPerPeriod2 = sampleFrequency / freq2;
     
        for (int i=0;i<len;i++) {
            int channel1 = int(150*sin(fase1*6.28/bytesPerPeriod1));
            int channel2 = int(150*sin(fase2*6.28/bytesPerPeriod2));
     
            int outputValue = channel1 + channel2;           // just add the channels
            if (outputValue > 127) outputValue = 127;        // and clip the result
            if (outputValue < -128) outputValue = -128;      // this seems a crude method, but works very well
     
            stream[i] = outputValue;
     
            fase1++;
            fase1 %= bytesPerPeriod1;
            fase2++;
            fase2 %= bytesPerPeriod2;
        }
    }

    ayant travaillé dans le son quelque années je me suis tout de suite dis : si freq1 et freq2 = 523 j'aurais un do et avec la racine douzième de deux j'obtiendrais reb puis re et ect... on a un accordeur a la maison et apparemment je fait fausse piste...
    saurais-tu vulgariser un peu tout ça pour m'aider à comprendre comment l'ide aborde le son?

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juillet 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Juillet 2014
    Messages : 46
    Points : 111
    Points
    111
    Par défaut
    Racine douzième de deux est bien le facteur multiplicatif qui sépare deux demi-tons de la gamme chromatique. Mais ici il s'agit de modulation de fréquence, pour le cas particulier d'une excursion linéaire entre 200 et 800Hz. L'expression sin(2.pi.f.t) est valable pour une fréquence constante. On ne fait pas une modulation de fréquence en remplaçant f(constante) par f(t), mais en calculant la phase par intégration (la fréquence est la dérivée de la phase). On fait en général le calcul analytiquement, qui donne:

    Nom : 8f43f1ce0c6c2ede769fbaac37707313.png
Affichages : 232
Taille : 1,6 Ko
    avec
    Nom : e6fa638026ea3b34852e4e93638180f8.png
Affichages : 233
Taille : 557 octets
    Ecrire sin(2.pi.f(t).t) conduit à une surestimation de la fréquence, et c'est bien ce qu'on observe sur le code original.

    Je ne sais pas trop ce que fait ce programme C. En tous cas je vois qu'il tronque en entier avant de mixer, ce qui est assurément la mauvaise façon de faire en son. Il cadre sur 8 bits, ce qui n'est pas non plus compatible ave la technologie audio de nos jours.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    producer
    Inscrit en
    Juillet 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : producer

    Informations forums :
    Inscription : Juillet 2014
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    yes merci!
    ce qui explique que ma carte son ai cramée récemment

    du coup la sdl est peut-être pas la library la plus indiquée...
    le projet c'est de faire un synthé (pour l'instant),

    je vais potasser ces nouvelle données si t'as d'autre conseil hésite pas, ou si tu connais des livre qui aborde le sujet...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/04/2008, 15h16
  2. [SQL] Modifications de plusieurs identifiants en même temps
    Par keishah dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/11/2007, 13h29
  3. Réponses: 12
    Dernier message: 25/07/2007, 14h13
  4. modification de hint en cours d'affichage
    Par OutOfRange dans le forum Langage
    Réponses: 7
    Dernier message: 31/10/2005, 23h29

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