Filtruj wiadomości z głośnego sygnału głosowego

9

Próbuję rozszyfrować wiadomość ukrytą w bardzo głośnym pliku audio (.wav) (myślę, że to biały szum z dodatkowym niskim dronem). Wiadomość jest sześciocyfrową liczbą . Nie mam żadnych dalszych szczegółów na temat hałasu.

Próbowałem użyć filtra dolnoprzepustowego w nadziei, że wyeliminowanie większości wyższych częstotliwości pozwoli mi usłyszeć liczby, ale wydaje mi się, że nie jestem w stanie pozbyć się wystarczającej ilości niskiego drona, aby wystarczająco dobrze usłyszeć głos. Moja próba była następująca (zastosowana funkcja freq_space_low_pass_filterznajduje się na końcu):

[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

Wykres widma sygnału: obrazek

użytkownik1825494
źródło
czy możesz podać próbkę, z którą pracujesz? a może twój wynik?
penelopa,
Nie mogę załadować obrazów fabuły (za mało punktów) i nie mam możliwości, aby połączyć cię z plikiem
użytkownik1825494
1
jeśli umieścisz linki w komentarzach, ktoś chętnie je edytuje. A jeśli znajdziesz sposób, aby gdzieś przesłać pliki i podać link, wróć również z tym.
penelopa,
2
Wykres byłby znacznie bardziej pouczający, gdyby został wykreślony log-log. Obecnie wygląda na to, że masz szum szerokopasmowy od około 1,5 kHz do 22,5 kHz, a ton wąskopasmowy około 2 kHz. Zakładam, że sygnał „głosu” wraz z czymś, co wydaje się znaczącym przesunięciem prądu stałego, znajduje się w dość cichej „dziurze”. Naprawdę nie powinno być aż tak trudno izolować za pomocą odpowiedniego filtra pasmowoprzepustowego.
Dave Tweed,

Odpowiedzi:

1

Kilka punktów:

  1. Filtrowanie w dziedzinie częstotliwości jest skomplikowane i wymaga prawdziwego algorytmu, takiego jak dodawanie nakładania, aby uniknąć aliasingu w dziedzinie czasu. O wiele łatwiej jest filtrować bezpośrednio w dziedzinie czasu: [b, a] = masło (1100 / (SampleRate / 2); y_filtered = filtr (b, a, y); jest znacznie lepszy
  2. Prawdopodobnie chcesz umieścić filtr wycinający na częstotliwości drona
  3. W przypadku szerokopasmowego szumu stacjonarnego dobrą metodą jest filtrowanie Wienera lub odejmowanie widmowe. Opublikowano wiele artykułów na ten temat.
Hilmar
źródło
0

Wspominasz o użyciu filtra dolnoprzepustowego, ale jak wspomniał jeden z komentujących, prawdopodobnie lepiej by było z filtrem pasmowo-przepustowym, aby również odfiltrować szum niskiej częstotliwości. Istnieją również filtry redukcji szumów w bibliotekach stron trzecich, jeśli jesteś zainteresowany wcześniej istniejącymi rozwiązaniami.

Eteryczny
źródło
0

Ludzki głos ma pewne cechy szczególne, które mogą pomóc. Po pierwsze, kobiecy głos zaczyna się przy częstotliwości około 200 Hz, męski niżej, więc zastosowanie tutaj filtra górnoprzepustowego trochę by pomogło. Zobacz także : cechy akustyczne, które wyróżniają męski i żeński głos .

Dodatkowo określ częstotliwość dronów za pomocą histogramu.

Wykonanie tego wszystkiego w kodzie jest nieco kłopotliwe. Czy rozważałeś jakiś program audio, taki jak Audacity ?

serv-inc
źródło