Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > MATLAB > Signal
Signal Forum d'entraide sur le traitement du signal en MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 11h12   #1
gc001
Candidat au titre de Membre du Club
 
Inscription : 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!
gc001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 14h07   #2
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 622
Points : 12 622
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)));
__________________
Débutant en MATLAB ? Vous voulez faire une Interface Graphique ? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur ? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 08h51   #3
gc001
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 14
Points : 14
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
gc001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 11h06   #4
gc001
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 14
Points : 14
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.
gc001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 13h05   #5
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 622
Points : 12 622
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.
__________________
Débutant en MATLAB ? Vous voulez faire une Interface Graphique ? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur ? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 15h50   #6
gc001
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 14
Points : 14
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');
gc001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 16h16   #7
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 622
Points : 12 622
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...
__________________
Débutant en MATLAB ? Vous voulez faire une Interface Graphique ? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur ? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 09h58   #8
gc001
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 14
Points : 14
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.
gc001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 14h45   #9
tubaas
Membre émérite
 
Avatar de tubaas
 
Homme Mathieu Martinez
Acousticien
Inscription : août 2009
Messages : 641
Détails du profil
Informations personnelles :
Nom : Homme Mathieu Martinez
Âge : 28
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Acousticien
Secteur : Industrie

Informations forums :
Inscription : août 2009
Messages : 641
Points : 864
Points : 864
salut
tu veux peut-être un bruit blanc ou un bruit rose ?
tubaas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 09h34   #10
gc001
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 14
Points : 14
Hello,

En fait se serait plutôt un bruit blanc mais visiblement ce que j'ai synthétisé est un bruit blanc gaussien.
gc001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h33.


 
 
 
 
Partenaires

Hébergement Web