Удаление частот в речи ниже 100 Гц

Я попытался удалить все частоты ниже 100 Гц из моего образца голоса (с помощью Octave), используя только БПФ (поскольку я не должен использовать какие-либо фильтры). Однако, когда я играю семпл, он звучит так, как будто сигнал искажен. После проб и ошибок я убрал частоты от 2 Гц до 100 Гц, и это звучало лучше, чем раньше. Мой вопрос: поскольку диапазон человеческого слуха составляет от 20 Гц до 20 кГц, то как может лучше звучать голосовой сэмпл, если диапазон составляет от 2 до 100 Гц? Вот код:

n1=1+round(0/fsamplingn):1+round(98/fsamplingn); --to remove the original frequencies
n2=1+n-round(98/fsn):1+n-round(0/fsn); -- to remove mirror
yf=fft(y); --fourier of voice
yf(n1)=0; yf(n2)=0;

2 ответа

Для обработки в частотной области, такой как эта, вам нужно использовать метод Overlap-add или Overlap-save.

По сути, вы берете короткие перекрывающиеся блоки выборок (обычно 10 мс или 20 мс или около того - достаточно короткие, чтобы блок мог считаться статистически стационарным), FFT, обрабатываете в частотной области, IFFT, затем добавляете или сохраняете половину блока в соответствии с какой из двух вышеупомянутых методов вы хотите использовать.

Также обратите внимание, что вы не должны просто произвольно обнулять ячейки в частотной области, так как это приведет к артефактам ("звонку") во временной области - вам нужно вместо этого использовать плавную "оконную" функцию при переходе между полосой пропускания и полосой останова,

Что касается последней части вашего вопроса, речь становится совершенно понятной, даже если вы отфильтровываете все, что находится за пределами диапазона 300 Гц - 3 кГц. Обычно это частотная характеристика, используемая в телефонии. Таким образом, удаление всего ниже 100 Гц должно иметь очень мало значения. Конечно, качество лучше, если вы используете полный диапазон, скажем, 20 Гц - 20 кГц, но нам не нужна вся эта полоса пропускания только для речевой связи.

используя только БПФ (поскольку я не должен использовать какие-либо фильтры).

Вы только что создали фильтр! Объяснение: математически, применение КИХ к цифровому сигналу (я полагаю, это то, что вам запрещено делать) - это свертка сигнала с вектором отвода фильтра.

Свертка во временной области - это умножение в частотной области; Замечания Пола Р. о применении дублирования.

То, что вы делаете, когда 0-установка частотных бинов, которые вы хотите подавить, умножается в частотной области с

[0, 0, ..., 0, 1, 1, ..., 1, 0, 0, ..., 0]

вектор.

Итак, вы отфильтровали свой сигнал, математически на 100% эквивалентный применению FIR-фильтра, который вы сбрасываете каждый образец длины FFT.

Для иллюстрации: мы будем использовать маску частотной области

[1]*400+[0]*224+[1]*400

с 1024-FFT. В GNU Radio реализован правильно перекрывающийся фильтр БПФ, поэтому мы можем напрямую сравнить его эффект с эффектом КИХ-фильтра; поскольку обе реализации фильтра GNU Radio требуют отводов во временной области, нам придется сначала IDFT отводы в частотной области¹. Затем мы стимулируем фильтры гауссовым шумом, исходящим из источника с высоким уровнем белого. Общая система выглядит так:

GNU Radio Companion Flow Graph

и при запуске выдает следующий сюжет:

Анализ частотной области

Обратите внимание, как отклики FIR и FFT-фильтра идеально лежат друг на друге; это не удивительно, поскольку они математически эквивалентны.


¹ чтобы сделать это полностью правильно, мне нужно было бы сначала применить окно к этим сигналам, так как это также делает фильтр FFT в GNU Radio, но это оставило бы сферу вашего вопроса настолько значительным, что я решил не делать этого. сделать это; следовательно, отклик фильтра не очень острый или глубокий, но имеет сильный выброс на краях полосы пропускания.

Другие вопросы по тегам