J'ai téléchargé les fichiers audio propres et bruyants. Analysons d'abord une petite partie de l'audio.
n=1024*8; % a small portion of data
w1=1e5;
w2=w1+n-1;
sig_noisy=data_n(w1:w2,1); % noisy audio
sig_clean=data_c(w1:w2,1); % clean audio
figure; hold all
plot(sig_noisy,'b')
plot(sig_clean,'r','LineWidth',2)
ylim([-1.5 1.5])
legend('Noisy','Clean')
Comme on le voit ici, le son bruyant est en quelque sorte saturé et version tronquée du signal propre. Tronquer un signal provoque des harmoniques à des fréquences plus élevées. Regardons le spectre de puissance densités des signaux.
n=1024*1; % a smaller portion of data
w1=1e5;
w2=w1+n-1;
sig_noisy=data_n(w1:w2,1); % noisy
sig_clean=data_c(w1:w2,1); % clean
[psd_noisy, f] = pwelch(sig_noisy);
[psd_clean, ~] = pwelch(sig_clean);
figure; hold all
plot(f/pi,db(psd_noisy),'b')
plot(f/pi,db(psd_clean),'r')
xlabel('Normalized Freq.')
legend('Noisy','Clean')
Vous voyez que l'audio bruyant a des harmoniques plus le bruit à des fréquences élevées. Eh bien, maintenant, si vous supposez que les caractéristiques du bruit ne changent pas à la fin de l'audio, alors vous pouvez concevoir un filtre en regardant cette petite partie de l'audio. Puisque vous avez déjà un signal bruyant et propre ensemble, pourquoi ne pas utiliser la méthode de déconvolution.
Par exemple, si vous Deconvolve le signal propre avec une bruyante, puis vous obtenez la réponse inverse de votre système (h_inv), qui est aussi les coefficients de filtre que vous pouvez utiliser pour filtrer le signal bruyant
(sig_noisy = sig_clean * h).
Ici j'utilise la méthode de déconvolution de Wiener. Notez également que cette fonction n'est pas destinée à être utilisée uniquement pour les images, vous pouvez également utiliser les méthodes de déconvolution dans Matlab avec des signaux 1D.
h_inv=deconvwnr(sig_clean,sig_noisy);
figure,plot(h_inv)
legend('h^-^1')
Comme je l'ai dit, ce sont les coefficients de filtre dont vous avez besoin.Par exemple, si je filtre le signal bruyant avec h_inv:
sig_filtered=conv(sig_noisy,h_inv,'same');
[psd_filtered, ~] = pwelch(sig_filtered);
figure; hold all
plot(f/pi,db(psd_noisy),'b')
plot(f/pi,db(psd_clean),'r')
plot(f/pi,db(psd_filtered),'k')
xlabel('Normalized Freq.')
legend('Noisy','Clean','Filtered')
Le spectre de signal filtré est assez proche du spectre du signal propre. Maintenant que vous avez les coefficients de filtre, il suffit de filtrer tout l'audio bruyant avec h_inv et d'écouter le résultat.
filtered_all=conv(data_n(:,1),h_inv,'same');
sound(filtered_all,48000)
Vous pouvez essayer d'autres méthodes de déconvolution et voir les résultats. Vous pouvez également mettre à zéro le spectre indésirable dans le domaine de Fourier et inverser le spectre pour un signal propre. Cependant, comme le signal est trop long, vous devrez le faire dans une fenêtre coulissante. Vous pouvez également concevoir des filtres coupe-bande en cascade pour filtrer chaque harmonique séparément.
Je vois qu'il y a quatre harmoniques stron. Concevez donc quatre filtres coupe-bande pour chacun et un filtre passe-bas pour filtrer le bruit haute fréquence.
% First notch
fc1=0.0001; bw1=0.05; N=4;
f = fdesign.notch('N,F0,BW',N,fc1,bw1); h = design(f);
% Second notch
fc2=0.21; bw2=0.2;
f = fdesign.notch('N,F0,BW',N,fc2,bw2); h2 = design(f);
% Third notch
fc3=0.41; bw3=0.2;
f = fdesign.notch('N,F0,BW',N,fc3,bw3); h3 = design(f);
% Fourth notch
fc4=0.58; bw4=0.2;
f = fdesign.notch('N,F0,BW',N,fc4,bw4); h4 = design(f);
% A Final lowpass filter
f = fdesign.lowpass('Fp,Fst,Ap,Ast',0.6,0.65,1,30); h5 = design(f);
% Cascade the filters
hd = dfilt.cascade(h, h2, h3, h4, h5);
% See the filter characterisctic
ff=fvtool(hd,'Color','white');
% Now we can filter our
sig_filtered2 = filter(hd,sig_noisy);
[psd_filtered2,f] = pwelch(sig_filtered2);
figure; hold all
plot(f/pi,db(psd_noisy),'b');
plot(f/pi,db(psd_clean),'r');
plot(f/pi,db(psd_filtered2),'k');
xlabel('Normalized Freq.')
legend('Noisy','Clean','Filtered')
Vous pouvez maintenant filtrer l'ensemble audio
filtered_all2 = filter(hd,data_n(:,1));
sound(filtered_all2,48000)
Hope I a aidé.
merci. oui j'ai les deux, son propre et bruyant mais j'utiliserai un son clair pour vérifier, pas pour nettoyer le son bruyant.Et Notre proposition est de ne pas utiliser de filtre intérieur de matlab. nous devons faire un filtre passe-tout et faire la partie de bruit zéro puis produit de point avec le bruit bruyant pour enlever le bruit en freq. domaine. Donc, j'ai juste besoin de trouver l'emplacement du bruit, donc je vais faire le dernier code que j'ai demandé en question. Ceci est un devoir donc j'ai besoin de nettoyer de cette façon. –
Ensuite, vous pouvez utiliser la deuxième approche que j'ai suggérée (filtres notch en cascade). Si vous voulez le faire avec FFT, vous pouvez le faire dans une petite partie des données, car le signal lui-même est trop long. – Ozcan