Filtra il messaggio dal segnale vocale rumoroso


9

Sto cercando di decifrare un messaggio nascosto in un file audio molto rumoroso (.wav) (penso che sia un rumore bianco con un drone basso aggiuntivo). Il messaggio è un numero di sei cifre . Non ho ulteriori dettagli sul rumore.

Ho tentato di utilizzare un filtro passa-basso nella speranza che l'eliminazione della maggior parte delle frequenze più alte mi permettesse di ascoltare i numeri ma, sembra che non riesca a sbarazzarmi del drone basso per sentire abbastanza bene la voce. Il mio tentativo è stato il seguente (la funzione utilizzata freq_space_low_pass_filterè inclusa alla fine):

[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

Grafico dello spettro del segnale: immagine


puoi fornirci un campione con cui stai lavorando? e forse il tuo risultato?
penelope il

Non riesco a caricare le immagini della trama (non abbastanza punti) e non ho modo di collegarti al file
user1825494

1
se inserisci dei link nei commenti, qualcuno li modificherà volentieri. E se trovi un modo per caricare i file da qualche parte e fornire link, torna pure con quello.
penelope il

2
Il grafico sarebbe molto più informativo se fosse tracciato log-log. Allo stato attuale, sembra che tu abbia un rumore a banda larga da circa 1,5 kHz a 22,5 kHz, con un tono a banda stretta a circa 2 kHz. Quello che presumo è il segnale "vocale", insieme a quello che sembra essere un offset DC significativo, si trova in un "buco" abbastanza silenzioso. Non dovrebbe essere così difficile isolarlo con un filtro passa-banda adatto.
Dave Tweed,

Risposte:


1

Alcuni punti:

  1. Il filtro nel dominio della frequenza è complicato e necessita di un vero algoritmo come la sovrapposizione per evitare l'alias del dominio del tempo. È molto più semplice filtrare direttamente nel dominio del tempo: [b, a] = butter (1.100 / (SampleRate / 2); y_filtered = filter (b, a, y); è molto meglio
  2. Probabilmente vuoi mettere il filtro notch sulla frequenza del drone
  3. Per il rumore stazionario a banda larga un buon metodo è il filtraggio di Wiener o la sottrazione spettrale. Molti articoli sono stati pubblicati su questo.

0

Si menziona l'utilizzo di un filtro passa-basso, ma come ha detto uno dei commentatori probabilmente si farebbe meglio con un filtro passa-banda per filtrare anche il rumore a bassa frequenza. Esistono anche filtri di riduzione del rumore nelle librerie di terze parti se sei interessato a soluzioni preesistenti.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.