Фильтр сообщений от шумного голосового сигнала

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
источник
Можете ли вы предоставить нам образец, с которым вы работаете? а может твой результат?
Пенелопа
Я не могу загрузить изображения графика (недостаточно очков) и не могу связать вас с файлом
user1825494
1
если вы добавите ссылки в комментарии, кто-нибудь с удовольствием их отредактирует. И если вы найдете способ загрузить файлы куда-нибудь и предоставить ссылку, вернитесь к этому.
Пенелопа
2
График был бы гораздо более информативным, если бы был построен лог-лог. На самом деле, похоже, что у вас широкополосный шум от 1,5 кГц до 22,5 кГц с узкополосным тоном на частоте около 2 кГц. Я предполагаю, что «голосовой» сигнал, наряду с тем, что кажется значительным смещением постоянного тока, находится в довольно тихой «дыре». Это действительно не должно быть так сложно изолировать с помощью подходящего полосового фильтра.
Дэйв Твид

Ответы:

1

Несколько моментов:

  1. Фильтрация в частотной области сложна и требует реального алгоритма, такого как добавление перекрытия, чтобы избежать наложения временной области. Гораздо проще фильтровать напрямую во временной области: [b, a] = butter (1100 / (SampleRate / 2); y_filtered = filter (b, a, y); намного лучше
  2. Вы, вероятно, хотите поставить режекторный фильтр на частоту беспилотника
  3. Для широкополосного стационарного шума хорошим методом является фильтрация Винера или спектральное вычитание. Многие статьи были опубликованы по этому вопросу.
Hilmar
источник
0

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

эфирный
источник
0

У человеческого голоса есть некоторые особенности, которые могут помочь. Во-первых, женский голос начинается с частоты около 200 Гц, мужской - ниже, поэтому использование фильтра верхних частот здесь немного поможет. Смотрите также акустические особенности, отличающие мужской и женский голос .

Кроме того, определить частоты беспилотников с помощью гистограммы.

Делать все это в коде немного громоздко. Вы рассматривали какую-нибудь аудиопрограмму, например Audacity ?

Serv-вкл
источник