diff --git a/src/question/ADSR.png b/src/question/ADSR.png new file mode 100644 index 0000000000000000000000000000000000000000..95e70bf34fb65ff50173bc9babb9b2d783ccdbeb Binary files /dev/null and b/src/question/ADSR.png differ diff --git a/src/question/accord_piano_delay.wav b/src/question/accord_piano_delay.wav new file mode 100644 index 0000000000000000000000000000000000000000..aeafbfc4469e6377dccf99fa39c063b6b9876266 Binary files /dev/null and b/src/question/accord_piano_delay.wav differ diff --git a/src/question/analyse_delay.m b/src/question/analyse_delay.m new file mode 100644 index 0000000000000000000000000000000000000000..d783b599d60db9728f56a426b8bb83c71f133eaf --- /dev/null +++ b/src/question/analyse_delay.m @@ -0,0 +1,25 @@ +%% analyse_delay.m – Question 3.12 +clear; clc; close all; + +% Paramètres du filtre +g = 0.7; +tau = 5; % ici on prend un petit tau pour mieux visualiser h(k) +N = 100; % longueur d’analyse (nombre d’échantillons affichés) + +% Vecteurs a et b +a = [1, zeros(1, tau - 1), g]; +b = [1]; + +% Signal d’entrée : Dirac +x = [1; zeros(N-1, 1)]; + +% Réponse impulsionnelle par filter() +h = filter(b, a, x); + +% Affichage +k = 0:N-1; +stem(k, h, 'filled'); +xlabel('k'); ylabel('h(k)'); +title('Réponse impulsionnelle du filtre (via filter)'); +grid on; +saveas(gcf, 'impulsion_filter_delay.png'); diff --git a/src/question/comp_fft_theorie_delay.png b/src/question/comp_fft_theorie_delay.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d624a7f3d3dbfdbfb041f2f813123bdfc5c1a9 Binary files /dev/null and b/src/question/comp_fft_theorie_delay.png differ diff --git a/src/question/delay_025s_g09.png b/src/question/delay_025s_g09.png new file mode 100644 index 0000000000000000000000000000000000000000..2710adabea11f5717c90310a10d9f89543e483a9 Binary files /dev/null and b/src/question/delay_025s_g09.png differ diff --git a/src/question/effet_delay.m b/src/question/effet_delay.m new file mode 100644 index 0000000000000000000000000000000000000000..e2c8d005502b926124bee5c8ab0abeff1366bef1 --- /dev/null +++ b/src/question/effet_delay.m @@ -0,0 +1,25 @@ +function y = effet_delay(x, delay_sec, g, Fe) +% effet_delay : applique un effet de délai récurrent de type IIR +% Entrées : +% x : signal d'entrée (vecteur colonne) +% delay_sec : délai en secondes +% g : coefficient d'amortissement +% Fe : fréquence d'échantillonnage (en Hz) +% Sortie :g +% y : signal de sortie filtré + + % Convertir le délai en nombre d'échantillons + tau = round(delay_sec * Fe); + + % Vérifier les dimensions + if size(x, 2) > 1 + x = x(:,1); % on garde qu’un seul canal si stéréo + end + + % Définir les coefficients du filtre + b = 1; + a = [1, zeros(1, tau - 1), g]; % a = [1 0 ... 0 g] (longueur tau+1) + + % Appliquer le filtre + y = filter(b, a, x); +end diff --git a/src/question/effet_delay_filtre.m b/src/question/effet_delay_filtre.m new file mode 100644 index 0000000000000000000000000000000000000000..673a936564f32666dec82214c98523f89a758862 --- /dev/null +++ b/src/question/effet_delay_filtre.m @@ -0,0 +1,24 @@ +function y = effet_delay_filtre(x, delay_sec, g, Fe) +% effet_delay_filtre - applique un effet delay en utilisant la fonction filter +% +% Entrées : +% x : signal d'entrée (vecteur colonne) +% delay_sec : délai en secondes (ex: 0.25) +% g : coefficient d'amortissement (ex: 0.9) +% Fe : fréquence d'échantillonnage (ex: 44100) +% +% Sortie : +% y : signal de sortie avec effet delay + + % Convertir le délai en nombre d’échantillons + tau = round(delay_sec * Fe); + + % Vecteur b (numérateur) : [1] + b = 1; + + % Vecteur a (dénominateur) : [1, 0, 0, ..., 0, g] + a = [1, zeros(1, tau - 1), g]; + + % Appliquer le filtre avec les vecteurs b et a + y = filter(b, a, x); +end diff --git a/src/question/effet_reverb.m b/src/question/effet_reverb.m new file mode 100644 index 0000000000000000000000000000000000000000..df37a27a941336e44eff96dcb3ccfd271626169a --- /dev/null +++ b/src/question/effet_reverb.m @@ -0,0 +1,6 @@ +function y = effet_reverb(x, h) +% Applique un effet de réverbération à un signal audio x +% en convoluant avec une réponse impulsionnelle h. + + y = conv(x, h, 'same'); % conserve la taille du signal d'entrée +end diff --git a/src/question/effet_reverb_fft.m b/src/question/effet_reverb_fft.m new file mode 100644 index 0000000000000000000000000000000000000000..66ec2aa6ccd6f74164b6ef3d0f051e78188d48b0 --- /dev/null +++ b/src/question/effet_reverb_fft.m @@ -0,0 +1,9 @@ +function y = effet_reverb_fft(x, h) +% Applique une réverbération par convolution rapide avec FFT + + N = length(x) + length(h) - 1; % taille totale pour éviter repliement + X = fft(x, N); + H = fft(h, N); + Y = X .* H; + y = ifft(Y, N); % retour dans le domaine temporel +end diff --git a/src/question/effet_reverberation.m b/src/question/effet_reverberation.m new file mode 100644 index 0000000000000000000000000000000000000000..b07b0d128702023609a50c03675052d5a2b8fdd0 --- /dev/null +++ b/src/question/effet_reverberation.m @@ -0,0 +1,27 @@ +clear all; close all; clc; + +% Charger les signaux d'excitation et leur fréquence d'échantillonnage +load('signal_excitation.mat'); % variables : xe1, xe1, fe + +% Étape 1 – Simuler l'effet de la pièce sur le signal xe1 +y = simule_piece(xe1, fe); % ⚠️ on passe aussi la fréquence fe + +% (optionnel) Écouter le signal en sortie +soundsc(y, fe); + +% Étape 2 – Calcul de l’intercorrélation R_yx(u) +r_est = xcorr(y, xe1); % intercorrélation entre sortie et excitation +lags = -(length(xe1)-1):(length(y)-1); % axe des décalages + +% Étape 3 – Centrer sur la partie causale (à partir du pic) +[~, i_max] = max(r_est); +r_causale = r_est(i_max:end); % on garde seulement la partie causale +temps = (0:length(r_causale)-1) / fe; % axe temporel en secondes + +% Étape 4 – Affichage de la réponse impulsionnelle estimée +figure; +plot(temps, r_causale, 'LineWidth', 1.5); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Réponse impulsionnelle estimée de la pièce'); +grid on; diff --git a/src/question/empreinte_ac.mat b/src/question/empreinte_ac.mat new file mode 100644 index 0000000000000000000000000000000000000000..813112aa851768cfec53dc808d887032c417d7c5 Binary files /dev/null and b/src/question/empreinte_ac.mat differ diff --git a/src/question/example_with_wave_file.m b/src/question/example_with_wave_file.m new file mode 100644 index 0000000000000000000000000000000000000000..efdc07d6b29d048580f5182ca3150736055b5ff5 --- /dev/null +++ b/src/question/example_with_wave_file.m @@ -0,0 +1,7 @@ +[x_piano, Fe] = audioread("synthetic_piano_ADSR.wav"); +x_piano = x_piano(:,1); % mono +delay_time = 0.25; +g = 0.9; +K = 10; +y_filtre = effet_delay_filtre(x_piano, delay_time, g, K, Fe); +soundsc(y_filtre, Fe); diff --git a/src/question/impulsion_filter_delay.png b/src/question/impulsion_filter_delay.png new file mode 100644 index 0000000000000000000000000000000000000000..8a98bb47102b05e6f02fa0417fb3dda8f7ac9460 Binary files /dev/null and b/src/question/impulsion_filter_delay.png differ diff --git a/src/question/piano1_harmonique_synthetique.wav b/src/question/piano1_harmonique_synthetique.wav new file mode 100644 index 0000000000000000000000000000000000000000..a81a65a88f13adc4ad2f2f612d31e0db6c6b1147 Binary files /dev/null and b/src/question/piano1_harmonique_synthetique.wav differ diff --git a/src/question/piano1_synth_ADSR.wav b/src/question/piano1_synth_ADSR.wav new file mode 100644 index 0000000000000000000000000000000000000000..85a998b29fd6b9b850d1b975189cb23c625efd87 Binary files /dev/null and b/src/question/piano1_synth_ADSR.wav differ diff --git a/src/question/piano1_synth_fourier_inverse.wav b/src/question/piano1_synth_fourier_inverse.wav new file mode 100644 index 0000000000000000000000000000000000000000..7b4006d555705b116db08671949770b67816728a Binary files /dev/null and b/src/question/piano1_synth_fourier_inverse.wav differ diff --git a/src/question/piano1_synth_harmoniques.wav b/src/question/piano1_synth_harmoniques.wav new file mode 100644 index 0000000000000000000000000000000000000000..587bc28a1843eec0096788e0b8497a5c90b4eb96 Binary files /dev/null and b/src/question/piano1_synth_harmoniques.wav differ diff --git a/src/question/piano_delay_filtre.wav b/src/question/piano_delay_filtre.wav new file mode 100644 index 0000000000000000000000000000000000000000..aeafbfc4469e6377dccf99fa39c063b6b9876266 Binary files /dev/null and b/src/question/piano_delay_filtre.wav differ diff --git a/src/question/q15_comparaison_adsr_vs_ifft.png b/src/question/q15_comparaison_adsr_vs_ifft.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7245fe10a505629b8c79cc13cb8089125d4441 Binary files /dev/null and b/src/question/q15_comparaison_adsr_vs_ifft.png differ diff --git a/src/question/q15_comparaison_temporelle.png b/src/question/q15_comparaison_temporelle.png new file mode 100644 index 0000000000000000000000000000000000000000..3751ed19f97ea5c819bf22418c292c7774ad4c3a Binary files /dev/null and b/src/question/q15_comparaison_temporelle.png differ diff --git a/src/question/q15_diff_adsr_vs_ifft.png b/src/question/q15_diff_adsr_vs_ifft.png new file mode 100644 index 0000000000000000000000000000000000000000..fb794223e010a34b367c3d76b0d138498dd7511a Binary files /dev/null and b/src/question/q15_diff_adsr_vs_ifft.png differ diff --git a/src/question/q15_signal_ifft.png b/src/question/q15_signal_ifft.png new file mode 100644 index 0000000000000000000000000000000000000000..0e08be792fd65d6349b5f785c07a308d31656de5 Binary files /dev/null and b/src/question/q15_signal_ifft.png differ diff --git a/src/question/q15_synth_ifft.wav b/src/question/q15_synth_ifft.wav new file mode 100644 index 0000000000000000000000000000000000000000..b0349cc1b684fc828c929308fdf0fd983c937f02 Binary files /dev/null and b/src/question/q15_synth_ifft.wav differ diff --git a/src/question/q15_synth_piano1_ifft.wav b/src/question/q15_synth_piano1_ifft.wav new file mode 100644 index 0000000000000000000000000000000000000000..9259b98deb30799ad0bd7acab274e2f9bd55b8ff Binary files /dev/null and b/src/question/q15_synth_piano1_ifft.wav differ diff --git a/src/question/q21_dentscie_fft_vs_fourier.png b/src/question/q21_dentscie_fft_vs_fourier.png new file mode 100644 index 0000000000000000000000000000000000000000..4db36cfcda2994aa7e468608b70ac9a3b012243a Binary files /dev/null and b/src/question/q21_dentscie_fft_vs_fourier.png differ diff --git a/src/question/q21_fft_vs_fourier.png b/src/question/q21_fft_vs_fourier.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0c53e46cf9c6c55a78fb3805ed6430dfb5f5ba Binary files /dev/null and b/src/question/q21_fft_vs_fourier.png differ diff --git a/src/question/q21_spectres_carre_dent.png b/src/question/q21_spectres_carre_dent.png new file mode 100644 index 0000000000000000000000000000000000000000..4acaf327b543f4d5a16a83e2b9285c39cb90e7c5 Binary files /dev/null and b/src/question/q21_spectres_carre_dent.png differ diff --git a/src/question/q21_spectres_fftshift.png b/src/question/q21_spectres_fftshift.png new file mode 100644 index 0000000000000000000000000000000000000000..225e5b0358ff668de934d264da8b71c6cdf2e544 Binary files /dev/null and b/src/question/q21_spectres_fftshift.png differ diff --git a/src/question/q23_saw_filtered.wav b/src/question/q23_saw_filtered.wav new file mode 100644 index 0000000000000000000000000000000000000000..484e7ad43949f64ff9d4b8f74d391e9fe78ce697 Binary files /dev/null and b/src/question/q23_saw_filtered.wav differ diff --git a/src/question/q23_square_filtered.wav b/src/question/q23_square_filtered.wav new file mode 100644 index 0000000000000000000000000000000000000000..9889028f9667bc84abb737504c9f10e8cc798bbb Binary files /dev/null and b/src/question/q23_square_filtered.wav differ diff --git a/src/question/q24_signaux_filtres.png b/src/question/q24_signaux_filtres.png new file mode 100644 index 0000000000000000000000000000000000000000..15008ef8f997d8fd219d2471d4138206edd1f064 Binary files /dev/null and b/src/question/q24_signaux_filtres.png differ diff --git a/src/question/q312_reponse_impulsionnelle.png b/src/question/q312_reponse_impulsionnelle.png new file mode 100644 index 0000000000000000000000000000000000000000..239f438c4facb4add998a2a29ac7b4a998d6b9f7 Binary files /dev/null and b/src/question/q312_reponse_impulsionnelle.png differ diff --git a/src/question/q314_reponse_frequentielle.png b/src/question/q314_reponse_frequentielle.png new file mode 100644 index 0000000000000000000000000000000000000000..51cedaa3e62133dafc4875fd8344c4d1bbe6d0e8 Binary files /dev/null and b/src/question/q314_reponse_frequentielle.png differ diff --git a/src/question/question1_1.m b/src/question/question1_1.m new file mode 100644 index 0000000000000000000000000000000000000000..00b20fcee8167730df47ff887198b2d321edacc7 --- /dev/null +++ b/src/question/question1_1.m @@ -0,0 +1,29 @@ +%% this is a simple example to read and play a wave file with matlab +% set a string variable to a wave filename we want to open: +note = "wav/single_tone_trumpet-a3.wav"; +% read the content of the wave file: +[data,fe] = audioread(note); +% data is a matrix with 2 columns if the sound is stereo; keep the mono to ease further processing +data = data(:,1); +% get the number of sample in vector data +N = length(data); +% play the sound in the audio output: +% soundsc(data,fe); +fft_data = fft(data); +data_shift = fftshift(fft_data); +f = (-N/2:N/2-1)*(fe/N); +amplitude_db = 20*log10(abs(data_shift)); +figure; +% affichage +figure; +plot(f, amplitude_db); +xlabel('Frequence (Hz)'); +ylabel('Amplitude (dB)'); +title('Spectre centré - Trompette'); +%xlim([-5000 5000]); +grid on; +% frequence fondamentale +[~, idx_max] = max(amplitude_db(f>0)) +frequence_fondamentale = f(f>0) +frequence_fondamentale = frequence_fondamentale(idx_max) +disp(['Fréquence fondamentale = ' num2str(frequence_fondamentale) ' Hz']); diff --git a/src/question/question1_2.m b/src/question/question1_2.m new file mode 100644 index 0000000000000000000000000000000000000000..01528c5929467eaa7a8598a5cb7f25b8554bc447 --- /dev/null +++ b/src/question/question1_2.m @@ -0,0 +1,83 @@ +% Fichiers audio +piano1 = "single_tone_piano1.wav"; +piano2 = "wav/single_tone_piano2.wav"; +% Lecture des sons +[x1, Fe1] = audioread(piano1); +[x2, Fe2] = audioread(piano2); +x1 = x1(:,1); x2 = x2(:,1); % mono +% Vérification fréquence d’échantillonnage +assert(Fe1 == Fe2, "Les fichiers doivent avoir la même fréquence d’échantillonnage"); +Fe = Fe1; +% FFT et spectre +N1 = length(x1); N2 = length(x2); +X1 = fft(x1); X2 = fft(x2); +f1 = (0:N1-1)*(Fe/N1); f2 = (0:N2-1)*(Fe/N2); +amp1_db = 20*log10(abs(X1) + eps); amp2_db = 20*log10(abs(X2) + eps); +% Affichage des spectres +figure; +plot(f1, amp1_db, 'b', 'DisplayName', 'Piano 1'); hold on; +plot(f2, amp2_db, 'r', 'DisplayName', 'Piano 2'); +xlabel('Fréquence (Hz)'); ylabel('Amplitude (dB)'); +title('Spectres des sons de piano'); +legend; grid on; +xlim([0 5000]); + +% Fréquences fondamentales +[~, idx1] = max(amp1_db(1:floor(N1/2))); +f0_piano1 = f1(idx1); + + +% Détection du premier pic significatif pour Piano 2 +amp2_half = amp2_db(1:floor(N2/2)); +f2_half = f2(1:floor(N2/2)); + +% Trouver les pics locaux +[pk_vals, pk_locs] = findpeaks(amp2_half, 'MinPeakHeight', max(amp2_half)-20); % seuil à ajuster si besoin + +if isempty(pk_locs) + error('Aucun pic significatif détecté dans le spectre du piano 2'); +end + +% Premier pic (fréquence fondamentale estimée) +f0_piano2 = f2_half(pk_locs(1)); + + + +% Analyse harmonique + +f_th1 = zeros(1, nH); f_th2 = zeros(1, nH); +f_mes1 = zeros(1, nH); f_mes2 = zeros(1, nH); +inharm1 = zeros(1, nH); inharm2 = zeros(1, nH); +% --- Analyse Piano 1 --- +for i = 1:7 + f_th1(i) = f0_piano1 * i; + idx_win1 = find(f1 > f_th1(i)-10 & f1 < f_th1(i)+10); + [~, local_max1] = max(amp1_db(idx_win1)); + f_mes1(i) = f1(idx_win1(local_max1)); + inharm1(i) = 1200 * (log2(f_mes1(i)) - log2(f_th1(i))); +end +% --- Analyse Piano 2 --- +for i = 1:7 + f_th2(i) = f0_piano2 * i; + idx_win2 = find(f2 > f_th2(i)-10 & f2 < f_th2(i)+10); + [~, local_max2] = max(amp2_db(idx_win2)); + f_mes2(i) = f2(idx_win2(local_max2)); + inharm2(i) = 1200 * (log2(f_mes2(i)) - log2(f_th2(i))); +end +% --- Affichage du tableau Piano 1 --- +fprintf('\nAnalyse harmonique du Piano 1\n'); +fprintf('Harm | f_th (Hz) | f_mes (Hz) | Inharmonicité (cents)\n'); +fprintf('-----|------------|-------------|------------------------\n'); +for i = 1:nH + fprintf('%4d | %10.2f | %11.2f | %20.2f\n', ... + i, f_th1(i), f_mes1(i), inharm1(i)); +end +% --- Affichage du tableau Piano 2 --- +fprintf('\n Analyse harmonique du Piano 2\n'); +fprintf('Harm | f_th (Hz) | f_mes (Hz) | Inharmonicité (cents)\n'); +fprintf('-----|------------|-------------|------------------------\n'); +for i = 1:nH + fprintf('%4d | %10.2f | %11.2f | %20.2f\n', ... + i, f_th2(i), f_mes2(i), inharm2(i)); +end + diff --git a/src/question/question1_3.m b/src/question/question1_3.m new file mode 100644 index 0000000000000000000000000000000000000000..56a3d1bdf5ccce21b3bc7a0a1afd73aad96ddab4 --- /dev/null +++ b/src/question/question1_3.m @@ -0,0 +1,45 @@ +% Chargement du son piano1 +[x, Fe] = audioread("single_tone_piano1.wav"); +x = x(:,1); % Passage en mono si besoin +% Calcul de la FFT +N = length(x); +X = fft(x); +f = (0:N-1)*(Fe/N); +amp = abs(X); +% Estimation de la fréquence fondamentale +[~, idx_f0] = max(amp(1:floor(N/2))); +f0 = f(idx_f0); +fprintf("Fréquence fondamentale estimée : %.2f Hz\n", f0); +% Récupération des fréquences et amplitudes des 8 premières harmoniques +nH = 8; +frequences = zeros(1, nH); +amplitudes = zeros(1, nH); +for n = 1:nH + f_th = n * f0; + idx_range = find(f > f_th - 10 & f < f_th + 10); + [~, idx_local] = max(amp(idx_range)); + idx_max = idx_range(idx_local); + frequences(n) = f(idx_max); + amplitudes(n) = amp(idx_max); +end +% Normalisation des amplitudes +amplitudes = amplitudes / max(amplitudes); +% Synthèse du signal harmonique +duree = 6; % Durée du signal +t = linspace(0, duree, round(duree * Fe)); +y = zeros(size(t)); +for n = 1:nH + y = y + amplitudes(n) * sin(2 * pi * frequences(n) * t); +end +% Normalisation +y = y / max(abs(y)); +% Écoute et sauvegarde +soundsc(y, Fe); +audiowrite("piano1_synth_harmoniques.wav", y, Fe); +% Affichage des amplitudes en fonction des fréquences mesurées (Hz) +figure; +plot(frequences, amplitudes, '-', 'LineWidth', 2); +xlabel('Fréquence (Hz)'); +ylabel('Amplitude normalisée'); +title('Amplitudes des 8 premières harmoniques mesurées dans piano1.wav'); +grid on; diff --git a/src/question/question1_4.m b/src/question/question1_4.m new file mode 100644 index 0000000000000000000000000000000000000000..34939a09eabbbc7b1282d68b44c170b820d277b4 --- /dev/null +++ b/src/question/question1_4.m @@ -0,0 +1,61 @@ +%% Question 1.4 - Synthèse d'un son de piano avec enveloppe ADSR réaliste +% Paramètres de base +fe = 44100; % Fréquence d’échantillonnage +f1 = 220.37; % Fréquence fondamentale du piano +A = [1, 0.7, 0.5, 0.3, 0.2, 0.15, 0.1, 0.05]; % Amplitudes des harmoniques + +% Durée totale souhaitée +dur = 6; % secondes +t = linspace(0, dur, round(dur * fe)); % Axe temporel + +% Proportions ADSR en % de la durée totale +attack_ratio = 0.10; % 10% +decay_ratio = 0.10; % 10% +sustain_ratio = 0.70; % 70% +release_ratio = 0.10; % 10% + +% Durées effectives de chaque phase +attack = attack_ratio * dur; +decay = decay_ratio * dur; +sustain = sustain_ratio * dur; +release = release_ratio * dur; + +% Niveau d'amplitude pendant la phase de sustain +sustain_level = 0.6; + +% Construction de l'enveloppe ADSR +env = [linspace(0, 1, round(attack * fe)), ... + linspace(1, sustain_level, round(decay * fe)), ... + sustain_level * ones(1, round(sustain * fe)), ... + linspace(sustain_level, 0, round(release * fe))]; + +% Ajustement de la taille de l'enveloppe si besoin +env = env(1:min(length(env), length(t))); +env = [env, zeros(1, length(t) - length(env))]; % Complète si besoin + +% Synthèse par addition des 8 harmoniques +y = zeros(size(t)); +for n = 1:length(A) + y = y + A(n) * sin(2 * pi * f1 * n * t); +end + +% Application de l'enveloppe +y = y .* env; + +% Normalisation +y = y / max(abs(y)); + +% Lecture du son +soundsc(y, fe); + +% Sauvegarde +audiowrite('synthetic_piano_ADSR.wav', y, fe); + +% Tracé de l'enveloppe +figure; +plot(t, env, 'LineWidth', 1.5); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Enveloppe ADSR - Son synthétique de piano'); +grid on; +saveas(gcf, 'ADSR.png'); % pour le rapport \ No newline at end of file diff --git a/src/question/question1_5.m b/src/question/question1_5.m new file mode 100644 index 0000000000000000000000000000000000000000..ed2de403cbaee13dab723687bc485d5c06083e6e --- /dev/null +++ b/src/question/question1_5.m @@ -0,0 +1,26 @@ +Fe = 8000; % fréquence d’échantillonnage +T = 1; % durée (s) +N = Fe * T; % nombre d’échantillons + +f_mes = [220.37, 442.04, 663.22, 885.54, 1108.34, 1331.46, 1552.48]; +A = exp(-0.5*(0:6)); % mêmes amplitudes que la première synthèse + +X = zeros(1, N); + +for i = 1:length(f_mes) + k = round(f_mes(i) * N / Fe); + if k < N/2 + X(k+1) = A(i); + X(N-k+1) = conj(A(i)); + end +end + +x = real(ifft(X)); + +% Affichage temporel +t = (0:N-1)/Fe; +plot(t, x); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Signal synthétisé par TFDi'); +grid on; diff --git a/src/question/question2_3.m b/src/question/question2_3.m new file mode 100644 index 0000000000000000000000000000000000000000..5a12ac78f1ff958432c03fc02f3dd1be85dc5283 --- /dev/null +++ b/src/question/question2_3.m @@ -0,0 +1,35 @@ +%% Paramètres initiaux +fs = 44100; % Fréquence d'échantillonnage (Hz) +duration = 2; % Durée du son (s) +t = 0:1/fs:duration-1/fs; + +%% 1. Synthèse soustractive avec différents signaux sources +% Génération des signaux +f0 = 440; % Fréquence fondamentale (La 440 Hz) + +% Signal carré (harmoniques impaires) +square_wave = 0.5 * square(2*pi*f0*t); + +% Signal en dents de scie (toutes les harmoniques) +sawtooth_wave = 0.5 * sawtooth(2*pi*f0*t); + +% Signal triangle (harmoniques atténuées) +triangle_wave = 0.5 * sawtooth(2*pi*f0*t, 0.5); + +% Filtre passe-bas d'ordre 2 +d_lowpass = designfilt('lowpassfir', 'FilterOrder', 2, 'HalfPowerFrequency', 0.25); + +% Application du filtre +filtered_square = filter(d_lowpass, square_wave); +filtered_sawtooth = filter(d_lowpass, sawtooth_wave); + +%% 2. Synthèse additive (exemple : 3 harmoniques) +% Harmoniques : f0, 2f0, 3f0 avec amplitudes décroissantes +additive_sound = 0.5*sin(2*pi*f0*t) + 0.3*sin(2*pi*2*f0*t) + 0.1*sin(2*pi*3*f0*t); + +%% Écoute et analyse +% Jouer les sons +soundsc(filtered_square, fs); pause(duration + 1); +soundsc(filtered_sawtooth, fs); pause(duration + 1); +soundsc(additive_sound, fs); + diff --git a/src/question/question2_4.m b/src/question/question2_4.m new file mode 100644 index 0000000000000000000000000000000000000000..eb4e1b55a96625b31bb625722329966762e49566 --- /dev/null +++ b/src/question/question2_4.m @@ -0,0 +1,86 @@ +%% ========== Paramètres initiaux ========== +fs = 44100; % Fréquence d'échantillonnage (Hz) +duration = 2; % Durée du son (s) +t = 0:1/fs:duration-1/fs; +f0 = 440; % Fréquence fondamentale (La 440 Hz) + +%% ========== Question 2.3 ========== +%% 1. Génération des signaux carré et dents de scie +% Signal carré (harmoniques impaires) +square_wave = 0.5 * square(2*pi*f0*t); + +% Signal en dents de scie (toutes les harmoniques) +sawtooth_wave = 0.5 * sawtooth(2*pi*f0*t); + +%% 2. Filtrage passe-bas (ordre 2) pour synthèse soustractive +d_lowpass = designfilt('lowpassfir', 'FilterOrder', 2, 'HalfPowerFrequency', 0.25); + +% Application du filtre +filtered_square = filter(d_lowpass, square_wave); +filtered_sawtooth = filter(d_lowpass, sawtooth_wave); + +%% 3. Synthèse additive (3 harmoniques pour comparaison) +additive_sound = 0.7*sin(2*pi*f0*t) + 0.4*sin(2*pi*2*f0*t) + 0.2*sin(2*pi*3*f0*t); +additive_sound = additive_sound / max(abs(additive_sound)); % Normalisation + +%% 4. Comparaison audio +soundsc(filtered_square, fs); pause(duration + 1); % Carré filtré +soundsc(filtered_sawtooth, fs); pause(duration + 1); % Dents de scie filtrée +soundsc(additive_sound, fs); % Synthèse additive + +%% 5. Visualisation des formes d'onde (carré vs dents de scie) +figure; +subplot(3,1,1); +plot(t(1:1000), square_wave(1:1000)); +title('Signal carré original'); + +subplot(3,1,2); +plot(t(1:1000), filtered_square(1:1000)); +title('Carré filtré (ordre 2)'); + +subplot(3,1,3); +plot(t(1:1000), filtered_sawtooth(1:1000)); +title('Dents de scie filtrée (ordre 2)'); + +%% ========== Question 2.4 ========== +%% 1. Amélioration avec filtre RIF ordre 8 (pour dents de scie) +d_improved_FIR = designfilt('lowpassfir', ... + 'FilterOrder', 8, ... + 'HalfPowerFrequency', 0.35); + +filtered_sawtooth_improved = filter(d_improved_FIR, sawtooth_wave); + +%% 2. Comparaison audio avant/après +soundsc(filtered_sawtooth, fs); pause(duration + 1); % Filtre ordre 2 +soundsc(filtered_sawtooth_improved, fs); pause(duration + 1); % Filtre ordre 8 + +%% 3. Visualisation des améliorations +figure; +subplot(2,1,1); +plot(t(1:1000), filtered_sawtooth(1:1000)); +title('Dents de scie filtrée (ordre 2)'); + +subplot(2,1,2); +plot(t(1:1000), filtered_sawtooth_improved(1:1000)); +title('Dents de scie filtrée (ordre 8)'); + +%% 4. Analyse spectrale (FFT) +N = 2^nextpow2(length(t)); +frequencies = fs/2 * linspace(0, 1, N/2+1); + +% FFT pour dents de scie filtrée (ordre 2) +fft_sawtooth = fft(filtered_sawtooth, N); +P_sawtooth = abs(fft_sawtooth/N).^2; + +% FFT pour dents de scie filtrée (ordre 8) +fft_improved = fft(filtered_sawtooth_improved, N); +P_improved = abs(fft_improved/N).^2; + +figure; +semilogy(frequencies, P_sawtooth(1:N/2+1), 'b'); +hold on; +semilogy(frequencies, P_improved(1:N/2+1), 'r'); +legend('Ordre 2', 'Ordre 8'); +xlabel('Fréquence (Hz)'); ylabel('Puissance'); +title('Impact de l''ordre du filtre (dents de scie)'); +grid on; diff --git a/src/question/question3_14.m b/src/question/question3_14.m new file mode 100644 index 0000000000000000000000000000000000000000..46eed0a7e43f232e3a52ea683ebe6b326c8948eb --- /dev/null +++ b/src/question/question3_14.m @@ -0,0 +1,34 @@ +%% Question 3.14 – Comparaison entre réponse fréquentielle théorique et FFT +clear; clc; close all; + +% Paramètres +g = 0.7; +tau = 5; +N = 1024; + +% Vecteurs du filtre +a = [1, zeros(1, tau - 1), g]; +b = 1; + +% Calcul de la réponse impulsionnelle +x = [1; zeros(N-1, 1)]; +h = filter(b, a, x); + +% Réponse par FFT +H_fft = abs(fft(h)); +H_fft = H_fft(1:N/2+1); % On garde la moitié utile (fréquences positives) +nu = linspace(0, 0.5, N/2+1); % fréquence réduite + +% Réponse théorique +H_th = 1 ./ sqrt(1 + 2*g*cos(2*pi*nu*tau) + g^2); + +% Affichage comparé +figure; +plot(nu, H_fft, 'r', 'LineWidth', 1.5); hold on; +plot(nu, H_th, 'b--', 'LineWidth', 1.5); +xlabel('Fréquence réduite (\nu)'); +ylabel('|H(\nu)|'); +legend('FFT (numérique)', 'Théorique'); +title('Comparaison des réponses fréquentielles (FFT vs théorie)'); +grid on; +saveas(gcf, 'comp_fft_theorie_delay.png'); diff --git a/src/question/question3_18.m b/src/question/question3_18.m new file mode 100644 index 0000000000000000000000000000000000000000..bddf45e88a3baf5517877791ad85fb77fddc4423 --- /dev/null +++ b/src/question/question3_18.m @@ -0,0 +1,40 @@ +%% Question 3.18 – Test de la fonction effet_delay_filtre +clear; clc; + +% Charger le signal audio +[x, Fe] = audioread('single_tone_piano1.wav'); +x = x(:,1); % ne garder qu'un canal si stéréo + +% Paramètres imposés +delay_sec = 0.25; +g = 0.9; +K = 10; % mentionné, mais pas utilisé ici + +% Application de l'effet delay avec filtre +y = effet_delay_filtre(x, delay_sec, g, Fe); + +% Sauvegarde du fichier audio demandé +audiowrite('piano_delay_filtre.wav', y, Fe); % <-- LIGNE ESSENTIELLE + +% Génération des figures temporelles pour le rapport +t = (0:length(x)-1) / Fe; + +% Figure 1 : signal original +figure; +plot(t, x, 'b'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Signal original : single\_tone\_piano1.wav'); +grid on; +xlim([0 max(t)]); +saveas(gcf, 'signal_original_filtre_test.png'); + +% Figure 2 : signal avec effet delay filtré +figure; +plot(t, y, 'r'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Signal avec effet delay (via filtre)'); +grid on; +xlim([0 max(t)]); +saveas(gcf, 'signal_delay_filtre.png'); diff --git a/src/question/question3_19.m b/src/question/question3_19.m new file mode 100644 index 0000000000000000000000000000000000000000..3d69849c08a5fd037897b2cded8291c659e82bfb --- /dev/null +++ b/src/question/question3_19.m @@ -0,0 +1,23 @@ +clear; clc; + +Fe = 44100; % fréquence d'échantillonnage +delay_sec = 0.25; % retard en secondes +tau = round(delay_sec * Fe); % conversion en échantillons +g = 0.9; + +% Coefficients du filtre delay +b = 1; +a = [1, zeros(1, tau - 1), g]; + +% Calcul de la réponse en fréquence +[H, f] = freqz(b, a, 2048, Fe); % 2048 points sur [0, Fe/2] + +% Affichage du module en dB +figure; +plot(f, 20*log10(abs(H)), 'r', 'LineWidth', 1.5); +xlabel('Fréquence (Hz)'); +ylabel('Amplitude (dB)'); +title('Réponse en fréquence du filtre delay filtré'); +grid on; +xlim([0 Fe/2]); +saveas(gcf, 'reponse_freq_delay_filtre.png'); % pour le rapport diff --git a/src/question/question3_3.m b/src/question/question3_3.m new file mode 100644 index 0000000000000000000000000000000000000000..2534c136d7360bb714bc46426e6810911dd41077 --- /dev/null +++ b/src/question/question3_3.m @@ -0,0 +1,24 @@ +clear all; close all; clc; + +% Charger les signaux +load('signal_excitation.mat'); % Charge xe1, xe2, fe + +% Autocorrélation des deux signaux +r1 = xcorr(xe1, 'normalized'); +r2 = xcorr(xe2, 'normalized'); + +% Axe temporel pour affichage +l1 = length(xe1); +l2 = length(xe2); +lags1 = -(l1-1):(l1-1); +lags2 = -(l2-1):(l2-1); + +% Affichage +figure; +subplot(2,1,1); +plot(lags1, r1); title('Autocorrélation de xe1'); +xlabel('Décalage'); ylabel('Amplitude'); grid on; + +subplot(2,1,2); +plot(lags2, r2); title('Autocorrélation de xe2'); +xlabel('Décalage'); ylabel('Amplitude'); grid on; diff --git a/src/question/question3_4.m b/src/question/question3_4.m new file mode 100644 index 0000000000000000000000000000000000000000..6a0227739bc1ef1240f751c73692c721acf2a07a --- /dev/null +++ b/src/question/question3_4.m @@ -0,0 +1,27 @@ +clear all; close all; clc; + +% Charger les signaux d'excitation et leur fréquence d'échantillonnage +load('signal_excitation.mat'); % variables : xe1, xe1, fe + +% Étape 1 – Simuler l'effet de la pièce sur le signal xe1 +y = simule_piece(xe1, fe); + +% (optionnel) Écouter le signal en sortie +soundsc(y, fe); + +% Étape 2 – Calcul de l’intercorrélation R_yx(u) +r_est = xcorr(y, xe1); % intercorrélation entre sortie et excitation +lags = -(length(xe1)-1):(length(y)-1); % axe des décalages + +% Étape 3 – Centrer sur la partie causale (à partir du pic) +[~, i_max] = max(r_est); +r_causale = r_est(i_max:end); % on garde seulement la partie causale +temps = (0:length(r_causale)-1) / fe; % axe temporel en secondes + +% Étape 4 – Affichage de la réponse impulsionnelle estimée +figure; +plot(temps, r_causale, 'LineWidth', 1.5); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Réponse impulsionnelle estimée de la pièce'); +grid on; diff --git a/src/question/question3_5.m b/src/question/question3_5.m new file mode 100644 index 0000000000000000000000000000000000000000..36d9bba7c0ba074e0603ade6acbad5ded3468a83 --- /dev/null +++ b/src/question/question3_5.m @@ -0,0 +1,42 @@ +%% Question 3.6 – Application de la réverbération via convolution directe +clear; clc; close all; + +% 1. Charger un signal audio à traiter +[x, fe] = audioread("single_tone_guitar_nylon_string_a2.wav"); % fichier .wav à définir +x = x(:,1); % Ne garder qu'un canal si le signal est stéréo + +% 2. Charger ou générer la réponse impulsionnelle h +load('signal_excitation.mat'); % contient fe, xe1 +h = simule_piece(xe1, fe); % réponse impulsionnelle simulée + +% 3. Appliquer la réverbération via convolution classique + mesurer le temps +tic; +y = effet_reverb(x, h); +t_reverb = toc; + +fprintf('Temps de calcul de la convolution classique : %.6f secondes\n', t_reverb); + +% 4. Écoute du signal d'origine et du signal réverbéré +disp('Lecture du signal original...'); +soundsc(x, fe); +pause(2); +disp('Lecture du signal réverbéré...'); +soundsc(y, fe); + +% 5. Sauvegarder le résultat +y = y / max(abs(y)); % Normalisation entre -1 et 1 +audiowrite('signal_reverbere.wav', y, fe); + +% 6. Tracer un aperçu des signaux +t = (0:length(x)-1) / fe; +figure; +plot(t, x, 'b'); hold on; +plot(t, y, 'r'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +legend('Original', 'Avec réverbération'); +title('Comparaison des signaux original et réverbéré'); +grid on; + +% 7. Sauvegarder la figure +saveas(gcf, 'reverbationnnnnn.png'); diff --git a/src/question/question3_6.m b/src/question/question3_6.m new file mode 100644 index 0000000000000000000000000000000000000000..7620daca3708c5bbe76788d3118ede8b315e3125 --- /dev/null +++ b/src/question/question3_6.m @@ -0,0 +1,41 @@ +%% Question 3.6 – Application de la réverbération via convolution directe +clear; clc; close all; + +% 1. Charger un signal audio à traiter +[x, fe] = audioread("single_tone_guitar_nylon_string_a2.wav"); % fichier .wav à définir +x = x(:,1); % Ne garder qu'un canal si le signal est stéréo + +% 2. Charger ou générer la réponse impulsionnelle h +load('signal_excitation.mat'); % contient fe, xe1 +h = simule_piece(xe1, fe); % réponse impulsionnelle simulée + +% 3. Appliquer la réverbération via convolution classique + mesurer le temps +tic; +y = effet_reverb(x, h); +t_reverb = toc; + +fprintf('Temps de calcul de la convolution classique : %.6f secondes\n', t_reverb); + +% 4. Écoute du signal d'origine et du signal réverbéré +disp('Lecture du signal original...'); +soundsc(x, fe); +pause(2); +disp('Lecture du signal réverbéré...'); +soundsc(y, fe); + +% 5. Sauvegarder le résultat +audiowrite('signal_reverbere.wav', y, fe); + +% 6. Tracer un aperçu des signaux +t = (0:length(x)-1) / fe; +figure; +plot(t, x, 'b'); hold on; +plot(t, y, 'r'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +legend('Original', 'Avec réverbération'); +title('Comparaison des signaux original et réverbéré'); +grid on; + +% 7. Sauvegarder la figure +saveas(gcf, 'reverbationnnnnn.png'); diff --git a/src/question/question3_7.m b/src/question/question3_7.m new file mode 100644 index 0000000000000000000000000000000000000000..4c3f8b82bacb3f442876a647caa99b8387bed4b2 --- /dev/null +++ b/src/question/question3_7.m @@ -0,0 +1,39 @@ +%% Question 3.7 – Application de la réverbération via convolution rapide (FFT) +clear; clc; close all; + +% 1. Charger le signal audio +[x, fe] = audioread("single_tone_guitar_nylon_string_a2.wav"); +x = x(:,1); % un seul canal si stéréo + +% 2. Charger la réponse impulsionnelle simulée +load('signal_excitation.mat'); +h = simule_piece(xe1, fe); + +% 3. Appliquer la convolution rapide + mesurer le temps +tic; +y_fft = effet_reverb_fft(x, h); +t_fft = toc; + +fprintf('Temps de calcul (convolution FFT) : %.6f secondes\n', t_fft); + +% 4. Normalisation +y_fft = y_fft / max(abs(y_fft)); % éviter le clipping + +% 5. Écoute et export +soundsc(x,fe) +pause(length(x(:,1))/fe+1); +soundsc(y_fft, fe); + +audiowrite('signal_reverbere_fft.wav', y_fft, fe); + +% 6. Affichage comparatif +t = (0:length(x)-1) / fe; +figure; +plot(t, x, 'b'); hold on; +plot(t, y_fft(1:length(x)), 'r'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +legend('Original', 'Réverbéré (FFT)'); +title('Réverbération via convolution rapide (FFT)'); +grid on; +saveas(gcf, 'reverb_fft_guitare.png'); diff --git a/src/question/reponse_freq_delay_filtre.png b/src/question/reponse_freq_delay_filtre.png new file mode 100644 index 0000000000000000000000000000000000000000..d1097feeecb3b861368128c7809cc0452013d785 Binary files /dev/null and b/src/question/reponse_freq_delay_filtre.png differ diff --git a/src/question/reponse_impulsionnelle_causale.png b/src/question/reponse_impulsionnelle_causale.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0b805a7695b9c8f55d46be0890cf423e84633b Binary files /dev/null and b/src/question/reponse_impulsionnelle_causale.png differ diff --git a/src/question/reverb_fft_guitare.png b/src/question/reverb_fft_guitare.png new file mode 100644 index 0000000000000000000000000000000000000000..30ac757b6f917c70538bf71570f87d2705b3c6eb Binary files /dev/null and b/src/question/reverb_fft_guitare.png differ diff --git a/src/question/reverbationnnnnn.png b/src/question/reverbationnnnnn.png new file mode 100644 index 0000000000000000000000000000000000000000..149bf9629105e0c34580447a48a602f7431a6008 Binary files /dev/null and b/src/question/reverbationnnnnn.png differ diff --git a/src/question/reverberationvf.ong.fig b/src/question/reverberationvf.ong.fig new file mode 100644 index 0000000000000000000000000000000000000000..3f7fcc56395411fef8196130a72e0e8a9f3b3851 Binary files /dev/null and b/src/question/reverberationvf.ong.fig differ diff --git a/src/question/sawtooth_filtered.wav b/src/question/sawtooth_filtered.wav new file mode 100644 index 0000000000000000000000000000000000000000..1d0625fbb47f78af027bb47b205249f07fbd6f5c Binary files /dev/null and b/src/question/sawtooth_filtered.wav differ diff --git a/src/question/signal_delay_025s_g09.png b/src/question/signal_delay_025s_g09.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3f6b2c45b34ac9e4542a1948ad97a8585ca3b4 Binary files /dev/null and b/src/question/signal_delay_025s_g09.png differ diff --git a/src/question/signal_delay_filtre.png b/src/question/signal_delay_filtre.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2075adb9a17fd84fc61751c073e8e9a1506a7b Binary files /dev/null and b/src/question/signal_delay_filtre.png differ diff --git a/src/question/signal_excitation.mat b/src/question/signal_excitation.mat new file mode 100644 index 0000000000000000000000000000000000000000..3cb1b3eceba9c5fd2bbc8b31fbe33ffdd7cfe1ba Binary files /dev/null and b/src/question/signal_excitation.mat differ diff --git a/src/question/signal_original.png b/src/question/signal_original.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc13b96e5c43e1891a3574d7c78e41d08aa6167 Binary files /dev/null and b/src/question/signal_original.png differ diff --git a/src/question/signal_original_filtre_test.png b/src/question/signal_original_filtre_test.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0bb94da339a119d56c01878f67bfb067b466d0 Binary files /dev/null and b/src/question/signal_original_filtre_test.png differ diff --git a/src/question/signal_reverbere.wav b/src/question/signal_reverbere.wav new file mode 100644 index 0000000000000000000000000000000000000000..179106f0f7edf1485a46e6df6ad319edce440706 Binary files /dev/null and b/src/question/signal_reverbere.wav differ diff --git a/src/question/signal_reverbere_fft.wav b/src/question/signal_reverbere_fft.wav new file mode 100644 index 0000000000000000000000000000000000000000..27dd8a72c924da5fad0a3259fcfaac9069b7c400 Binary files /dev/null and b/src/question/signal_reverbere_fft.wav differ diff --git a/src/question/signaux_q23.png b/src/question/signaux_q23.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa4f5a7bd1e8d763055cde6784dbb53565f3205 Binary files /dev/null and b/src/question/signaux_q23.png differ diff --git a/src/question/simule_piece.m b/src/question/simule_piece.m new file mode 100644 index 0000000000000000000000000000000000000000..717c5bb63786b67d87c2e0987d2b267bfe48425b --- /dev/null +++ b/src/question/simule_piece.m @@ -0,0 +1,14 @@ +function [ y ] = simule_piece( x,fech ) +%ENTREE : x=signal émis par le haut-parleur +% fech=fréquence d'échantillonnage de x +%SORTIE : y=signal capté par le microphone dans la pièce +%% + +load('empreinte_ac') +if fech~=fe, error('Fréquence d''échantillonnage incorrecte'), end +empreinte=empreinte(1:80000); +y=conv(x,empreinte); + + +end + diff --git a/src/question/single_tone_guitar_nylon_string_a2.wav b/src/question/single_tone_guitar_nylon_string_a2.wav new file mode 100644 index 0000000000000000000000000000000000000000..b36d25495e30cebbaac2cb248e629bddf8bdb2bc Binary files /dev/null and b/src/question/single_tone_guitar_nylon_string_a2.wav differ diff --git a/src/question/single_tone_piano1.wav b/src/question/single_tone_piano1.wav new file mode 100644 index 0000000000000000000000000000000000000000..af184b832ca44b0a28441e62e7ade80f617c00e5 Binary files /dev/null and b/src/question/single_tone_piano1.wav differ diff --git a/src/question/spectres_q23.png b/src/question/spectres_q23.png new file mode 100644 index 0000000000000000000000000000000000000000..d2153c98ca14ee37497bc46bf9d740864cd53291 Binary files /dev/null and b/src/question/spectres_q23.png differ diff --git a/src/question/square_filtered.wav b/src/question/square_filtered.wav new file mode 100644 index 0000000000000000000000000000000000000000..0df4bbbd0c7e689611646a5689835365a845e02a Binary files /dev/null and b/src/question/square_filtered.wav differ diff --git a/src/question/synth_additive.wav b/src/question/synth_additive.wav new file mode 100644 index 0000000000000000000000000000000000000000..69f38a8fdb8b7916ffdaf8df5991d648d72e6704 Binary files /dev/null and b/src/question/synth_additive.wav differ diff --git a/src/question/synth_piano1_TFDI.wav b/src/question/synth_piano1_TFDI.wav new file mode 100644 index 0000000000000000000000000000000000000000..3d1f8b0c03555aa2f47e194988faae76ee1b4b75 Binary files /dev/null and b/src/question/synth_piano1_TFDI.wav differ diff --git a/src/question/synth_soustractive.wav b/src/question/synth_soustractive.wav new file mode 100644 index 0000000000000000000000000000000000000000..cba9ab17168c2f743c45e95dcd0f0d5a286fc358 Binary files /dev/null and b/src/question/synth_soustractive.wav differ diff --git a/src/question/synthese_TFD_inverse.wav b/src/question/synthese_TFD_inverse.wav new file mode 100644 index 0000000000000000000000000000000000000000..9ce35555e98f28d12828f783d4375b8ad8c3aaff Binary files /dev/null and b/src/question/synthese_TFD_inverse.wav differ diff --git a/src/question/synthese_harmonique_piano1.wav b/src/question/synthese_harmonique_piano1.wav new file mode 100644 index 0000000000000000000000000000000000000000..b6293a4edd59f18a9481f4c28251dba7fbda728c Binary files /dev/null and b/src/question/synthese_harmonique_piano1.wav differ diff --git a/src/question/synthese_piano1.wav b/src/question/synthese_piano1.wav new file mode 100644 index 0000000000000000000000000000000000000000..a1d12f9e29de7b7e58a4abe41d9eff57c1346fa3 Binary files /dev/null and b/src/question/synthese_piano1.wav differ diff --git a/src/question/synthese_piano1_ADSR.wav b/src/question/synthese_piano1_ADSR.wav new file mode 100644 index 0000000000000000000000000000000000000000..a1d12f9e29de7b7e58a4abe41d9eff57c1346fa3 Binary files /dev/null and b/src/question/synthese_piano1_ADSR.wav differ diff --git a/src/question/synthese_piano1_sans_ADSR.wav b/src/question/synthese_piano1_sans_ADSR.wav new file mode 100644 index 0000000000000000000000000000000000000000..0a2b60922c90670ab710e414c2e0ef0decbec64f Binary files /dev/null and b/src/question/synthese_piano1_sans_ADSR.wav differ diff --git a/src/question/synthetic_piano_ADSR.wav b/src/question/synthetic_piano_ADSR.wav new file mode 100644 index 0000000000000000000000000000000000000000..db99ac86e822754ec1e2c4b3903127bd5f65b70a Binary files /dev/null and b/src/question/synthetic_piano_ADSR.wav differ diff --git a/src/question/synthetic_piano_IFFT.wav b/src/question/synthetic_piano_IFFT.wav new file mode 100644 index 0000000000000000000000000000000000000000..91cc867692580854d3e6104206fee3b8fecf5bc7 Binary files /dev/null and b/src/question/synthetic_piano_IFFT.wav differ diff --git a/src/question/test_effet_delay.m b/src/question/test_effet_delay.m new file mode 100644 index 0000000000000000000000000000000000000000..1f1d68fdca993f91816a2677647afe872ca00b56 --- /dev/null +++ b/src/question/test_effet_delay.m @@ -0,0 +1,30 @@ +[x, Fe] = audioread('single_tone_piano1.wav'); +x = x(:,1); % garder un seul canal si stéréo + +% Appliquer effet delay +y = effet_delay(x, 0.25, 0.9, Fe); % delay de 250 ms, g = 0.9 + +% Écoute + export audio +soundsc(y, Fe); +audiowrite('accord_piano_delay.wav', y, Fe); + +% Créer axe temporel +t = (0:length(x)-1) / Fe; + +% --- Figure 1 : signal original --- +figure; +plot(t, x, 'b'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Signal original : single\_tone\_piano1.wav'); +grid on; +saveas(gcf, 'signal_original.png'); + +% --- Figure 2 : signal traité --- +figure; +plot(t, y(1:length(x)), 'r'); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Signal avec effet delay'); +grid on; +saveas(gcf, 'signal_delay_025s_g09.png'); diff --git a/src/question/untitled11.m b/src/question/untitled11.m new file mode 100644 index 0000000000000000000000000000000000000000..9b3f47d10687f7f625ab322dc4df020e7c9c6634 --- /dev/null +++ b/src/question/untitled11.m @@ -0,0 +1,43 @@ +% Paramètres de base +fe = 44100; % Fréquence d’échantillonnage +f1 = 220.37; % Fréquence fondamentale du piano (à ajuster selon ton cas) +A = [1, 0.7, 0.5, 0.3, 0.2, 0.15, 0.1, 0.05]; % Amplitudes relatives des 8 harmoniques +% Enveloppe ADSR (type piano) +attack = 0.02; % 20 ms +decay = 0.15; % 150 ms +sustain = 0.1; % 100 ms +release = 0.4; % 400 ms +sustain_level = 0.3; +dur = attack + decay + sustain + release; +t = linspace(0, dur, round(dur * fe)); % Axe temporel +% Construction de l'enveloppe ADSR +env = [linspace(0, 1, round(attack * fe)), ... + linspace(1, sustain_level, round(decay * fe)), ... + sustain_level * ones(1, round(sustain * fe)), ... + linspace(sustain_level, 0, round(release * fe))]; +% Corriger la taille au cas où +if length(env) < length(t) + env = [env, zeros(1, length(t) - length(env))]; +elseif length(env) > length(t) + env = env(1:length(t)); +end +% Synthèse du son par addition des 8 harmoniques +y = zeros(size(t)); +for n = 1:8 + y = y + A(n) * sin(2 * pi * f1 * n * t); +end +% Application de l'enveloppe +y = y .* env; +% Normalisation +y = y / max(abs(y)); +% Lecture du son +soundsc(y, fe); +% Sauvegarde du son +audiowrite('synthetic_piano_ADSR.wav', y, fe); +% Tracé de l'enveloppe +figure; +plot(t, env, 'LineWidth', 1.5); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Enveloppe ADSR - Son synthétique de piano'); +grid on; \ No newline at end of file diff --git a/src/question/untitled2.asv b/src/question/untitled2.asv new file mode 100644 index 0000000000000000000000000000000000000000..bb8fc7f6ec64dcf279fccc7b12ffaa266289b5c0 --- /dev/null +++ b/src/question/untitled2.asv @@ -0,0 +1,44 @@ +%% Question 2.1 – Spectre du signal carré et dent de scie + +clear; close all; clc; + +% --- Paramètres --- +Fe = 44100; % Fréquence d’échantillonnage (Hz) +f0 = 440; % Fréquence fondamentale (Hz) +T = 1 / f0; % Période du signal (s) +duree = 0.05; % Durée du signal (s) +N = round(Fe * duree); % Nombre d’échantillons +t = (0:N-1) / Fe; % Axe temporel + +% --- Génération des signaux --- +x_carre = square(2*pi*f0*t); % Signal carré centré entre -1 et 1 +x_dent = sawtooth(2*pi*f0*t); % Signal dent de scie centré entre -1 et 1 + +% --- Transformées de Fourier --- +X_carre = fft(x_carre); +X_dent = fft(x_dent); +f = (0:N-1)*(Fe/N); % Axe fréquentiel + +% --- Normalisation et passage en dB --- +X_carre_dB = 20*log10(abs(X_carre)/max(abs(X_carre))); +X_dent_dB = 20*log10(abs(X_dent)/max(abs(X_dent))); + +% --- Affichage des spectres --- +figure; + +subplot(2,1,1); +plot(f(1:N/2), X_carre_dB(1:N/2), 'b'); +xlabel('Fréquence (Hz)'); +ylabel('Amplitude (dB)'); +title('Spectre du signal carré (FFT)'); +xlim([0 5000]); grid on; + +subplot(2,1,2); +plot(f(1:N/2), X_dent_dB(1:N/2), 'r'); +xlabel('Fréquence (Hz)'); +ylabel('Amplitude (dB)'); +title('Spectre du signal dent de scie (FFT)'); +xlim([0 5000]); grid on; + +% --- Sauvegarde de la figure --- +saveas(gcf, 'q21_spectres_carre_dent.png'); diff --git a/src/question/xcorr_signaux.png b/src/question/xcorr_signaux.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf012f3b312db29183aa41b1b2659b20629a314 Binary files /dev/null and b/src/question/xcorr_signaux.png differ