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 :

somme nombre fini de fréquence


Sujet :

Signal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    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 : 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
    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
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le principal problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n = ...
    plot(t, SimSig(n,:))
    plot(f,abs(X(1:FFT_size/2+1,n)));

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    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
    Invité
    Invité(e)
    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.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    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 : 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
    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
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    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 éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    tu veux peut-être un bruit blanc ou un bruit rose ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    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.

Discussions similaires

  1. Somme Nombre de jour Total des Tâches
    Par Angeldu74 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/05/2009, 10h54
  2. somme avec condition de fréquence
    Par V i n c e n t dans le forum Excel
    Réponses: 2
    Dernier message: 30/04/2009, 08h40
  3. Réponses: 10
    Dernier message: 03/10/2006, 20h19
  4. Somme sur des nombre décimaux
    Par chrislauxerrois dans le forum Access
    Réponses: 1
    Dernier message: 01/08/2006, 16h46
  5. Somme de nombres limitée
    Par DC dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 29/11/2005, 13h54

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