Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 59
    Points : 14
    Points
    14

    Par défaut somme nombre fini de fréquence

    Bonjour à tous,

    Je cherche à générer un signal composé d'une somme de fréquence (de 1 à 3200 par pas de 0.1) avec chacune une phase aléatoire (Phi = rand afin de tester un filtre et déterminer l'exactitude de sa fréquence de coupure.

    Je m'attendais à trouver une fft qui réponde pour chaque fréquence (en quelque sorte de forme carrée) et malheureusement ce n'est pas le cas et j'obtiens en fait deux pics de fréquence.

    Auriez-vous une idée de l'endroit où j'ai commis une erreur dans mon code?

    Voici mon code:
    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
    clear all
    close all
    
    Fs = 32768;                   % Sampling frequency
    T = 1/Fs;                     % Sample time
    L = 2048;                     % Length of signal
    t=(0:L-1)*T;
    
    f_array = 1:0.1:3200;
    Phi = rand;% Phase alétoire
    for Index_f = 1 : length (f_array)
        f = f_array(Index_f);
        SimSig(Index_f,:) = sum(sin(2*pi*f*t+Phi));
    end
    
    plot(SimSig)
    
    figure('name','Full FFT','numbertitle','off');
    FFT_size=2048;
    X=fft(SimSig,FFT_size);
    f=(0:FFT_size/2)/(FFT_size/2)*Fs/2;
    plot(f,abs(X(1:FFT_size/2+1)));
    title('FFT - Pré');
    xlabel('Fréquence(Hz)');
    ylabel('Amplitude');

    Merci d'avance!

  2. #2
    Responsable FAQ C++
    Avatar de Winjerome
    Homme Profil pro Jérôme
    Inscrit en
    septembre 2009
    Messages
    7 537
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 7 537
    Points : 25 404
    Points
    25 404

    Par défaut

    Bonjour,

    Le principal problème vient de là :
    Code :
    SimSig(Index_f,:) = sum(sin(2*pi*f*t+Phi));
    Il n' y aucune raison de faire la somme de tous les échantillons pour une fréquence.
    D'autre part, pense à effectuer un préallocation avant ta boucle :
    Code :
    SimSig = zeros(length(f_array) , L);
    Enfin, afficher près de 32 000 courbes en même temps n'est pas forcément le top que ce soit au niveau performances, ou visualisation
    Préfère n'en n'afficher que quelques unes à la fois :
    Code :
    1
    2
    3
    n = ...
    plot(t, SimSig(n,:))
    plot(f,abs(X(1:FFT_size/2+1,n)));
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).

    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Retrouvez-moi en soirée sur le chat de developpez.com - Pas de question technique par MP, Merci

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 59
    Points : 14
    Points
    14

    Par défaut

    Merci beaucoup pour vos propositions d'amélioration du code surtout concernant la pré-allocation.

    Par contre, pourriez-vous me préciser ce que vous appeler n? Est-ce le nombre de courbes à présenter sur le graphe?

    Merci d'avance

  4. #4
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 59
    Points : 14
    Points
    14

    Par défaut

    Par ailleurs, je ne saisi pas non plus pourquoi le spectre de mon signal n'est pas plat. En effet, il y une espèce de pointe dans les basses fréquences, ce qui ne me semble pas vraiment logique au regard de ce qui est demandé dans le script.

    Si vous avez une idée n'hésitez pas!

    Merci beaucoup.

  5. #5
    Responsable FAQ C++
    Avatar de Winjerome
    Homme Profil pro Jérôme
    Inscrit en
    septembre 2009
    Messages
    7 537
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 7 537
    Points : 25 404
    Points
    25 404

    Par défaut

    n correspond à l'indice des courbes que tu souhaites tracer (de 1 à length(f_array)).

    Pour l'autre problème, je te recopie une partie de la documentation
    Citation Envoyé par doc fft
    If X is a matrix, fft returns the Fourier transform of each column of the matrix.
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).

    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Retrouvez-moi en soirée sur le chat de developpez.com - Pas de question technique par MP, Merci

  6. #6
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 59
    Points : 14
    Points
    14

    Par défaut

    Oui je suis tout à fait d'accord avec vous mais j'obtiens la même chose lorsque mon X est un vecteur et non pas une matrice et ce après avoir ajouté les modifications que vous aviez suggéré.

    Voici ce que ça donne:
    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
    clear all
    close all
    
    Fs = 32768;                   % Sampling frequency
    T = 1/Fs;                     % Sample time
    L = 2048;                     % Length of signal
    t=(0:L-1)*T;                  % 2048*dt Time vector
    
    f_array = 1:0.1:3200;
    SimSig = zeros(length(f_array) , L); % Preallocation
    for Index_f = 1 : length (f_array)
        Phi = rand; % Random Phase for each frequencies
        f = f_array(Index_f); % All frequencies required
        SimSig(Index_f,:) = sin(2*pi*f*t+Phi); % Fill Preallocation
    end
    
    SimSigFin=sum(SimSig); % Sum of all frequencies
    
    figure('name','Signal','numbertitle','off');
    n = 1:length(f_array);
    plot(t, SimSig(n,:))
    
    figure('name','Full FFT','numbertitle','off');
    FFT_size=2048;
    X=fft(SimSigFin,FFT_size);
    f=(0:FFT_size/2)/(FFT_size/2)*Fs/2;
    plot(f,abs(X(1:FFT_size/2+1)));
    title('FFT - Pré');
    xlabel('Fréquence(Hz)');
    ylabel('Amplitude');

  7. #7
    Responsable FAQ C++
    Avatar de Winjerome
    Homme Profil pro Jérôme
    Inscrit en
    septembre 2009
    Messages
    7 537
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 7 537
    Points : 25 404
    Points
    25 404

    Par défaut

    Code :
    1
    2
    n = 1:length(f_array);
    plot(t, SimSig(n,:))
    Heu là tu les dessines tous

    Toujours est-il qu'à la vu du signal SimSigFin résultant, et de ce que tu fais, la fft est tout à fait acceptable...
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).

    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Retrouvez-moi en soirée sur le chat de developpez.com - Pas de question technique par MP, Merci

  8. #8
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 59
    Points : 14
    Points
    14

    Par défaut

    Bon ok, merci! Au moins je sais que je n'ai pas fait d'erreur sur cette synthèse car à la base je voulais avoir une fft "carrée" avec la même valeur |Y(f)| pour toutes les fréquences jusqu'à fs/2.

    Auriez-vous une idée du type de signal à synthétiser pour avoir ce type de fft?

    Merci d'avance.

  9. #9
    Membre chevronné Avatar de tubaas
    Homme Profil pro Mathieu Martinez
    Acousticien
    Inscrit en
    août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Nom : Homme Mathieu Martinez
    Âge : 29
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : août 2009
    Messages : 641
    Points : 775
    Points
    775

    Par défaut

    salut
    tu veux peut-être un bruit blanc ou un bruit rose ?

  10. #10
    Candidat au titre de Membre du Club
    Inscrit en
    octobre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 59
    Points : 14
    Points
    14

    Par défaut

    Hello,

    En fait se serait plutôt un bruit blanc mais visiblement ce que j'ai synthétisé est un bruit blanc gaussien.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •