Gürültülü ses sinyalinden gelen mesajı filtrele


9

Çok gürültülü bir ses dosyası (.wav) içinde gizli bir mesajı deşifre etmeye çalışıyorum (ek bir düşük drone ile beyaz gürültü olduğunu düşünüyorum). Mesaj altı haneli bir sayıdır . Gürültü hakkında daha fazla ayrıntım yok.

Yüksek frekansların çoğunu ortadan kaldırmanın rakamları duymama izin vereceği umuduyla düşük geçişli bir filtre kullanmaya çalıştım, ancak sesi yeterince iyi duymak için düşük drone'dan yeterince kurtulamıyorum gibi görünüyor. Denemem şu şekildeydi (kullanılan işlev freq_space_low_pass_filtersonunda dahil edilmiştir):

[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

Sinyal spektrumunun grafiği: resim


bize üzerinde çalıştığınız bir örnek sağlayabilir? ve belki sonucun?
penelope

Arsa görüntülerini yükleyemiyorum (yeterli puan yok) ve sizi dosyaya bağlamak için bir
yolum yok

1
yorumlara bağlantılar koyarsanız, birisi onları memnuniyetle düzenler. Ve dosyaları bir yere yüklemek ve bağlantı sağlamak için bir yol bulursanız, bununla da geri dönün.
penelope

2
Grafik, log-log olarak işaretlenmiş olsaydı çok daha bilgilendirici olurdu. Olduğu gibi, yaklaşık 2 kHz'de dar bant tonu ile yaklaşık 1,5 kHz ila 22,5 kHz arasında geniş bant gürültünüz var gibi görünüyor. Sanırım önemli bir DC ofseti gibi görünen “ses” sinyali oldukça sessiz bir “delik” te oturuyor. Uygun bir bant geçiren filtre ile izole etmek gerçekten o kadar zor olmamalıdır.
Dave Tweed

Yanıtlar:


1

Birkaç nokta:

  1. Frekans alanında filtreleme karmaşıktır ve zaman alanı örtüşmesini önlemek için örtüşme ekleme gibi gerçek bir algoritmaya ihtiyaç duyar. Doğrudan zaman alanında filtre uygulamak çok daha kolaydır: [b, a] = tereyağı (1,100 / (SampleRate / 2); y_filtered = filtre (b, a, y); çok daha iyi
  2. Muhtemelen drone filtresine drone frekansına koymak istiyorsunuz
  3. Geniş bantlı sabit gürültü için iyi bir yöntem Wiener filtreleme veya spektral çıkarmadır. Bu konuda birçok makale yayınlanmıştır.

0

Düşük geçişli bir filtre kullandığınızdan bahsediyorsunuz, ancak bahsi geçen yorumculardan biri de düşük frekanslı gürültüyü filtrelemek için bant geçiren bir filtreyle muhtemelen daha iyisini yaparsınız. Önceden var olan çözümlerle ilgileniyorsanız üçüncü taraf kitaplıklarında gürültü azaltma filtreleri de vardır.


0

İnsan sesinin yardımcı olabilecek bazı özellikleri vardır. Birincisi, kadın sesi yaklaşık 200Hz'de, erkek daha düşükte başlar, bu yüzden burada yüksek geçişli bir filtre yapmak biraz yardımcı olacaktır. Ayrıca bkz. Erkek ve kadın sesini akustik-özellikler-ayırt edici .

Ek olarak, drone frekanslarını bir histogram yoluyla tanımlayın.

Tüm bunları kodda yapmak biraz hantal. Audacity gibi bir ses programı düşündünüz mü ?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.