Понижение частоты и применение фильтра нижних частот для цифрового аудио - PullRequest
13 голосов
/ 26 октября 2008

У меня есть аудио поток 44 кГц с компакт-диска, представленный в виде массива 16-битных сэмплов PCM. Я хотел бы сократить его до потока 11 кГц. Как я могу это сделать? Из моих лет инженерных занятий много лет назад я знал, что поток больше не сможет точно описывать что-либо более 5500 Гц, поэтому я предполагаю, что хочу также обрезать все выше этого. Есть идеи? Спасибо.

Обновление: на этой странице есть код , который преобразует из 48 кГц в 8 кГц с помощью простого алгоритма и массива коэффициентов, который выглядит как {1, 4, 12, 12, 4, 1}. Я думаю, что это то, что мне нужно, но мне это нужно в 4 раза, а не в 6 раз. Есть идеи, как рассчитываются эти константы? Кроме того, я все равно преобразую 16-байтовые сэмплы в плавающие, так что я могу выполнять понижающую дискретизацию с плавающими, а не с шортами, если это вообще помогает качеству.

Ответы [ 10 ]

9 голосов
/ 26 октября 2008

Чтение на FIR и IIR фильтрах. Это фильтры, которые используют массив коэффициентов.

Если вы выполните поиск в Google по «FIR или IIR-фильтру», вы найдете множество программ и онлайн-апплетов, которые выполняют тяжелую работу (получение коэффициентов) за вас.

EDIT:

Эта страница здесь (http://www -users.cs.york.ac.uk / ~ fisher / mkfilter / ) позволяет вам ввести параметры вашего фильтра и выплюнет готовый к использованию C- Код ...

5 голосов
/ 26 октября 2008

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

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

Использование DFT для фильтрации, как правило, излишне, и это усложняет ситуацию, потому что dft - это не непрерывный процесс, а работа с буферами.

Цифровые фильтры обычно бывают двух вкусов. РПИ и IIR. Обычно это та же идея, но фильтры IIF используют петли обратной связи для достижения более крутой реакции с гораздо меньшими коэффициентами. Это может быть хорошей идеей для понижающей дискретизации, потому что там вам нужен очень крутой наклон фильтра.

Даунсэмплинг - это особый случай. Поскольку вы собираетесь выбросить 3 из 4 образцов, нет необходимости их вычислять. Для этого существует специальный класс фильтров, называемый многофазными фильтрами.

Попробуйте поискать в Google для многофазной IIR или многофазной FIR для получения дополнительной информации.

3 голосов
/ 26 марта 2010

Обратите внимание (в дополнение к другим комментариям), что простой-легкий-интуитивно понятный подход " понижать выборку с коэффициентом 4 путем замены каждой группы из 4 последовательных выборок на среднее значение " не является оптимальным но тем не менее не ошибается, ни практически, ни концептуально. Потому что усреднение точно соответствует фильтру нижних частот (прямоугольное окно, которое соответствует синусоидальной частоте). Что было бы концептуально неправильно, так это просто уменьшить выборку, взяв одну из каждых 4 выборок: это определенно привело бы к алиасингу.

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

1 голос
/ 05 июня 2011

Вы можете использовать libsamplerate для выполнения тяжелой работы. Libsamplerate является C API и заботится о расчете коэффициентов фильтра. Вы можете выбирать из фильтров различного качества, чтобы иметь возможность менять качество на скорость.

Если вы предпочитаете не писать никакого кода, вы можете просто использовать Audacity для преобразования частоты дискретизации. Он предлагает мощный графический интерфейс и использует libsamplerate для преобразования частоты дискретизации.

1 голос
/ 09 мая 2011

Процесс, который вы назвали "Децимация". Есть 2 шага:

  1. Применение фильтра нижних частот к данным (в вашем случае LPF с Cut Off в Pi / 4).
  2. Даунсэмплинг (в вашем случае взятие 1 из 4 образцов).

Существует множество методов проектирования и применения фильтра низких частот.

Вы можете начать здесь:

http://en.wikipedia.org/wiki/Filter_design

1 голос
/ 26 октября 2008

Вам необходимо применить фильтр нижних частот перед тем, как понизить сигнал, чтобы избежать "алиасинга". Частота среза фильтра нижних частот должна быть меньше частоты Найквиста, равной половине частоты дискретизации.

0 голосов
/ 24 июня 2013

Вы должны применить фильтр нижних частот (убрав частоты выше 5500 Гц), а затем применить прореживание (оставьте каждый N-й образец, каждый 4-й в вашем случае).

Для прореживания обычно используются фильтры FIR, а не IIR, поскольку они не зависят от предыдущих выходных данных и, следовательно, вам не нужно ничего вычислять для отброшенных выборок. Обычно IIR зависят от входов и выходов, поэтому, если не используется определенный тип IIR, вам придется рассчитывать каждую выходную выборку, прежде чем выбросить 3/4 из них.

Только что гуглил вступительную статью на эту тему: https://www.dspguru.com/dsp/faqs/multirate/decimation

0 голосов
/ 15 апреля 2009

Я недавно сталкивался с BruteFIR , который может уже делать то, что вас интересует?

0 голосов
/ 27 октября 2008

«Лучшее» возможное решение - это действительно ДПФ, отбрасывающее верхние 3/4 частот и выполняющее обратное ДПФ, с областью, ограниченной нижним 1/4. Отбрасывание верхних 3/4 является фильтром нижних частот в этом случае. Дополнение до степени 2 числа сэмплов, вероятно, даст вам преимущество в скорости. Знайте, как в вашем пакете FFT хранятся образцы. Если это сложное БПФ (которое гораздо проще анализировать и, как правило, обладает более хорошими свойствами), частоты будут либо изменяться от -22 до 22, либо от 0 до 44. В первом случае вам понадобится среднее значение 1/4. В последнем, крайнем 1/4.

Вы можете сделать адекватную работу, усредняя значения выборки вместе. Наивный способ получения образцов четыре на четыре и выполнения равных средневзвешенных работ, но не слишком хороший. Вместо этого вы захотите использовать функцию «ядра», которая усредняет их вместе неинтуитивно.

Математически, отбрасывание всего, что находится за пределами низкочастотного диапазона, является умножением на блочную функцию в частотном пространстве. (Обратное) преобразование Фурье превращает поточечное умножение в свертку (обратных) преобразований Фурье функций и наоборот. Итак, если мы хотим работать во временной области, нам нужно выполнить свертку с (обратным) преобразованием Фурье функции квадрата. Это оказывается пропорциональным функции "sinc" (sin at) / at, где a - ширина поля в частотном пространстве. Таким образом, в каждом 4-м месте (поскольку вы уменьшаете в 4 раза) вы можете сложить точки рядом с ним, умноженные на sin (a dt) / a dt, где dt - расстояние во времени до этого местоположения. Как поблизости? Ну, это зависит от того, насколько хорошо вы хотите, чтобы это звучало. Например, обычно игнорируют все, что находится за пределами первого нуля, или просто берут количество точек, которое является отношением, по которому вы понижаете.

Наконец, есть безнадежный (но быстрый) способ просто отбросить большинство выборок, оставив только ноль, четвертый и т. Д.

Честно говоря, если это умещается в памяти, я бы порекомендовал просто пойти по маршруту DFT. Если он не использует один из пакетов программного фильтра, который другие рекомендовали создать для вас.

0 голосов
/ 26 октября 2008

Я бы попробовал применить ДПФ, нарезать 3/4 результата и применить обратное ДПФ. Я не могу сказать, будет ли это звучать хорошо, не пытаясь на самом деле.

...