Skip to content
Snippets Groups Projects
Commit 7590dd23 authored by DESNOYERS Lucie's avatar DESNOYERS Lucie
Browse files

Commit de tous les codes + PDF compte-rendu Sadok Lajmi et Lucie DESNOYERS

parent 4e45ee83
No related branches found
No related tags found
No related merge requests found
Showing
with 579 additions and 0 deletions
File added
%analyse delday
%Initialisation des données
tau = 100;
g1 = 0.8;
g2 = -0.3;
%Création du dirac
Fe = 44100; % Fréquence d'échantillonnage en Hz
N = 1024; % Longueur du signal (par exemple 100 échantillons)
x = zeros(1, N); % Initialise un vecteur de zéros
x(1) = 1; % Impulsion de Dirac à n = 0
t = (0:N-1) * (1/Fe); % Echelle de temps
%Réponse impulsionnelle
a1 = [1 zeros(1,tau-1) g1];
a2 = [1 zeros(1,tau-1) g2];
b = [1];
rep_impulsionnelle1 = filter(b,a1,x);
rep_impulsionnelle2 = filter(b,a2,x);
%Tableaux
%figure (1);
%plot(t,rep_impulsionnelle1,'b');
%xlabel('Temps (s)');
%ylabel('Amplitude');
%title('Réponse impulsionnelle 1 en fonction du temps');
%figure(2);
%plot(t,rep_impulsionnelle2,'r');
%xlabel('Temps (s)');
%ylabel('Amplitude');
%title('Réponse impulsionnelle 2 en fonction du temps');
% FFT de la réponse impulsionnelle question 14
H_fft = fft(rep_impulsionnelle1);
H_fft = H_fft(1:N/2); % moitié spectre utile
f = (0:N/2-1) * Fe/N; % échelle de fréquence en Hz
nu = f / Fe; % fréquence réduite [0, 0.5]
% Réponse théorique
H_th = 1 ./ (1 + g * exp(-2j * pi * nu * tau));
H_th_abs = abs(H_th);
H_fft_abs = abs(H_fft);
% Affichage
figure(1);
plot(nu, H_th_abs, 'r', 'LineWidth', 1.5); hold on;
plot(nu, H_fft_abs, 'b--');
legend('|H_{th}(\nu)|', '|H_{fft}(\nu)|');
xlabel('Fréquence réduite \nu (f / F_e)');
ylabel('Module');
title('Comparaison des modules de la réponse en fréquence');
grid on;
%Fonction effet_delay
function [y] = effet_delay(x,t,g,fe)
%EFFET_DELAY avec x un signal, t le temps du delay en s, g le coefficient
%d'amortissement, et fe la fréquence d'échantillonnage en Hz
tau = round(t * fe);
a = [1 zeros(1,tau-1) g];
b = 1;
y = filter(b,a,x);
end
\ No newline at end of file
%Fonction effet_delay_filtre
function [y] = effet_delay_filtre(x,t,g,K,fe)
%EFFET_DELAY avec x un signal, t le temps du delay en s, g le coefficient
%d'amortissement, la longueur K et fe la fréquence d'échantillonnage en Hz
tau = round(t * fe);
a = zeros(1, tau + K);
a(1) = 1; % y(k)
a(tau + (1:K)) = -g / K; % y(k - tau - n)
b = 1;
y = filter(b,a,x);
end
\ No newline at end of file
function [y] = effet_reverb(x,h)
%EFFET_REVERB methode convolution classique
y = filter(h, 1, x);
max_y=max(y);
y = y.*(1/max_y);
end
% Partie 3 - 1
% on travaille sur xe1 et xe2. La fréquence d'échantillonnage est fe
%r = xcorr(xe1, 'coeff');
%k = xcorr(xe2,'coeff');
%figure(1);
%plot(r);
%figure(2);
%plot(k);
r = xcorr(xe1, 'coeff');
k = xcorr(xe2, 'coeff');
lags_r = -length(xe1)+1:length(xe1)-1; % Pour afficher les bons décalages
lags_k = -length(xe2)+1:length(xe2)-1;
figure(1);
plot(lags_r, r, 'b');
title('Autocorrélation du signal xe1');
xlabel('Décalage (lag)');
ylabel('Coefficient de corrélation');
legend('xe1');
figure(2);
plot(lags_k, k, 'r');
title('Autocorrélation du signal xe2');
xlabel('Décalage (lag)');
ylabel('Coefficient de corrélation');
legend('xe2');
h=simule_piece(xe1,fe);
[c, t] = xcorr(h, xe1); % Corrélation croisée normalisée
figure(3);
plot(t, c, 'b');
xlabel('Décalage en temps');
ylabel('Corrélation normalisée');
title('Corrélation croisée entre h et xe1');
grid on;
function [y] = effet_reverb_FFT(x,h)
%EFFET_REVERB_FFT methode fréquentielle
NFFT = max(length(x),length(h));
y_intermediaire=fft(h,NFFT).*fft(x,NFFT);
y=ifft(y_intermediaire,NFFT);
max_y=max(y);
y = y.*(1/max_y);
end
% Partie 3 _ delay
% Dernière question partie 3
% Création du dirac
Fe = 44100; % Fréquence d'échantillonnage en Hz
N = 1024*25; % Longueur du signal
x = zeros(1, N); % Initialise un vecteur de zéros
x(1) = 1; % Impulsion de Dirac à n = 0
t = (0:N-1) * (1/Fe); % Echelle de temps
g = 0.9;
t_delay = 0.25;
K = 10;
rep_impulsionnelle = effet_delay_filtre(x,t_delay,g,K,Fe);
% Réponse fréquentielle
rep_freq = abs(fft(rep_impulsionnelle));
f = (0:N/2-1)*(Fe/N);
rep_freq = rep_freq(1:N/2);
figure(1);
plot(f,rep_freq);
legend('réponse fréquentielle');
xlabel('Fréquence en Hz');
ylabel('Module');
title('Réponse fréquentielle');
grid on;
figure(2);
plot(f,20*log(abs(rep_freq)));
legend('réponse fréquentielle en dB');
xlabel('Fréquence en Hz');
ylabel('Module en dB');
title('Réponse fréquentielle en dB');
grid on;
\ No newline at end of file
% Test effet delay
[x,fe]=audioread('./wav/single_tone_piano1.wav');
t=0.25;
g=0.9;
K=10;
piano_delay=effet_delay_filtre(x,t,g,K,fe);
sound(piano_delay,fe);
%sound(x,fe);
\ No newline at end of file
r1=xcorr(xe1, 'coeff');
r2=xcorr(xe2, 'coeff');
% mesure de h
y = simule_piece(xe1, fe);
[h, t] = xcorr(y,xe1);
N = length(h); % taille originale
half = floor(N/2); % moitié (arrondie vers le bas)
% extraire la deuxième moitié
h_second_half = h(half+1:end);
% créer un vecteur zeros de la même taille que h
h_new = zeros(size(h));
% replacer la deuxième moitié au début
h_new(1:length(h_second_half)) = h_second_half;
% remplacer h par h_new
h = h_new;
[x,fe]=audioread('./wav/nylon-guitar.wav');
%sound(x,fe);
tic
x_reverb = effet_reverb(x,h);
time=toc;
fprintf("Temps d'exécution : %.4f secondes\n", time);
sound(x_reverb,fe);
figure(4);
plot(x_reverb);
[x,fe]=audioread("./src/wav/single_tone_violin-a3.wav");
sound(x,fe);
fourier=fft(x);
ffourier=fftshift(fourier);
clf('reset');
N = length(x); % Nombre d'échantillons
% Axe des fréquences pour fftshift
f = (-N/2:N/2-1)*(fe/N);
% Affichage
clf;
figure(1);
plot(f, abs(ffourier));
title('Spectre de Fourier du signal audio violin-a3');
xlabel('Fréquence (Hz)');
ylabel('|Amplitude|');
[x1, fe1] = audioread("./src/wav/single_tone_piano1.wav");
[x2,fe2]=audioread("./src/wav/single_tone_piano2.wav");
fourier1 = fft(x1);
ffourier1 = fftshift(fourier1); % Mettre zéro fréquence au centre
fourier2 = fft(x2);
ffourier2 = fftshift(fourier2); % Mettre zéro fréquence au centre
N = length(x1); % Nombre d'échantillons
N2 = length(x2);
% Axe des fréquences pour fftshift
f = (-N/2:N/2-1)*(fe1/N);
f2 =(-N2/2:N2/2-1)*(fe2/N2);
% Affichage
clf;
figure(1);
plot(f, 20*log(abs(ffourier1)));
title('Spectre de Fourier du signal audio piano 1');
xlabel('Fréquence (Hz)');
ylabel('|Amplitude| en dB');
figure(2);
plot(f2, 20*log(abs(ffourier2)));
title('Spectre de Fourier du signal audio piano 2');
xlabel('Fréquence (Hz)');
ylabel('|Amplitude|en dB');
[x, fe] = audioread("./src/wav/single_tone_piano1.wav");
t=0:1/fe:length(x)/fe ;
% Fréquences (en Hz)
frequences = [220.2, 442, 663.2, 885.7, 1107.4, 1332.11, 1555.9, 1782];
% Amplitudes
A = [6005, 4726, 1088, 1414, 980, 671, 546, 114];
% Initialiser le signal
signal = zeros(size(t));
% Additionner les sinusoïdes
for k = 1:length(frequences)
signal = signal + A(k)*sin(2*pi*frequences(k)*t);
end
% Normaliser pour éviter la saturation
signal = signal / max(abs(signal));
% Écouter le signal
sound(signal, fe);
[x, fe] = audioread("./src/wav/single_tone_piano1.wav");
t=0:1/fe:length(x)/fe ;
% Fréquences (en Hz)
frequences = [220.2, 442, 663.2, 885.7, 1107.4, 1332.11, 1555.9, 1782];
% Amplitudes
Amp = [6005, 4726, 1088, 1414, 980, 671, 546, 114];
% Initialiser le signal
signal = zeros(size(t));
% Additionner les sinusoïdes
for k = 1:length(frequences)
signal = signal + Amp(k)*sin(2*pi*frequences(k)*t);
end
% Normaliser pour éviter la saturation
signal = signal / max(abs(signal));
% sound(signal, fe);
fe = 44100; % Fréquence d’échantillonnage
dur = 2; % Durée du son en secondes
long = dur * fe; % Longueur totale en échantillons
% Durées des phases en échantillons
A = round(0.01 * fe); % Attack : Très court
D = round(0.08 * fe); % Decay : Court
S = round(0.6 * fe); % Sustain : Très long
R = round(0.3 * fe); % Release : Long
% Construction des phases
adsr1 = linspace(0, 1, A); % Attack
adsr2 = linspace(1, 0.3, D); % Decay
adsr3 = 0.3 * ones(1, S); % Sustain
adsr4 = linspace(0.3, 0, R); % Release
% Enveloppe complète
adsr = [adsr1 adsr2 adsr3 adsr4];
% Complète ou tronque pour que la longueur corresponde au signal
if length(adsr) < long
adsr = [adsr, zeros(1, long - length(adsr))];
else
adsr = adsr(1:long);
end
% Appliquer au signal
signal_ADSR = signal(1:length(adsr)) .* adsr;
sound(signal_ADSR, fe); % Écoute
% Question 1.5 - Fourier inverse
% Paramètres
N = length(signal); % Nombre de points FFT
% On a déjà fréquences et A (amplitudes)
% Initialiser le spectre en fréquence
spectrum = zeros(1, N);
% Remplir le spectre avec les pics aux fréquences désirées
for k = 1:length(frequences)
index = round(frequences(k) * N / fe) + 1; % +1 car MATLAB commence à 1
spectrum(index) = Amp(k);
spectrum(N - index + 2) = conj(Amp(k)); % Symétrie pour signal réel
end
% Fourier inverse
fourier=real(ifft(spectrum));
% Jouer le son
%sound(fourier, fe);
% Sauvegarde
audiowrite("synthese_ifft.wav", fourier, fe);
% Application de l'enveloppe ADSR
% Complète ou tronque pour que la longueur corresponde au signal
if length(adsr) < long
adsr = [adsr, zeros(1, long - length(adsr))];
else
adsr = adsr(1:long);
end
% Appliquer au signal
signal_ADSR_fourier = signal(1:length(adsr)) .* adsr;
% Jouer le son
%sound(signal_ADSR_fourier, fe);
File added
T = 0.1; % Période du signal
f = 1 / T; % Fréquence (Hz)
t = linspace(0, 20*T, 1000); % Vecteur temps centré sur 0
carre = square(2*pi*f*t); % Signal carré d'amplitude ±1
ddc = sawtooth(2*pi*f*t); % Signal dent de scie standard (-1 à 1)
fcarre=fftshift(fft(carre));
fddc=fftshift(fft(ddc));
% Tracer les figures
clf;
figure(5);
plot(t,abs(fcarre));
title('carre');
figure(4);
plot(t,abs(fddc));
title('ddc');
T = 0.1; % Période du signal
f = 1 / T; % Fréquence (Hz)
t = linspace(0, 20*T, 1000); % Vecteur temps centré sur 0
carre = square(2*pi*f*t); % Signal carré d'amplitude ±1
ddc = sawtooth(2*pi*f*t); % Signal dent de scie standard (-1 à 1)
fcarre=fftshift(fft(carre));
fddc=fftshift(fft(ddc));
%clf;
figure(1);
plot(t,carre);
title('carre en temporel avant filtrage');
%figure(2);
%plot(t,ddc);
%title('ddc');
N = length(carre); % Nombre d'échantillons
N2 = length(ddc);
% Axe des fréquences pour fftshift
freq = (-N/2:N/2-1).*(500/N);
freq2 =(-N2/2:N2/2-1).*(500/N2);
% Affichage
figure(3);
plot(freq, abs(fcarre));
title('Spectre de Fourier du signal carre');
xlabel('Fréquence (Hz)');
ylabel('|Amplitude|');
%figure(4);
%plot(freq2, abs(fddc));
%title('Spectre de Fourier du signal ddc');
%xlabel('Fréquence (Hz)');
%ylabel('|Amplitude|');
% simulation d'un filtre passe-bas (spectre sortie)
%filtrage et affichage pour le carre
ycarre=filter([0.5 0.5],1,carre);
figure(6);
plot(freq, abs(fftshift(fft(ycarre))));
title('Spectre de Fourier du signal ycarre après filtrage');
xlabel('Fréquence (Hz)');
ylabel('|Amplitude|');
figure(7);
plot(t, ycarre);
title('Signal ycarre après filtrage en temporel');
xlabel('Temps en s');
ylabel('|Amplitude|');
%filtrage pour le ddc
yddc=filter([0.5 0.5],1,ddc);
% enveloppes adsr pas utilisées pour cette question
longc=length(carre);
pas=1/(longc/4);
adsr1=[0:pas:1];
pas=0.5/(longc/4);
adsr2=[1:-pas:0.5];
adsr3=(0.5).*ones(1,floor(longc/4)-2);
adsr4=[0.5:-pas:0];
adsrc=[adsr1 adsr2 adsr3 adsr4];
longd=length(ddc);
pas=1/(longd/4);
adsr1=[0:pas:1];
pas=0.5/(longd/4);
adsr2=[1:-pas:0.5];
adsr3=(0.5).*ones(1,floor(longd/4)-2);
adsr4=[0.5:-pas:0];
adsrd=[adsr1 adsr2 adsr3 adsr4];
%ycarre=ycarre.*adsrc;
%yddc=yddc.*adsrd;
% Partie 2 question 2.3
Fs = 44100;
dur = 1;
f = 440;
t = 0:1/Fs:dur;
% Signaux périodiques
saw = 2*(t*f - floor(0.5 + t*f));
square_sig = square(2*pi*f*t);
triangle = sawtooth(2*pi*f*t, 0.5);
% Enveloppe ADSR
A = 0.2; D = 0.1; S = 0.7; R = 0.2;
N = length(t);
env = zeros(1, N);
Na = round(A*Fs); Nd = round(D*Fs);
Ns = round((dur - A - D - R)*Fs);
Nr = N - Na - Nd - Ns;
env(1:Na) = linspace(0, 1, Na);
env(Na+1:Na+Nd) = linspace(1, S, Nd);
env(Na+Nd+1:Na+Nd+Ns) = S;
env(Na+Nd+Ns+1:end) = linspace(S, 0, Nr);
% Synthèse additive (carré)
harmonics = 10;
x_add_square = zeros(size(t));
for n = 1:2:(2*harmonics - 1)
x_add_square = x_add_square + (1/n)*sin(2*pi*n*f*t);
end
x_add_square = x_add_square * (4/pi) .* env;
% Dent de scie (toutes harmoniques 1/n)
x_add_saw = zeros(size(t));
for n = 1:harmonics
x_add_saw = x_add_saw + (1/n)*sin(2*pi*n*f*t);
end
x_add_saw = x_add_saw * (2/pi) .* env;
% Triangle (harmoniques impaires 1/n^2, alternés en phase)
x_add_triangle = zeros(size(t));
for n = 1:2:(2*harmonics - 1)
x_add_triangle = x_add_triangle + ((-1)^((n-1)/2) * (1/n^2)) * sin(2*pi*n*f*t);
end
x_add_triangle = x_add_triangle * (8/pi^2) .* env;
% === Filtre passe-bas : y(k) = 0.5*(x(k) + x(k-1)) ===
filter_lp = @(x) filter([0.5 0.5], 1, x); % y(k) = 0.5*x(k) + 0.5*x(k-1)
% Application du filtre à chaque signal
saw_filt = filter_lp(saw);
square_filt = filter_lp(square_sig);
triangle_filt = filter_lp(triangle);
x_add_filt_triangle = filter_lp(x_add_triangle);
x_add_filt_square = filter_lp(x_add_square);
x_add_filt_saw = filter_lp(x_add_saw);
% Application de l'enveloppe
saw_env = saw_filt .* env;
square_env = square_filt .* env;
triangle_env = triangle_filt .* env;
% Écoute
disp('Dent de scie filtrée');
sound(saw_env, Fs); pause(dur + 0.5);
disp('Dent de scie (additive)');
sound(x_add_saw, Fs); pause(dur+0.5);
disp('Carré filtré');
sound(square_env, Fs); pause(dur + 0.5);
disp('Carré (additive)');
sound(x_add_square, Fs); pause(dur+0.5);
disp('Triangle filtré');
sound(triangle_env, Fs); pause(dur + 0.5);
disp('Triangle (additive)');
sound(x_add_triangle, Fs); pause(dur+0.5);
% Question 2.4 (avec code 2.3)
% Paramètres à tester
orders = [2, 10, 50]; % Différents ordres
cutoffs = [0.05, 0.15, 0.3, 0.45]; % Fréquences réduites
% On filtre maintenant avec designfilt
% Boucle sur les paramètres
for i = 1:length(orders)-1
for j = 1:length(cutoffs)-1
order = orders(i);
fc = cutoffs(j);
% FIR : filtre passe-bas
firFilt = designfilt('lowpassfir', ... % ... en matlab veut dire que l'instruction continue à la ligne suivante
'FilterOrder', order, ...
'HalfPowerFrequency', fc, ...
'SampleRate', Fs);
% IIR : filtre passe-bas de type Butterworth
iirFilt = designfilt('lowpassiir', ...
'FilterOrder', order, ...
'HalfPowerFrequency', fc, ...
'DesignMethod', 'butter', ...
'SampleRate', Fs);
% Application des filtres
saw_fir = filter(firFilt, saw);
saw_iir = filter(iirFilt, saw);
square_fir = filter (firFilt , square_sig);
square_iir = filter(iirFilt, square_sig);
triangle_fir = filter(firFilt, triangle);
triangle_iir = filter(iirFilt, triangle);
% écoute
disp('FIR Dent de scie'); sound(saw_fir, Fs); pause(dur + 0.5);
disp('IIR Dent de scie'); sound(saw_iir, Fs); pause(dur + 0.5);
disp('FIR carré'); sound(square_fir, Fs); pause(dur + 0.5);
disp('IIR carré'); sound(square_iir, Fs); pause(dur + 0.5);
disp('FIR triangle'); sound(triangle_fir, Fs); pause(dur + 0.5);
disp('IIR triangle'); sound(triangle_iir, Fs); pause(dur + 0.5);
end
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment