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