Bonjour,
Je suis nouveau et donc je me présente. Je travaille dans la R&D d'instrumentation scientifique. Je ne suis pas développeur, mais plutôt physicien.
Mon problème est simple, mais j'espère posé au bon endroit sur ce forum. Je récupère d'un détecteur un signal temporel (type sinus à une fréquence inconnue, mais fixe de l'ordre de 10kHz). Je récupère ce signal par petit buffer genre 2048 pts (limité par l'expérience). Ce que je voudrais faire, c'est mettre bout à bout plusieurs de ces buffers (disons 16) en un grand buffer pour avoir 32768 pts. J'applique ensuite une FFT sur mon grand buffer pour retrouver ma fréquence avec une meilleure résolution qu'avec un seul sous buffer. Je suppose plusieurs problèmes dans cette approche, mais je n'ai pas trouvé dans les documents sur la FFT d'argument m'interdisant de faire ça, mais pas non plus de technique pour faire cela.
J'ai donc essayé de modéliser cela avec Octave. Le résultat me sidère et je cherche une aide pour comprendre mon erreur (code ou principe du traitement du signal).
Je reproduis ci-dessous la partie du code me permettant de simuler les buffers, la combinaison et la FFT.
Pour expliquer le résultat de la FFT, j'ai un peigne de Dirac avec un pic pour chaque valeur de fréquence de la résolution du sous buffer...difficile d’être clair. Quand je fais la FFT sur un des sous-buffers, j'ai seulement les points autour de la fréquence de mon signal ayant une amplitude non nulle (8623Hz 8633Hz 8642Hz 8652Hz) ce qui est correct pour une fréquence à 8637Hz compte tenu de ma résolution fréquentielle.
Sur ma reconstruction j'ai les mêmes points non nuls, mais tous les points rajoutés entre ces fréquences par l'extension de mon buffer ont une amplitude nulle au lieu de participer à la reconstruction du pic avec une meilleure résolution. D'où ce peigne de Dirac… ? Tout commentaire sur le traitement du signal le code ou la FFT en générale est le bienvenue.
Merci d'avance
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
31 T = 0.05*1e-3; % Sample time input in /s Fs = 1/T; % Sampling frequency L = 2048; % Length of signal t = (0:L-1)*T; % Time vector Fm = 8637; % Signal Frequency /Hz %Multiple buffer NbBufM = 16; %Nb de buffer a assembler for k = 1:NbBufM BufferM(k,: ) = sin(2*pi*Fm*t ); BufferM(k,: ) = BufferM(k,: ).+2*randn(size(t)); endfor NFFT_BufferTotal = 2^nextpow2(NbBufM*L); NFFT = 2^nextpow2(L) % collage des buffer A = BufferM.'; B = A(: ); BufferTotal = B.'; %FFT Buffer total FFT_BufferTotal = fft(BufferTotal,NFFT_BufferTotal)/(NbBufM*L); f_BufferTotal = Fs/2*linspace(0,1,NFFT_BufferTotal/2+1); %FFT Buffer intermediaire Buffer_Ech2 = BufferM(round(NbBufM/2),: );FFT_Buffer_Ech2 = fft(Buffer_Ech2,NFFT)/L;f = Fs/2*linspace(0,1,NFFT/2+1); plot(f_BufferTotal,2*abs(FFT_BufferTotal(1:NFFT_BufferTotal/2+1)),f,2*abs(FFT_Buffer_Ech2(1:NFFT/2+1)),"o", "markersize",5); xlim([Fm-20,Fm+20]);
Partager