Фільтр повідомлення з галасливого голосового сигналу


9

Я намагаюся розшифрувати повідомлення, приховане в дуже галасливому аудіофайлі (.wav) (я думаю, що це білий шум з додатковим низьким гулком). Повідомлення - це шестицифрове число . Більше деталей щодо шуму у мене немає.

Я намагався використати фільтр низьких частот, сподіваючись, що усунення більшості більш високих частот дозволить мені почути номери, але, здається, я також не можу позбутися достатнього рівня низького гулу, щоб достатньо добре почути голос. Моя спроба була наступною (зайнята функція freq_space_low_pass_filterвключена в кінці):

[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

Діаграма спектру сигналу: картина


чи можете ви надати нам зразок, з яким ви працюєте? і, можливо, ваш результат?
пенелопа

Я не можу завантажувати зображення сюжету (недостатньо балів) і не можу зв’язати вас з файлом
user1825494

1
якщо ви помістите посилання в коментарі, хтось із задоволенням відредагує їх. І якщо ви знайдете спосіб десь завантажити файли та надати посилання, поверніться також і до цього.
пенелопа

2
Графік був би набагато більш інформативним, якби він був складений журналом журналу. Насправді це здається, що у вас широкосмуговий шум від приблизно 1,5 кГц до 22,5 кГц, з вузькосмуговим тоном приблизно на 2 кГц. Я припускаю, що "голосовий" сигнал разом із тим, що здається значним зміщенням постійного струму, сидить у досить тихій "дірі". Дійсно не повинно бути все так важко ізолювати за допомогою відповідного смугового фільтра.
Дейв Твід

Відповіді:


1

Кілька пунктів:

  1. Фільтрування в частотній області є складним і потребує реального алгоритму, як додавання перекриття, щоб уникнути псевдонімування часової області. Набагато простіше фільтрувати безпосередньо у часовій області: [b, a] = масло (1,100 / (SampleRate / 2); y_filtered = фільтр (b, a, y); набагато краще
  2. Ви, мабуть, хочете поставити частотний фільтр на частоті гул
  3. Для широкосмугового стаціонарного шуму хорошим методом є фільтрація Вінера або спектральне віднімання. Про це було опубліковано багато робіт.

0

Ви згадуєте про використання фільтра низьких частот, але як один із згаданих коментаторів, ви, мабуть, краще зробите з смуговим фільтром, щоб також відфільтрувати низькочастотний шум. Також існують фільтри для зменшення шуму в сторонніх бібліотеках, якщо вас цікавлять попередні рішення.


0

Людський голос має деякі особливості, які можуть допомогти. Для одного, жіночий голос починається приблизно з 200 Гц, чоловічий - нижче, тому створення фільтра високої частоти тут допоможе трохи. Дивіться також акустичні функції, що розрізняють чоловічий і жіночий голос .

Додатково ідентифікуйте частоти безпілотників за допомогою гістограми.

Робити все це в коді трохи громіздко. Ви розглядали якусь аудіопрограму на зразок Audacity ?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.