Filtrar mensaje de señal de voz ruidosa


9

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_filterse 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: imagen


¿Nos puede proporcionar una muestra con la que está trabajando? y tal vez tu resultado?
penelope

No puedo cargar las imágenes de la trama (no hay suficientes puntos) y no tengo forma de vincularlo con el archivo
user1825494

1
si pone enlaces en los comentarios, alguien los editará con gusto. Y si encuentra una manera de cargar los archivos en algún lugar y proporcionar enlaces, vuelva también con eso.
penelope

2
El gráfico sería mucho más informativo si se graficara log-log. Tal como está, parece que tiene un ruido de banda ancha de aproximadamente 1.5 kHz a 22.5 kHz, con un tono de banda estrecha a aproximadamente 2 kHz. Lo que presumo es la señal de "voz", junto con lo que parece ser un desplazamiento de CC significativo, se encuentra en un "agujero" bastante silencioso. Realmente no debería ser tan difícil de aislar con un filtro de paso de banda adecuado.
Dave Tweed

Respuestas:


1

Algunos puntos:

  1. El filtrado en el dominio de la frecuencia es complicado y necesita un algoritmo real como la superposición de agregar para evitar el alias de dominio de tiempo. Es mucho más fácil filtrar directamente en el dominio del tiempo: [b, a] = mantequilla (1,100 / (SampleRate / 2); y_filtered = filter (b, a, y); es mucho mejor
  2. Probablemente quieras poner un filtro de muesca en la frecuencia del dron
  3. Para el ruido estacionario de banda ancha, un buen método es el filtrado de Wiener o la sustracción espectral. Se han publicado muchos artículos sobre esto.

0

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.


0

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 ?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.