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_filter
znajduje 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:
matlab
noise
lowpass-filter
voice
użytkownik1825494
źródło
źródło
Odpowiedzi:
Kilka punktów:
źródło
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.
źródło
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 ?
źródło