Снижение дискретизации и применение фильтра нижних частот к цифровому аудио
У меня есть звуковой поток 44 КГц с компакт-диска, представленный как массив 16-битных образцов PCM. Я бы хотел сократить его до 11 кГц. Как мне это сделать? Начиная с моих дней инженерного класса много лет назад, я знаю, что поток не сможет точно описать что-либо более чем на 5500 Гц, поэтому я предполагаю, что я хочу вырезать все выше этого. Есть идеи? Спасибо.
Обновление: на этой странице есть код, который преобразуется с 48 кГц на 8 кГц с использованием простого алгоритма и массива коэффициентов, который выглядит как {1, 4, 12, 12, 4, 1}. Я думаю, что это то, что мне нужно, но мне это нужно в 4 раза, а не в 6 раз. Любая идея, как рассчитываются эти константы? Кроме того, я в конечном итоге конвертирую 16 байтовых выборок в поплавки в любом случае, поэтому я могу выполнить понижающую дискретизацию с помощью float, а не шорт, если это вообще помогает качеству.
Ответы
Ответ 1
Читайте на фильтрах FIR и IIR. Это фильтры, которые используют массив коэффициентов.
Если вы выполняете поиск по Google в "FIR or IIR filter designer", вы найдете много программного обеспечения и онлайн-апплетов, которые выполняют тяжелую работу (получение коэффициентов) для вас.
EDIT:
Эта страница здесь (http://www-users.cs.york.ac.uk/~fisher/mkfilter/) позволяет вводить параметры вашего фильтра и выплевывать готовые к использованию C-коды..
Ответ 2
Вы правы в том, что вам нужно применять фильтрацию нижних частот на вашем сигнале. Любой сигнал более 5500 Гц будет присутствовать в вашем понижающем дискретизованном сигнале, но "сглажен" как другая частота, поэтому вам придется удалить их до понижающей дискретизации.
Это хорошая идея, чтобы сделать фильтрацию с поплавками. Существуют также алгоритмы фильтра с фиксированной точкой, но у них обычно есть качественные компромиссы для работы. Если у вас есть поплавки, используйте их!
Использование DFT для фильтрации, как правило, является излишним, и это усложняет работу, поскольку dft не является непрерывным процессом, а работает с буферами.
Цифровые фильтры обычно имеют два вкуса. FIR и IIR. Как правило, одна и та же идея, но фильтры IIF используют контуры обратной связи для достижения более крутого ответа с гораздо меньшими коэффициентами. Это может быть хорошей идеей для понижающей дискретизации, потому что вам нужен очень крутой скругленный фильтр.
Downsampling - это особый случай. Потому что вы собираетесь выбросить 3 из 4 образцов, нет необходимости их вычислять. Существует специальный класс фильтров для этого типа полифазных фильтров.
Попробуйте выполнить поиск в Google для полифазного IIR или полифазного FIR.
Ответ 3
Обратите внимание (в дополнение к другим комментариям), что простой-простой интуитивный подход "уменьшает размер в 4 раза за счет замены каждой группы из 4 последовательных выборок на среднее значение", не является оптимальным, но, тем не менее, ни практически, ни концептуально. Поскольку усреднение точно соответствует фильтру нижних частот (прямоугольное окно, соответствующее частоте sinc). То, что было бы концептуально неправильным, - это просто уменьшить размер, взяв по одному из каждых 4 образцов: это обязательно приведет к сглаживанию.
Кстати: практически любое программное обеспечение, которое выполняет некоторую передискретизацию (аудио, изображение или что-то еще, например, для случая с аудио: sox), учитывает это и часто позволяет выбрать базовый фильтр нижних частот.
Ответ 4
Вам нужно применить фильтр нижних частот, прежде чем вы уменьшите сигнал, чтобы избежать "сглаживания". Частота среза фильтра нижних частот должна быть меньше частоты nyquist, что составляет половину частоты выборки.
Ответ 5
Процесс, который вы назвали "Decimation".
Есть 2 шага:
- Применение фильтра низких частот для данных (в вашем случае LPF с вырезом при Pi/4).
- Downsampling (в случае, если вы берете 1 из 4 образцов).
Существует множество способов разработки и применения фильтра низких частот.
Вы можете начать здесь:
http://en.wikipedia.org/wiki/Filter_design
Ответ 6
Вы можете использовать libsamplerate для тяжелого подъема. Libsamplerate - это API C, и он заботится о вычислении коэффициентов фильтра. Вы можете выбрать из разных фильтров качества, чтобы вы могли торговать качеством для скорости.
Если вы предпочитаете не писать какой-либо код, вы можете просто использовать Audacity для преобразования частоты дискретизации. Он предлагает мощный графический интерфейс и использует libsamplerate для преобразования частоты дискретизации.
Ответ 7
Я бы попытался применить DFT, измельчив 3/4 результата и применив обратный DFT. Я не могу сказать, будет ли это звучать хорошо, даже если вы не будете стараться жестко.
Ответ 8
"Лучшее" решение возможно - это ДПФ, отбрасывание верхних 3/4 частот и выполнение обратного ДПФ с областью, ограниченной дном 1/4. В этом случае отбрасывание верхних 3/4-х является фильтром нижних частот. Заполнение до 2-х образцов, вероятно, даст вам преимущество в скорости. Помните, как ваш пакет FFT хранит образцы. Если это сложный FFT (который намного легче анализировать и, как правило, имеет более приятные свойства), частоты будут либо от -22 до 22, либо от 0 до 44. В первом случае вам нужен средний 1/4-й. В последнем, самом дальнем 1/4th.
Вы можете выполнить адекватную работу, усредняя вместе взятые образцы. Наивный способ захвата образцов четыре-четыре и выполнение равных средневзвешенных работ, но не слишком велик. Вместо этого вы захотите использовать функцию "ядро", которая усредняет их вместе неинтуитивным способом.
Посредством отбрасывания всего за пределами низкочастотного диапазона происходит умножение на функцию прямоугольника в частотном пространстве. Преобразование (обратное) Фурье превращает поточечное умножение в свертку (обратных) преобразований Фурье функций и наоборот. Итак, если мы хотим работать во временной области, нам нужно выполнить свертку с (обратным) преобразованием Фурье функции окна. Это оказывается пропорциональным функции "sinc" (sin at)/at, где a - ширина поля в частотном пространстве. Таким образом, на каждом 4-м месте (так как вы уменьшаете дискретизацию в 4 раза) вы можете сложить точки рядом с ним, умноженные на sin (a dt)/a dt, где dt - расстояние во времени до этого места. Как близко? Ну, это зависит от того, насколько хорошо вы хотите, чтобы это звучало. Обычно, например, игнорировать все, кроме первого нуля, или просто принимать количество точек в качестве отношения, по которому вы снижаете дискретизацию.
Наконец, существует бедный (но быстрый) способ просто отбрасывать большинство образцов, сохраняя только нулевой, четвертый и т.д.
Честно говоря, если он подходит в памяти, я бы порекомендовал просто идти по маршруту DFT. Если он не использует один из пакетов программного обеспечения, который другие рекомендовали для создания фильтра для вас.
Ответ 9
Недавно я наткнулся на BruteFIR, который может уже сделать некоторые из того, что вас интересует?
Ответ 10
Вам необходимо применить фильтр нижних частот (удаление частот выше 5500 Гц), а затем применить прореживание (оставить каждый N-й образец, каждый четвертый в вашем случае).
Для прореживания обычно используются FIR, а не IIR-фильтры, поскольку они не зависят от предыдущих выходов, и поэтому вам не нужно ничего рассчитывать для отброшенных образцов. IIR, как правило, зависят от обоих входов и выходов, поэтому, если не используется конкретный тип IIR, вам нужно будет вычислить каждый выходной образец перед тем, как отбросить 3/4 из них.
Просто поделился поисковой статьей на тему: http://www.dspguru.com/dsp/faqs/multirate/decimation