diff --git a/src/effet_reverb.m b/src/effet_reverb.m new file mode 100644 index 0000000000000000000000000000000000000000..503db7b2a53ae0a8f781aa393e41195c653bd3ae --- /dev/null +++ b/src/effet_reverb.m @@ -0,0 +1,7 @@ +function [y] = effet_reverb(x, h) +%ENTREE : x=signal émis par le haut-parleur +%SORTIE : y=signal capté par le microphone dans la pièce + +y = conv(x, h, 'same'); % Convolution du signal avec la réponse impulsionnelle + +end \ No newline at end of file diff --git a/src/effetsAudioNumeriques.m b/src/effetsAudioNumeriques.m new file mode 100644 index 0000000000000000000000000000000000000000..39f014f5a03c92684ee3a1576fa4cf66bd118d31 --- /dev/null +++ b/src/effetsAudioNumeriques.m @@ -0,0 +1,59 @@ +% Chargement du fichier signal_excitation.mat qui contient les signaux xe1 et xe2 + +fe = load('signal_excitation.mat', 'fe'); +xe1 = load('signal_excitation.mat', 'xe1'); +xe2 = load('signal_excitation.mat', 'xe2'); + +% Extract the signals from the structures +fe = fe.fe; % Get the sampling frequency +xe1 = xe1.xe1; % Get the first signal +xe2 = xe2.xe2; % Get the second signal + +% Calculate autocorrelation of xe1 +[r_xe1, lags_xe1] = xcorr(xe1, 'biased'); + +% Calculate autocorrelation of xe2 +[r_xe2, lags_xe2] = xcorr(xe2, 'biased'); + +% Plot the autocorrelation of xe1 +figure; +subplot(2, 1, 1); +plot(lags_xe1 / fe, r_xe1); +title('Autocorrelation of xe1'); +xlabel('Time (s)'); +ylabel('Autocorrelation'); +grid on; +xlim([-0.1, 0.1]); % Adjust x-axis limits for better visibility +subplot(2, 1, 2); +plot(lags_xe2 / fe, r_xe2); +title('Autocorrelation of xe2'); +xlabel('Time (s)'); +ylabel('Autocorrelation'); +grid on; +xlim([-0.1, 0.1]); % Adjust x-axis limits for better visibility + +% Simulate the room effect on both excitation signals +y1 = simule_piece(xe1, fe); +y2 = simule_piece(xe2, fe); + +% Estimate the impulse response using the cross-correlation method +[h1_est, lags_h1] = xcorr(y1, r_xe1, 'none'); +[h2_est, lags_h2] = xcorr(y2, r_xe2, 'none'); + +% Plot the estimated impulse responses +figure; +subplot(2, 1, 1); +plot(lags_h1 / fe, h1_est); +title('Estimated Impulse Response using xe1'); +xlabel('Time (s)'); +ylabel('Amplitude'); +grid on; +xlim([0, 0.1]); % Show only the causal part + +subplot(2, 1, 2); +plot(lags_h2 / fe, h2_est); +title('Estimated Impulse Response using xe2'); +xlabel('Time (s)'); +ylabel('Amplitude'); +grid on; +xlim([0, 0.1]); % Show only the causal part \ No newline at end of file diff --git a/src/filtered_sawtooth.wav b/src/filtered_sawtooth.wav index 15c9ff303277e26eb7c3d8582ccd70f82e3db398..a35a9bdcfd1816598b29f375e4a0899094af1b97 100644 Binary files a/src/filtered_sawtooth.wav and b/src/filtered_sawtooth.wav differ diff --git a/src/filtered_square.wav b/src/filtered_square.wav index c1b7907d9cbb63ee2f90915a4cd8be22c13261cf..928f0eb442099229e5edaa98452bff55682caff8 100644 Binary files a/src/filtered_square.wav and b/src/filtered_square.wav differ diff --git a/src/guitar_reverb.wav b/src/guitar_reverb.wav new file mode 100644 index 0000000000000000000000000000000000000000..9487d127910f1989a6714c90dda85f3c656e96a4 Binary files /dev/null and b/src/guitar_reverb.wav differ diff --git a/src/original_sawtooth.wav b/src/original_sawtooth.wav index d67b8a72f133c61206fefdc068e1bee4c3b21479..d54e8cae000662357b06b433d401cea36055648a 100644 Binary files a/src/original_sawtooth.wav and b/src/original_sawtooth.wav differ diff --git a/src/original_square.wav b/src/original_square.wav index e47d7ab71468da05ee241852692ee89fa3080c50..be562653847ce9493b99334b3d58685a30c76488 100644 Binary files a/src/original_square.wav and b/src/original_square.wav differ diff --git a/src/simule_piece_guitar.wav b/src/simule_piece_guitar.wav new file mode 100644 index 0000000000000000000000000000000000000000..a13b4b61aab9c1400c7a8976d2e627bf0bfa65b7 Binary files /dev/null and b/src/simule_piece_guitar.wav differ diff --git a/src/syntheseSoustractive.m b/src/syntheseSoustractive.m index bfd94e1f78c67a27eda4b4f6c15bcb8f3988c6ea..1855aa6a38d32aae35b75447323275b861136970 100644 --- a/src/syntheseSoustractive.m +++ b/src/syntheseSoustractive.m @@ -1,7 +1,7 @@ % Paramètres du signal A = 1; % Amplitude -T = 1; % Période -Fs = 1000; % Fréquence d'échantillonnage +T = 0.001; % Période +Fs = 10000; % Fréquence d'échantillonnage t = 0:1/Fs:1000*T; % Vecteur temps (1000 périodes pour meilleure visualisation) % Signal carré centré @@ -59,9 +59,14 @@ ylabel('Amplitude'); % Implémentation du filtre y(k) = 0.5 * (x(k) + x(k-1)) b = [0.5, 0.5]; % Coefficients du numérateur a = [1]; % Coefficients du dénominateur + +% New filter +d = designfilt('lowpassfir','FilterOrder',2,'HalfPowerFrequency',0.25); +filterAnalyzer(d) + % Application du filtre aux signaux -filtered_square = filter(b, a, square_signal); -filtered_sawtooth = filter(b, a, sawtooth_signal); +filtered_square = filter(d, square_signal); +filtered_sawtooth = filter(d, sawtooth_signal); % Calcul du spectre des signaux filtrés filtered_square_fft = fftshift(fft(filtered_square)); @@ -141,17 +146,13 @@ duration = 2; % Durée en secondes audio_Fs = 44100; % Fréquence d'échantillonnage pour l'audio (standard) % Paramètres des signaux -freq = 440; % Fréquence fondamentale en Hz (La4) +freq = 1/T; % Fréquence fondamentale en Hz (La4) audio_t = 0:1/audio_Fs:duration-1/audio_Fs; % Vecteur temps pour l'audio % Génération des signaux source à fréquence audible audio_square = A * square(2 * pi * freq * audio_t); audio_sawtooth = A * sawtooth(2 * pi * freq * audio_t); -% New filter -d = designfilt('lowpassfir','FilterOrder',2,'HalfPowerFrequency',0.25) -filterAnalyzer(d) - % Création d'une enveloppe ADSR simple attack_time = 0.1; % secondes decay_time = 0.2; % secondes @@ -194,23 +195,39 @@ audiowrite('filtered_sawtooth.wav', filtered_sawtooth, audio_Fs); audiowrite('original_square.wav', audio_square, audio_Fs); audiowrite('original_sawtooth.wav', audio_sawtooth, audio_Fs); -% Affichage des FFT des signaux audio sur le même graphique +% Calcul et affichage des spectres des signaux audio +audio_square_fft = fftshift(fft(audio_square)); +audio_square_magnitude = abs(audio_square_fft) / length(audio_square); +audio_sawtooth_fft = fftshift(fft(audio_sawtooth)); +audio_sawtooth_magnitude = abs(audio_sawtooth_fft) / length(audio_sawtooth); +audio_filtered_square_fft = fftshift(fft(filtered_square)); +audio_filtered_square_magnitude = abs(audio_filtered_square_fft) / length(filtered_square); +audio_filtered_sawtooth_fft = fftshift(fft(filtered_sawtooth)); +audio_filtered_sawtooth_magnitude = abs(audio_filtered_sawtooth_fft) / length(filtered_sawtooth); + +% Affichage des spectres audio figure; -subplot(2, 1, 1); -plot(f, abs(fftshift(fft(audio_square)))/N); -hold on; -plot(f, abs(fftshift(fft(filtered_square)))/N); -title('FFT du signal carré et du signal carré filtré'); +subplot(2, 2, 1); +plot(linspace(-audio_Fs/2, audio_Fs/2, length(audio_square)), audio_square_magnitude); +title('Spectre du signal carré original'); xlabel('Fréquence (Hz)'); ylabel('Amplitude'); -legend('Signal carré', 'Signal carré filtré'); -xlim([-100, 100]); % Zoom sur les basses fréquences -subplot(2, 1, 2); -plot(f, abs(fftshift(fft(audio_sawtooth)))/N); -hold on; -plot(f, abs(fftshift(fft(filtered_sawtooth)))/N); -title('FFT du signal dent de scie et du signal dent de scie filtré'); +xlim([-1000, 1000]); % Zoom sur les basses fréquences +subplot(2, 2, 2); +plot(linspace(-audio_Fs/2, audio_Fs/2, length(filtered_square)), audio_filtered_square_magnitude); +title('Spectre du signal carré filtré'); xlabel('Fréquence (Hz)'); ylabel('Amplitude'); -legend('Signal dent de scie', 'Signal dent de scie filtré'); -xlim([-100, 100]); % Zoom sur les basses fréquences +xlim([-1000, 1000]); % Zoom sur les basses fréquences +subplot(2, 2, 3); +plot(linspace(-audio_Fs/2, audio_Fs/2, length(audio_sawtooth)), audio_sawtooth_magnitude); +title('Spectre du signal dent de scie original'); +xlabel('Fréquence (Hz)'); +ylabel('Amplitude'); +xlim([-1000, 1000]); % Zoom sur les basses fréquences +subplot(2, 2, 4); +plot(linspace(-audio_Fs/2, audio_Fs/2, length(filtered_sawtooth)), audio_filtered_sawtooth_magnitude); +title('Spectre du signal dent de scie filtré'); +xlabel('Fréquence (Hz)'); +ylabel('Amplitude'); +xlim([-1000, 1000]); % Zoom sur les basses fréquences diff --git a/src/synthesized_piano1.wav b/src/synthesized_piano1.wav deleted file mode 100644 index b8d67b2940f60ef71de18d147648f5ad2245a6a3..0000000000000000000000000000000000000000 Binary files a/src/synthesized_piano1.wav and /dev/null differ diff --git a/src/synthesized_piano1_ifft.wav b/src/synthesized_piano1_ifft.wav deleted file mode 100644 index 8df167bd2d9f9af031c48f7630a913141e7d2a8c..0000000000000000000000000000000000000000 Binary files a/src/synthesized_piano1_ifft.wav and /dev/null differ diff --git a/src/synthesized_piano1_with_adsr.wav b/src/synthesized_piano1_with_adsr.wav deleted file mode 100644 index c07eb995a5c28d57dd50b903890e4ef12df92ced..0000000000000000000000000000000000000000 Binary files a/src/synthesized_piano1_with_adsr.wav and /dev/null differ diff --git a/src/test_effet_reverb.m b/src/test_effet_reverb.m new file mode 100644 index 0000000000000000000000000000000000000000..7ff06ccff11c4698bf4cf26bfd16d9816cc339c2 --- /dev/null +++ b/src/test_effet_reverb.m @@ -0,0 +1,21 @@ +% Get the sample rate +[guitar, Fs] = audioread('wav/single_tone_guitar_nylon_string_a3.wav'); + +guitar = guitar(:, 1); % Use only one channel if stereo + +fe = load('signal_excitation.mat', 'fe'); +xe1 = load('signal_excitation.mat', 'xe1'); +xe2 = load('signal_excitation.mat', 'xe2'); +fe = fe.fe; % Get the sampling frequency +xe1 = xe1.xe1; % Get the first signal +xe2 = xe2.xe2; % Get the second signal +y1 = simule_piece(xe1, fe); +y2 = simule_piece(xe2, fe); +% Estimate the impulse response using the cross-correlation method +[h1_est, lags_h1] = xcorr(y1, xe1, 'none'); +[h2_est, lags_h2] = xcorr(y2, xe2, 'none'); + +guitar_rev = effet_reverb(guitar, h2_est); + +audiowrite('simule_piece_guitar.wav', guitar_rev, Fs); +