TP-traitement-audio-visuel/TP10/ITFCT.m
2023-06-22 20:47:16 +02:00

54 lines
1.9 KiB
Matlab
Executable file

function [y, valeurs_t] = ITFCT(Y, f_ech, n_decalage, fenetre)
% ITFCT (inverse de la transformée de Fourier à court terme)
% Par Overlap - Add
%
% Inputs :
% Y : TFCT d'un signal réel
% f_ech : fréquence d'échantillonnage
% n_decalage : taille entre deux fenêtres
%
% Outputs :
% y : ITFCT(Y)
% valeurs_t : points temporels
% On retrouve la taille de la fenêtre d'origine
% (on a enlevé presque la moitié des valeurs) :
n_fenetre = (size(Y, 1) - 1) * 2;
% On redonne la bonne taille à Y (pas besoin de remettre les bons coefficients,
% la fonction ifft de Matlab gère pour nous) :
Y(size(Y, 1) + 1:n_fenetre, :) = 0;
% Récupération de la fenêtre utilisée :
if nargin == 3 || strcmp(fenetre, 'hann')
% Par défaut, hanning
w = hann(n_fenetre);
elseif strcmp(fenetre, 'rect')
w = ones(n_fenetre, 1);
end
% Création d'un signal vierge et d'une variable permettant de calculer la somme des fenêtres :
n = (size(Y, 2) + 1) * n_decalage;
y = zeros(n, 1);
w_sum = zeros(n, 1);
for valeurs_t = 1:size(Y, 2)
% On retrouve le signal fenêtré (l'option 'symmetric' indique à
% Matlab d'utiliser la symétrie hermitienne de la TFCT d'un signal réel) :
y_win = ifft(Y(:, valeurs_t), 'symmetric');
% On ajoute ce tronçon de signal fenêtré au signal,
% et la fenêtre à la somme des fenêtres :
start = 1 + (valeurs_t - 1) * n_decalage;
y(start:start + n_fenetre - 1) = y(start:start + n_fenetre - 1) + y_win;
w_sum(start:start + n_fenetre - 1) = w_sum(start:start + n_fenetre - 1) + w;
end
% On dé-fenêtre (en évitant de diviser par 0) :
y = y ./ (w_sum + eps);
% Calcul des valeurs temporelles correspondant à chaque point du signal :
valeurs_t = (0:length(y) - 1) / f_ech;
end