Bonjour à tous,

Merci d’avance à ceux qui prendront le temps de m’aider.

De façon simplifiée, je chercher à effectuer une IFFT sur le spectre d'un signal préalablement réalisé avec une FFT de taille différente.
Pour préciser un peu plus, j'effectue un spectrogramme à l'aide de transformées de fourrier court terme qui se recouvrent temporellement de 50%. J'obtiens ainsi une carte temps / fréquence.
Les signaux observés n'utilisent pas toute la bande et sont au contraire très localisés en fréquence (une composante fréquentielle pure pour notre exemple ). Plutôt que de reconstruire le signal sur toute la bande, je souhaite sélectionner quelques canaux qui comprennent effectivement du signal et faire IFFT de taille réduite pour re-synthétiser le signal.

Problème : lorsque que je reconstruit, le signal présente des ondulations en amplitude que je n'arrive pas à corriger ( et à comprendre ). Bien sur, ces ondulations n’apparaissent pas lorsque que je reconstruit le signal sur toute la bande, mais uniquement lorsque la taille de mon IFFT est plus petite que celle de la FFT.
Ce problème semble apparaitre uniquement lorsque j'utilise une fenêtre de pondération. Sans pondération, la reconstruction partielle est correcte.


Pour illustrer mon problème, j'ai préparer un bout de code Matlab. Celui-ci créé un signal IQ de type ''pulse'' à fréquence fixe et effectue ensuite le calcul du spectrogramme.
Enfin, ce code met en œuvre une reconstruction totale et une partielle. On peux ainsi observer ces ondulations dans le cas de la reconstruction partielle. On peux également, activer ou désactiver la pondération pour faire apparaitre le phénomène.

Une petite piste ? J'ai l'impression que je n'utilise pas la bonne '' dé-pondération "...

Encore merci à ceux qui pourront me sortir de cette impasse

Le 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
clear all;close all;
 
% Constantes et parametres
Fech     = 1e9; %Frequence d'echantillonage
NFFT = 1000;    %Nombre de point FFT
N=100;        %Nombre de FFT a realiser
Nech=NFFT*N;    %Nombre d'echantillons temporel
t=((1:Nech)/Fech); %vecteur temps
Freq=100e6; %Frequence signal
affichage=1; %1 affichage figure; 0 pas d'affichage
ponderation=1; %1 ponderation hanning; 0 pas de ponderation
NIFFT=16; %Nombre de points IFFT partielle
cref=101; %canal de reference reconstruction partielle
 
 
%Creation du signal I/Q
xr=cos(2*pi*Freq*t);
xi=sin(2*pi*Freq*t);
x=xr+1j*xi;
 
%Mise a zero d'une portion du signal
x(1:Nech/5)=0;
x(4*Nech/5:length(x))=0;
 
if affichage
    figure
    plot(abs(x));
    title('Signal origine');
end
 
%Fenetre de ponderation
if ponderation
    pond=0.1+(1.-0.1)*hann(NFFT);
else
    pond=ones(NFFT,1);
end
 
%FFT overlapees de 50% (NFFT/2 points)
Y=zeros(NFFT,2*N-1);
for i=1:2*N-1
    Y(:,i)=fft(x((i-1)*NFFT/2+1:(i+1)*NFFT/2).*pond');
end
 
 
%Reconstruction complete
Xcomp=zeros(size(x));
for i=1:size(Y,2)
    temp=ifft(Y(:,i))./pond;
    Xcomp((i-1)*NFFT/2+1:(i+1)*NFFT/2)=Xcomp((i-1)*NFFT/2+1:(i+1)*NFFT/2)+transpose(temp/2);
end
 
%Affichage spectrogramme
if affichage
    figure
    subplot(2,1,1);
    imagesc(20*log(abs(Y)));
    title('Spectrogramme complet');
    subplot(2,1,2);
    plot(abs(Xcomp));
    title('Signal reconstruction complete');
end
 
%Reconstruction partielle
clear temp;
 
if ponderation
    pond=0.1+(1.-0.1)*hann(NIFFT); %Ponderation
else
    pond=ones(NIFFT,1);
end
 
Ypart=Y(cref-NIFFT/2+1:cref+NIFFT/2,:);
Xpart=zeros((size(Ypart,2)+1)*NIFFT/2);
for i=1:size(Ypart,2)
    temp=ifft(Ypart(:,i))./pond;
    if mod(i,2)==0 %Correction de phase une ifft sur deux
        temp=-temp;
    end
    Xpart((i-1)*NIFFT/2+1:(i+1)*NIFFT/2)=Xpart((i-1)*NIFFT/2+1:(i+1)*NIFFT/2)+transpose(temp/2);
end
 
if affichage
    figure
    subplot(2,1,1);
    imagesc(20*log(abs(Ypart)));
    title('spectrogramme partiel');
    subplot(2,1,2);
    plot(abs(Xpart));
    title('Signal reconstruction partielle');
end