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_filter
termasuk 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:
matlab
noise
lowpass-filter
voice
pengguna1825494
sumber
sumber
Jawaban:
Beberapa poin:
sumber
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.
sumber
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 ?
sumber