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'); x = craq2; fs = 22000; T = length(x); TimeAxis = linspace(0,T/fs,T); figure; plot(TimeAxis,x); title('Samples representation');
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 = x(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,p);
Estimation de l'erreur du modele.
% Pour cela, il suffit de filtrer le signal avec les % coefficients AR estimes. (cf. la fonction |filter| ). % On pourra estimer la variance du bruit directement sur l'erreur du % modele. % err = filter(ARcoeff,1,x_fen); sigma = std(err); TimeAxis_fen = linspace(0,L/fs,L); % On represente alors le signal ainsi que l'erreur du modele AR. On voit % observe clairement des pics d'erreur aux alentours des craquements. figure; plot(TimeAxis_fen,x_fen); hold on plot(TimeAxis_fen,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(TimeAxis_fen,x_fen); hold on plot(TimeAxis_fen,Iclic,'r'); 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
Exercice 1: implementer une fonction permettant de faire la detection des craquements a l'aide du mod?le AR. On prendra I echantillons (par defaut I = 5) avant et apres chaque detection
[Ind_clic,ARcoeff,err] = clic_detection(x,p,K,I)
Entrees: - x: signal - p: ordre du modele (defaut p=20) - K: seuil de detection sous forme K\sigma (defaut K=3) - I: nombres de clics avant et apres chaque detection (defaut I=5)
Sortie: - Ind_clic: vecteur de la taille de x, contenant 1 si l'echantillons correspondant est considere comme un craquement, 0 sinon - ARcoeff: modele AR estime - err: erreur du modele AR
On representera alors le signal et l'emplacement des craquements detectes
Exo1_clic
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);
Comparaison des erreurs de modele : ||e - err||^2 = 0.008845
Exercice 2: implementer la fonction permettant de faire l'interpolation LSAR pour reconstruire le signal
[x_declic] = declic_lsar(x,ARcoeff,Ind_clic)
Entrees: - x: signal avec craquements - ARcoeff: coefficients du modele AR - Ind_clic: emplacement des craquements
Sortie: - x_declic: signal reconstruit sans craquement
Representer alors le signal avec craquement et le signal reconstruit
Exo2_clic
Traitement du signal dans son ensemble
Exercice 3: Implementer une fonction permettant de traiter tout le signal. On pourra utiliser une autre fenetre rectangulaire ou une fenetre de Hamming
Une fenetre de Hamming est definie par $ w(n) = 0.54 - 0.46\cos\left(\frac{2\pi n}{N-1}\right) 0 \leq n \leq N-1 $
[x_declic] = declic(x,wl,p,K,I,fen)
Entrees: - x: signal avec craquements - wl: longueur de la fenetre - p: ordre du modele (defaut p=20) - K: seuil de detection sous forme K\sigma (defaut K=3) - I: nombres de clics avant et apres chaque detection (defaut I=5) - fen: nom de la fenetre (defaut Hamming)
Sortie: - x_declic: signal reconstruit sans craquement
Representer alors le signal avec craquement et le signal reconstruit
Exo3_clic