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

StackOverflow https://stackoverflow.com/questions/238382

Вопрос

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

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

Это было полезно?

Решение

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

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

РЕДАКТИРОВАТЬ:

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

Другие советы

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

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

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

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

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

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

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

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

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

Процесс, который вы называете "Decimation". Есть 2 шага:

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

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

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

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

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

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

    «Лучший» возможным решением действительно является ДПФ, отбрасывающее верхние 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 Если он не использует один из пакетов программного фильтра, который другие рекомендовали создать для вас.

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top