diff --git a/src/SAR1Q4.m b/src/SAR1Q4.m new file mode 100644 index 0000000000000000000000000000000000000000..596fdb8e9bde0328cb9b183f66e1bf7cdf9804b8 --- /dev/null +++ b/src/SAR1Q4.m @@ -0,0 +1,104 @@ +%Q1.4 +% Charger un son +fichier = fullfile('wav', 'single_tone_piano1'); +[signal, Fs] = audioread(fichier); + +if size(signal,2) == 2 + signal = mean(signal,2); +end + +duration = 1; % (en secondes) +N = min(length(signal), round(duration*Fs)); +signal = signal(1:N); + +% Calculer la FFT +Y = fft(signal); +Nfft = length(Y); +f = (0:Nfft-1)*(Fs/Nfft); + +% Utiliser uniquement la moitié du spectre +Y_half = Y(1:floor(Nfft/2)); +f_half = f(1:floor(Nfft/2)); + +% Trouver la fréquence fondamentale automatiquement +[~, idx_fundamental] = max(abs(Y_half)); +f0 = f_half(idx_fundamental); +fprintf('Fréquence fondamentale estimée : %.2f Hz\n', f0); + +% Calculer les 8 premières harmoniques +harmonics_freqs = f0 * (1:8); +harmonics_amps = zeros(1,8); + +for k = 1:8 + % Trouver l'index dans f_half le plus proche de l'harmonique k + [~, idx] = min(abs(f_half - harmonics_freqs(k))); + harmonics_amps(k) = abs(Y_half(idx)); +end + +% Durée du son synthétisé +t = (0:1/Fs:duration)'; + +% Synthèse du son (superposition d'ondes) +synth_signal = zeros(size(t)); +for k = 1:8 + synth_signal = synth_signal + harmonics_amps(k) * sin(2*pi*harmonics_freqs(k)*t); +end + +%------Ajout de l'enveloppe ADSR----- + +% Paramètres de l'enveloppe (en secondes) +T_attack = 0.05; +T_decay = 0.1; +T_sustain = 0.7; % niveau de sustain (entre 0 et 1) +T_release = 0.2; + +% Créer l'enveloppe +n_attack = round(T_attack * Fs); +n_decay = round(T_decay * Fs); +n_release = round(T_release * Fs); +n_sustain = length(t) - (n_attack + n_decay + n_release); + +if n_sustain < 0 + error('Durée totale trop courte par rapport aux durées ADSR.'); +end + +% Attack : linéaire de 0 à 1 +env_attack = linspace(0, 1, n_attack)'; + +% Decay : descend de 1 à T_sustain +env_decay = linspace(1, T_sustain, n_decay)'; + +% Sustain : niveau constant +env_sustain = T_sustain * ones(n_sustain,1); + +% Release : descend de T_sustain à 0 +env_release = linspace(T_sustain, 0, n_release)'; + +% Concaténer toutes les phases +envelope = [env_attack; env_decay; env_sustain; env_release]; + +% Appliquer l'enveloppe +synth_signal = synth_signal .* envelope; + +% Normaliser pour éviter saturation +synth_signal = synth_signal / max(abs(synth_signal)); + +% Écouter le son synthétisé +sound(synth_signal, Fs); + +% Afficher les harmoniques trouvées +disp('Fréquences et amplitudes des 8 premières harmoniques :'); +for k = 1:8 + fprintf('Harmonique %d : %.2f Hz, amplitude = %.4f\n', k, harmonics_freqs(k), harmonics_amps(k)); +end + +% Pour sauvegarder dans un fichier +audiowrite('synth_piano_ADSR.wav', synth_signal, Fs); + +% Pour afficher l'enveloppe : +figure; +plot(t, envelope, 'LineWidth', 2); +xlabel('Temps (s)'); +ylabel('Amplitude'); +title('Enveloppe ADSR appliquée'); +grid on; \ No newline at end of file