Filtern Sie die Nachricht vom lauten Sprachsignal

9

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_filterist 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: Bild

user1825494
quelle
Können Sie uns ein Muster zur Verfügung stellen, mit dem Sie arbeiten? und vielleicht dein Ergebnis?
Penelope
Ich kann die Handlungsbilder nicht hochladen (nicht genügend Punkte) und habe keine Möglichkeit, Sie mit der Datei zu verknüpfen
user1825494
1
Wenn Sie Links in die Kommentare einfügen, wird diese gerne von jemandem bearbeitet. Wenn Sie einen Weg finden, die Dateien irgendwo hochzuladen und Links bereitzustellen, können Sie auch darauf zurückkommen.
Penelope
2
Das Diagramm wäre viel informativer, wenn es log-log aufgezeichnet würde. Es sieht so aus, als hätten Sie Breitbandrauschen von etwa 1,5 kHz bis 22,5 kHz mit einem Schmalbandton bei etwa 2 kHz. Was ich vermute, ist, dass das "Sprach" -Signal zusammen mit einem scheinbar signifikanten Gleichstromversatz in einem ziemlich ruhigen "Loch" sitzt. Es sollte wirklich nicht so schwer sein, mit einem geeigneten Bandpassfilter zu isolieren.
Dave Tweed

Antworten:

1

Ein paar Punkte:

  1. Das Filtern im Frequenzbereich ist kompliziert und erfordert einen echten Algorithmus wie das Hinzufügen von Überlappungen, um ein Aliasing im Zeitbereich zu vermeiden. Es ist viel einfacher, direkt im Zeitbereich zu filtern: [b, a] = Butter (1.100 / (SampleRate / 2); y_filtered = Filter (b, a, y); ist viel besser
  2. Sie möchten wahrscheinlich einen Sperrfilter auf die Drohnenfrequenz setzen
  3. Für stationäres Breitbandrauschen ist die Wiener-Filterung oder die spektrale Subtraktion eine gute Methode. Viele Artikel wurden dazu veröffentlicht.
Hilmar
quelle
0

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.

Ätherisch
quelle
0

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 ?

serv-inc
quelle