Traitement des signaux audio de musique: De-cliquage
Contents
Introduction: preparations
clear 'variables'; close all; clc;
On charge les donn?es contenant un craquement, puis on les represente avec une echelle adaptee. On fixe la frequence d'echantillonnage a 22000 Hz
load('craq2.txt'); s = craq2; fs = 22000; T = length(s); TimeAxis = linspace(0,T/fs,T); figure; plot(TimeAxis,x); title('Samples representation');
Undefined function or variable 'x'. Error in TPDeclic (line 16) plot(TimeAxis,x);
Estimation du modele AR
On travaille sur la premiere fenetre du signal. On debute avec une fenetre rectangulaire
L = 512; % Longueur de la fenetre x_fen = s(1:L); % Premiere fenetre du signal
On fixe l'ordre du modele AR, puis on estime les parametres du modele par resolution des equations de Yule-Walker
p = 20; % ordre du modele AR
ARcoeff = aryule(x_fen,20);
On estime ensuite l'erreur du modele: on filtre le signal avec les coefficients AR estimes. (cf. help filter)
err = filter(ARcoeff,1,x_fen);
%R = autocorr(x_fen);
sigma = std(err);
On represente alors le signal ainsi que l'erreur du modele AR. On voit observe clairement des pics d'erreur aux alentours des craquements.
Time = linspace(0,L/fs,L); figure; plot(Time,x_fen); hold on plot(Time,abs(err),'r'); hold off
Detection des clics par seuillage
On fixe un seuil proportionnel a sigma (on suit ici la regle des "3\sigma"
K = 3; Iclic = abs(err) > K*sigma;
On represente alors l'emplacement des ainsi clics detectes
figure; plot(Time,x_fen); hold on plot(Time,abs(err),'r'); plot(Time,Iclic,'k'); hold off
Les craquements on une certaine duree, pas forcement bien dectecte par la methode precedente. En prenant simple quelques echantillons avant et apres chaque clic, cela permet d'obtenir un resultat bien plus satisfaisant
On prend +/- I echantillons avant et apres chaque detection
I = 5; ID = find(Iclic==1); for i=-I:I IDn = ID+i; IDn(IDn<=1) = 1; IDn(IDn>=L) = L; Iclic(IDn) = 1; end
figure; plot(Time,x_fen); hold on plot(Time,abs(err),'r'); plot(Time,Iclic,'k'); hold off
Reconstruction du signal au niveau des craquements detectes
Creation de la matrice A permettant d'ecrire le modele AR sous forme matricielle
apad = [ARcoeff zeros(1,length(x_fen)-p-1)]; A = rot90(circulant(apad,1),2);
On verifie que l'erreur reste la meme:
e = A*x_fen;
fprintf('Comparaison des erreurs de modele : ||e - err||^2 = %f\n',norm(e-err)^2);
On decoupe la matrice A en deux matrices A_c et A_r, ainsi que le signal
Ac = A(:,Iclic==1); Ar = A(:,Iclic==0); xr = x_fen(Iclic==0);
On applique la formule d'interpolation LSAR pour estimer les parties manquantes
xc = -(Ac'*Ac)\Ac'*Ar*xr;
On remplace alors ces parties dans le signal
x_declic = x_fen; x_declic(Iclic==1) = xc; plot(Time, s,'b'); hold on plot(Time,x_declic,'r'); hold off