Ich versuche, eine Nachricht zu entschlüsseln, die in einer sehr lauten Audiodatei (.wav) versteckt ist (ich denke, es ist weißes Rauschen mit einer zusätzlichen niedrigen Drohne). Die Nachricht ist eine sechsstellige Nummer . Ich habe keine weiteren Details über den Lärm.
Ich habe versucht, einen Tiefpassfilter zu verwenden, in der Hoffnung, dass ich durch Eliminieren der meisten höheren Frequenzen die Zahlen hören könnte, aber ich scheine nicht in der Lage zu sein, auch die tiefe Drohne genug loszuwerden, um die Stimme gut genug zu hören. Mein Versuch war wie folgt (die verwendete Funktion freq_space_low_pass_filter
ist am Ende enthalten):
[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
Darstellung des Signalspektrums:
matlab
noise
lowpass-filter
voice
user1825494
quelle
quelle
Antworten:
Ein paar Punkte:
quelle
Sie erwähnen die Verwendung eines Tiefpassfilters, aber wie einer der Kommentatoren erwähnte, würden Sie wahrscheinlich besser mit einem Bandpassfilter arbeiten, um auch das Niederfrequenzrauschen herauszufiltern. Es gibt auch Rauschunterdrückungsfilter in Bibliotheken von Drittanbietern, wenn Sie an bereits vorhandenen Lösungen interessiert sind.
quelle
Die menschliche Stimme hat einige Besonderheiten, die helfen könnten. Zum einen beginnt die weibliche Stimme bei etwa 200 Hz, die männliche niedriger, sodass ein Hochpassfilter hier etwas hilfreich wäre. Siehe auch akustische Merkmale, die die männliche und weibliche Stimme unterscheiden .
Identifizieren Sie zusätzlich die Drohnenfrequenzen über ein Histogramm.
All dies im Code zu tun ist etwas umständlich. Haben Sie ein Audioprogramm wie Audacity in Betracht gezogen ?
quelle