Estoy tratando de descifrar un mensaje oculto dentro de un archivo de audio muy ruidoso (.wav) (creo que es ruido blanco con un zumbido bajo adicional). El mensaje es un número de seis dígitos . No tengo más detalles sobre el ruido.
Intenté usar un filtro de paso bajo con la esperanza de que la eliminación de la mayoría de las frecuencias más altas me permitiera escuchar los números, pero parece que tampoco puedo deshacerme del suficiente dron bajo para escuchar la voz lo suficientemente bien. Mi intento fue el siguiente (la función empleada freq_space_low_pass_filter
se incluye al final):
[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
Gráfico del espectro de señal:
matlab
noise
lowpass-filter
voice
usuario1825494
fuente
fuente
Respuestas:
Algunos puntos:
fuente
Usted menciona el uso de un filtro de paso bajo, pero como uno de los comentaristas mencionó, probablemente le iría mejor con un filtro de paso de banda para filtrar también el ruido de baja frecuencia. También existen filtros de reducción de ruido en bibliotecas de terceros si está interesado en soluciones preexistentes.
fuente
La voz humana tiene algunas peculiaridades que podrían ayudar. Por un lado, la voz femenina comienza a unos 200Hz, el macho más bajo, por lo que hacer un filtro de paso alto aquí ayudaría un poco. Vea también características acústicas-distinguiendo-la-voz-masculina-femenina .
Además, identifique las frecuencias de los drones a través de un histograma.
Hacer todo esto en código es un poco engorroso. ¿Has considerado algún programa de audio como Audacity ?
fuente