Saring pesan dari sinyal suara berisik

9

Saya mencoba menguraikan pesan yang tersembunyi di dalam file audio yang sangat bising (.wav) (saya pikir ini adalah white noise dengan tambahan drone rendah). Pesannya adalah angka enam digit . Saya belum memiliki detail lebih lanjut tentang kebisingan.

Saya mencoba menggunakan filter low-pass dengan harapan bahwa menghilangkan sebagian besar frekuensi yang lebih tinggi akan memungkinkan saya untuk mendengar angka-angka itu, tetapi, saya tampaknya tidak dapat juga menyingkirkan cukup drone rendah untuk mendengar suara dengan cukup baik. Upaya saya adalah sebagai berikut (fungsi yang dipekerjakan freq_space_low_pass_filtertermasuk di akhir):

[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

Plot spektrum sinyal: gambar

pengguna1825494
sumber
dapatkah Anda memberi kami sampel yang sedang Anda kerjakan? dan mungkin hasilnya?
penelope
Saya tidak dapat mengunggah gambar plot (tidak cukup poin) dan tidak memiliki cara untuk menautkan Anda ke file
user1825494
1
jika Anda menaruh tautan di komentar, seseorang akan dengan senang hati mengeditnya. Dan jika Anda menemukan cara untuk mengunggah file di suatu tempat dan memberikan tautan, kembalilah dengan itu juga.
penelope
2
Grafik akan jauh lebih informatif jika diplot log-log. Seperti itu, sepertinya Anda memiliki noise pita lebar dari sekitar 1,5 kHz hingga 22,5 kHz, dengan nada pita sempit sekitar 2 kHz. Apa yang saya duga adalah sinyal "suara", bersama dengan apa yang tampak sebagai offset DC yang signifikan, berada dalam "lubang" yang cukup sunyi. Seharusnya tidak terlalu sulit untuk mengisolasi dengan filter bandpass yang sesuai.
Dave Tweed

Jawaban:

1

Beberapa poin:

  1. Penyaringan dalam domain frekuensi rumit dan membutuhkan algoritma nyata seperti tumpang tindih untuk menghindari alias domain waktu. Jauh lebih mudah untuk memfilter langsung dalam domain waktu: [b, a] = mentega (1.100 / (SampleRate / 2); y_filtered = filter (b, a, y); jauh lebih baik
  2. Anda mungkin ingin meletakkan takik filter pada frekuensi drone
  3. Untuk noise stasioner pita lebar, metode yang baik adalah filter Wiener atau pengurangan spektral. Banyak makalah yang telah diterbitkan tentang ini.
Hilmar
sumber
0

Anda menyebutkan menggunakan low pass filter, tetapi sebagai salah satu komentator menyebutkan Anda mungkin akan melakukan yang lebih baik dengan band-pass filter untuk juga menyaring kebisingan frekuensi rendah. Ada juga filter pengurangan kebisingan di perpustakaan pihak ketiga jika Anda tertarik pada solusi yang sudah ada sebelumnya.

Sangat halus
sumber
0

Suara manusia memiliki beberapa keanehan yang mungkin membantu. Untuk satu, suara wanita mulai sekitar 200Hz, pria lebih rendah, jadi melakukan filter high-pass di sini akan sedikit membantu. Lihat juga fitur akustik-membedakan-suara-pria-dan-wanita .

Selain itu, identifikasi frekuensi drone melalui histogram.

Melakukan semua ini dalam kode agak rumit. Sudahkah Anda mempertimbangkan beberapa program audio seperti Audacity ?

serv-inc
sumber