From 33682e1557c2e78f06a2e438fd9e5c423d0b0317 Mon Sep 17 00:00:00 2001 From: PERBEN Anatole <anatole.perben@imt-atlantique.net> Date: Wed, 28 May 2025 23:29:16 +0000 Subject: [PATCH] Upload New File --- src/wav/question_3_8.m | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/wav/question_3_8.m diff --git a/src/wav/question_3_8.m b/src/wav/question_3_8.m new file mode 100644 index 0000000..c5b18e7 --- /dev/null +++ b/src/wav/question_3_8.m @@ -0,0 +1,44 @@ +function y = effet_reverb_FFT(x, h) +% effet_reverb_FFT : applique une réverbération par filtrage fréquentiel +% +% Entrées : +% x : signal source +% h : réponse impulsionnelle +% +% Sortie : +% y : signal filtré (avec réverbération) + + % Calcul de la taille optimale de FFT + NFFT = length(x) + length(h) - 1; + + % FFT des deux signaux + X = fft(x, NFFT); + H = fft(h, NFFT); + + % Multiplication dans le domaine fréquentiel + Y = X .* H; + + % Revenir au domaine temporel + y_full = ifft(Y); + + % Optionnel : garder même taille que convolution + y = real(y_full(1:NFFT)); % s'assurer que le résultat est réel +end +% Chargement du signal et de la réponse impulsionnelle estimée +[x_guitare, fe] = audioread('single_tone_guitar_nylon_string_a3.wav'); +load('signal_excitation.mat'); % contient R_yx +x_guitare = x_guitare(:,1) + +% Extraire la partie causale de la réponse impulsionnelle +[~, idx_peak] = max(abs(R_yx)); +h = R_yx(idx_peak:end); + +% --- Mesure du temps FFT --- +tic; +y_fft = effet_reverb_FFT(x_guitare, h); +t_fft = toc; +fprintf("Temps FFT : %.4f secondes\n", t_fft); + +% Écoute +soundsc(y_fft, fe); % tu peux aussi tester y_conv + -- GitLab