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 :

Algorithme traitement du signal


Sujet :

Signal

  1. #1
    Nouveau Candidat au Club
    Algorithme traitement du signal
    Bonjour à tous,
    J'ai un travail à réaliser sur matlab en traitement du signal. Je dois écrire un algorithme pour comparer les fréquences de deux sons audio purs. Il doit renvoyer un résultat binaire : 1 si les deux fréquences sont les mêmes, à une marge d’erreur près, 0 sinon. On me donne seulement les informations suivantes :
    - les fréquences sont dans l’intervalle [130Hz,4000Hz]
    - Fe = 16KHz.
    Je dois générer aléatoirement les autres paramètres des signaux (amplitude, fréquence et phase).
    Le premier signal a obligatoirement une phase nulle, le deuxième doit en avoir une non nulle.
    Pour l'instant, je sais qu'un son pur est de la forme : A*cos(2*pi*f*t + phi)). L'amplitude doit être strictement positive. Les deux signaux doivent être de même durée, et la durée doit être égale à alpha/f1, avec alpha >0.
    J'ai pensé à écrire ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fe =16000;
    Te = 1/Fe;
    f1 = randi([130,4000]);
    f2 = randi([130,4000]);
    t = 0:Te<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />;
    phi1 = 0;
    x1 = A1*cos(2*pi*f1*t + phi1);
    x2 = A2*cos(2*pi*f2*t+phi2);
    plot(t, x1);
    plot(t,x2);

    Cependant, pour la phase2 et l'amplitude, je ne sais pas comment les générer aléatoirement, parce qu'on ne m'a pas donné d'intervalle, je dois le déterminer moi même. Comment savoir ? Je ne sais pas non plus comment déterminer alpha.
    Pour la deuxième partie de cet algorithme, je dois uniquement avoir accès aux signaux générés et aux paramètres deja fixés. On ne connait ni l'amplitude, ni la phase, ni la durée, et encore moins la fréquence, puisque c'est ce qui nous intéresse. On peut les estimer si besoin.
    J'ai pensé à m'inspirer de l'intercorrélation, mais celle-ci sert à comparer deux signaux, et pas leur fréquence.
    Pouvez-vous me guider sur la manière de procéder s'il vous plait?
    Je précise que je n'ai pas encore appris à utiliser Fourier, donc au cas ou il serait utile, je ne peux pas m'en servir...
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Bonjour,

    Il est certain que la FFT est le moyen le mieux adapté.

    Tu peux calculer le déphasage.

    Un essai :

    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
    % Calcul du dephasage entre deux nsinusoides
    clear
    Fe =16000;
    Te = 1/Fe;
    %f1 = randi([130,4000]);
    %f2 = randi([130,4000]);
    f1=400;
    f2=450;
    D=1/min([f1 f2]);
    t = 0:Te<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />;
    phi1 = 0;A1=1;A2=20;phi2=pi/6
    x1 = (A1*cos(2*pi*f1*t + phi1));
    x2 = (A2*cos(2*pi*f2*t+phi2));
     
    x1=x1/max(x1);x2=x2/max(x2);
    t2min=zeros(x2)
    plot(t, x1,t,x2);
    grid
    % Test du dephasage
    a=find(x1(1:end-1).*x1(2:end)<0)
    b=find(x2(1:end-1).*x2(2:end)<0)
    deltat=b(1)-a(1) % Déph&asage en echantillons
    deltat*Te % Déphasage en temps

  3. #3
    Nouveau Candidat au Club
    Bonjour, merci pour votre réponse. Je suis débutante en traitement du signal et en matlab, donc je ne comprend pas comment le déphasage pourrait m'aider à comparer les fréquences des deux signaux. Pouvez-vous m'expliquer votre méthode de réflexion svp?

  4. #4
    Membre émérite
    Bonjour,

    Quand tu sais détecter les zéros, tu peux calculer les périodes et leurs écart à tester sur un seuil de battement :
    Le déphasage n'intervient pas. C'est un exemple.
    Cette méthode n'est précise que sur des signaux purs. S'il y a du bruit ou d'autres harmoniques, il faut filtrer ou utiliser la FFT.

    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
    % Calcul du dephasage entre deux nsinusoides
    clear
    Fe =16000;
    Te = 1/Fe;
    %f1 = randi([130,4000]);
    %f2 = randi([130,4000]);
    f1=400;
    f2=650;
    D=1/min([f1 f2]);
    t = 0:Te<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />;
    phi1 = 0;A1=1;A2=20;phi2=pi/6
    x1 = (A1*cos(2*pi*f1*t + phi1));
    x2 = (A2*cos(2*pi*f2*t+phi2));
    x1=x1/max(x1);x2=x2/max(x2);
    t2min=zeros(x2)
    plot(t, x1,t,x2);
    grid
    % Test du dephasage
    a=find(x1(1:end-1).*x1(2:end)<0);
    b=find(x2(1:end-1).*x2(2:end)<0);
    deltat=b(1)-a(1) % Déph&asage en echantillons
    deltat*Te; % Déphasage en temps
    % Calcul des periodes
    P1=(a(2)-a(1))*2*Te
    P2=(b(2)-b(1))*2*Te
    % Ecart des periodes à tester avec un seuil
    deltaPeriode=P2-P1

###raw>template_hook.ano_emploi###