Вопрос

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

int i, j, a, b, z;

a = 44100;
b = 8363;

// upsample by a
for(i = z = 0; i < samplen; i++)
    for(j = 0; j < a; j++)
        cbuf[z++] = sampdata[i];

// some filter goes here???

// downsample by b
for(j = i = 0; i < z; i += b)
    buf[j++] = cbuf[i];

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

Оригинальный звук: http://www.mediafire.com/?9gnga1in52d6t4xПовторный звук: http://www.mediafire.com/?x34h7ggk8n9k8z1

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

Решение

Не используйте линейную интерполяцию, если оба показателя дискретистов (источник и пункт назначения) значительно выше самой высокой частоты в ваших данных. Это очень плохой фильтр низкого уровня.

Вы хотите, так это интерполирующий фильтр с низким проходом с остановкой, начинающейся ниже половины нижней части двух показателей дискретизации, с которыми вы имеете дело. Обычными методами реализации этого являются Upsampling/Downsampling с использованием фильтров IIR и использование полифазных FIR-фильтров. В окне SINC-интерполятор также хорошо работает для этого, если вам не нужна производительность в реальном времени, и вы не хотите увеличить/снижение. Вот В окне SINC-интерполяция фильтра низкого уровня в базовом, это должно быть тривиально преобразовать в C.

Если вы хотите использовать фильтрацию IIR, вот каноническая Кулинарная книга для фильтров Biquad IIR.

Если вы хотите наилучшее объяснение теории повторной выборки аудио, вот Страница повторной выборки Стэнфорда CCRMA.

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

Вы рассматривали возможность использовать специализированную библиотеку для этого, например, как libsamplete?

Это довольно портативно, и он разрабатывается людьми, которые знают, как правильно делать это. Даже если вы не используете его напрямую, вы можете найти алгоритмы, которые он реализует довольно интересные.

Несколько комментариев, хотя я только догадываю ваше фактическое намерение:

  • Вы поднимаетесь по скорости 44100 раз исходная скорость дискретизации. Например, если ваш ввод был на уровне 10 кГц ваш промежуточный cbuf[] будет на уровне 441 МГц, что немного высоко для большинства аудио -анализа. Предполагая, что вы хотите cbuf[] быть на уровне 44100 Гц, тогда вам нужно только создать 44100/OrigSampleRate образцов в cbuf[] за образец в sampdata[].
  • Вы увеличиваете z Дважды в петле подъемной дискретизации. Это приводит к всем нечетным элементам cbuf[] иметь их первоначальные ценности. Я считаю, что это в конечном итоге приводит к финалу buf[] Наличие недействительных нечетных элементов, которые могут быть источником вашего шума. Существует также потенциальный переполнение буфера в CBUF, если вы не создали его, по крайней мере, вдвое больше необходимого количества элементов.
  • Как упоминалось Стивом, линейная интерполяция, как правило, является самой простой, что создает хороший результат при повышении. При желании может быть сделано более сложное воспроизведение (полиномы, сплайны и т. Д.). Точно так же, когда вы можете пройти, вы можете провести средние образцы, а не просто усечение.

Лучший код повторной выборки, с которым я когда -либо сталкивался: http://shibatch.sourceforge.net/

Возьмите источник и постарайтесь что -то извлечь из этого. Это в противном состоянии, но результаты этого повторного сплета намного превышают все остальное.

Используйте FFMPEG и AVCODEC напрямую. Вот хороший пример, показывающий, как это сделать:

http://tdistler.com/projects/audio-resampling-with-ffmpeg

Перед тем как повторно приземлиться до более низкой скорости дискретизации, вы должны фильтр с низким проходом, исходный менее чем в 1/2 раза превышает скорость дискретизации, иначе вы введете Alize Artifacts. Спектр будет складываться на себя для частот более чем на 1/2 скорости дискретизации. Поэтому, если вы хотите повторно воспроизвести до 11025 из 44100, вы должны отфильтровать 44100 Lowpassa при 1/2 из 11025 или 5500 Гц, поскольку верность воспроизведения уменьшается с более низкой пропускной способностью. Для 16 бит подписано значение похоже на 10^(-10/20)*2^(16-1) или 10362 +/- для максимальной амплитуды. Точные алгоритмы могут быть найдены в Интернете, поскольку для этих старых и основных идей не должно быть никаких интеллектуальных прав. После выполнения всех вычислений без закругления двойной точки с плавающей запятой, вы округлите результаты до их надлежащих целочисленных значений и интерполируют по шкале времени, где один установлен перехватывает другой. Это требует настоящего воображения, памяти и предыдущего опыта, который затем ставит вас в сферу программиста по физике математики. : -O :-)

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