Skip to content
Snippets Groups Projects
Commit dffe8a13 authored by TeodoreAutuly's avatar TeodoreAutuly
Browse files

part 3

parent b6eb6692
Branches
No related tags found
No related merge requests found
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
% 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
No preview for this file type
No preview for this file type
File added
No preview for this file type
No preview for this file type
File added
% 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
File deleted
File deleted
File deleted
% 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);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment