J'essaie de déchiffrer un message caché dans un fichier audio très bruyant (.wav) (je pense que c'est du bruit blanc avec un drone bas supplémentaire). Le message est un nombre à six chiffres . Je n'ai pas d'autres détails sur le bruit.
J'ai essayé d'utiliser un filtre passe-bas dans l'espoir que l'élimination de la plupart des fréquences plus élevées me permettrait d'entendre les chiffres, mais il me semble que je ne peux pas me débarrasser également d'une quantité suffisante du drone bas pour entendre assez bien la voix. Ma tentative était la suivante (la fonction employée freq_space_low_pass_filter
est incluse à la fin):
[data, SampleRate, NbitsPerSample]=wavread('noisy_msg6.wav');
y=data(:,1); % we will work only with one channel in this demo
N=length(y); %number of sample points
t=( (1:N)*1/SampleRate ).'; % time spacing is 1/SampleRate and we want column vector
Y=fft(y);
spectrum_freq=fourier_frequencies(SampleRate, N);
Freq3db=100;
[spectrum_filtered,g_vs_freq]=freq_space_low_pass_filter(Y, SampleRate, Freq3db);
y_filtered=ifft(spectrum_filtered);
y_filtered=real(y_filtered);
wavwrite(y_filtered/(0.1+max(y_filtered)), SampleRate, NbitsPerSample,
'noisy_msg6_filtered.wav');
%%%%%%%%down sampling%%%%%%%%
indexes=(abs(spectrum_freq) < 10*Freq3db);
spectrum_freq_down_sampled = spectrum_freq(indexes);
spectrum_down_sampled = spectrum_filtered(indexes);
N_down_sampled = length(spectrum_down_sampled);
spectrum_down_sampled=spectrum_down_sampled*N_down_sampled/N;
SampleRate_down_sampled=SampleRate*N_down_sampled/N;
y_down_sampled=real(ifft(spectrum_down_sampled));
t_down_sampled = ( (1:N_down_sampled)*1/SampleRate_down_sampled ).';
sound(y_down_sampled, SampleRate_down_sampled)
function [spectrum_filtered,g]=freq_space_low_pass_filter(spectrum, SampleRate, Freq3db)
%% applies low pass filter in the frequency domain
% spectrum - result of fft on time series data (column vector is expected)
% SampleRate - measured in Hz, 1/dt where dt spacing of the points in time domain
% Freq3db - desired 3db roll off point in Hz
N=length(spectrum);
function G=filter_gain(freq, Freq3db)
G=1./(1+1i*freq/Freq3db); % this corresponds to low pass RC filter
end
spectrum_freq=fourier_frequencies(SampleRate, N);
% calculate filter gain for each spectrum frequency
g=filter_gain(spectrum_freq, Freq3db);
spectrum_filtered=spectrum.*g;
end
Tracé du spectre du signal:
matlab
noise
lowpass-filter
voice
user1825494
la source
la source
Réponses:
Quelques points:
la source
Vous mentionnez l'utilisation d'un filtre passe-bas, mais comme l'un des commentateurs l'a mentionné, vous feriez probablement mieux avec un filtre passe-bande pour filtrer également le bruit basse fréquence. Il existe également des filtres de réduction du bruit dans les bibliothèques tierces si vous êtes intéressé par des solutions préexistantes.
la source
La voix humaine a quelques particularités qui pourraient aider. D'une part, la voix féminine commence à environ 200 Hz, les hommes plus bas, donc faire un filtre passe-haut ici aiderait un peu. Voir aussi les caractéristiques acoustiques distinguant la voix masculine et féminine .
De plus, identifiez les fréquences des drones via un histogramme.
Faire tout cela dans le code est un peu lourd. Avez-vous envisagé un programme audio comme Audacity ?
la source