8 бит аудио сэмплов до 16 бит - PullRequest
6 голосов
/ 30 июля 2009

Это моя проблема с хобби на выходных.

У меня есть несколько любимых форм сигналов одного цикла из ПЗУ классического синтезатора.

Это 8-битные выборки (256 возможных значений).

Поскольку они всего 8 бит, минимальный уровень шума довольно высок. Это связано с ошибкой квантования. Ошибка квантования довольно странная. Это немного портит все частоты.

Я бы хотел взять эти циклы и сделать их «чистые» 16-битные версии. (Да, я знаю, что людям нравятся грязные версии, поэтому я позволю пользователю интерполировать грязную и чистую в любой степени, в которой они захотят.)

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

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

Для каждого отдельного байтового примера я действительно знаю, что это одно из 256 значений в 16-битной версии. (Представьте обратный процесс, где 16-битное значение усекается или округляется до 8 бит.)

Моя функция оценки пытается получить минимальный минимальный уровень шума. Я должен быть в состоянии судить об этом с одним или несколькими БПФ.

Исчерпывающее тестирование, вероятно, заняло бы вечность, поэтому я мог бы сделать первый проход с меньшим разрешением. Или я просто случайно выбираю случайно выбранные значения (в пределах известных значений, которые сохраняют ту же 8-битную версию) и выполняю оценку и сохраняю более чистую версию? Или я могу что-то сделать быстрее? Могу ли я попасть в локальные минимумы, когда в других местах поиска могут быть какие-то лучшие минимумы? Такое случалось и в других подобных ситуациях.

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


Редактировать: Несколько человек указали, что проблема легче, если я уберу требование, что новая форма волны будет сэмплирована к оригиналу. Это правда. На самом деле, если я просто ищу более чистые звуки, решение будет тривиальным.

Ответы [ 4 ]

2 голосов
/ 30 июля 2009

Вы можете поместить существующую 8-битную выборку в старший байт новой 16-битной выборки, а затем использовать младший байт до линейной интерполяции какой-то новой 16-битные точки данных между каждой исходной 8-битной выборкой.

Это, по сути, соединит 16-битную прямую линию между каждым из ваших исходных 8-битных семплов, используя несколько новых семплов. Звучит намного тише, чем сейчас, а это внезапный 8-битный переход между двумя исходными сэмплами.

Вы также можете попробовать применить некоторую фильтрацию нижних частот .

1 голос
/ 01 августа 2009

Может быть простой подход, основанный на периодичности сигналов. Как насчет, если вы:

  1. Создайте 16-битную форму сигнала, в которой старшие байты являются формой волны, а младшие байты равны нулю - назовите ее x [n].

  2. Рассчитать дискретное преобразование Фурье для x [n] = X [w].

  3. Сделать сигнал Y [w] = (дБмэг (X [w])> порог)? X [w]: 0, где dBMag (k) = 10 * log10 (real (k) ^ 2 + imag (k) ^ 2), а пороговое значение может составлять 40 дБ, исходя из того, что 8 битов составляют примерно 48 дБ динамического диапазона, и допускает ~ 1,5 бита шума.

  4. Обратное преобразование Y [w], чтобы получить y [n], ваш новый 16-битный сигнал.

  5. Если y [n] звучит не очень хорошо, смешайте его с очень низким уровнем шума.

Примечания:

A. Этот метод работает только в оригинальных формах волны, которые являются точно периодическими!

B. Шаг 5 можно заменить установкой значений «0» на случайный шум в Y [w] на шаге 3, вам придется немного поэкспериментировать, чтобы увидеть, что работает лучше.

Это кажется проще (по крайней мере, мне), чем оптимизационный подход. Но усеченный y [n], вероятно, не будет равен вашим исходным сигналам. Я не уверен, насколько важно это ограничение. Я чувствую, что этот подход будет генерировать волны, которые звучат хорошо.

1 голос
/ 30 июля 2009

Что ж, я ожидаю, что для устранения шума понадобится некоторая FIR-фильтрация (IIR, если вам действительно нужны циклы обработки, но FIR может дать лучшие результаты без неустойчивости). Вам придется поиграть с ним, чтобы получить желаемый эффект, но основная проблема заключается в сглаживании резких краев звука, созданного путем сэмплирования в 8-битных разрешениях. Я бы широко использовал центральную частоту звука и выполнял фильтр низких частот, а затем слушал, чтобы убедиться, что он не звучит "ровно" с выбранным фильтром.

Хотя это сложно, вы можете сделать только так много, младшие 8 бит потеряны, лучшее, что вы можете сделать, - это приблизительное значение.

Почти невозможно избавиться от шума, похожего на ваш сигнал. Если вы начнете настраивать материал в своей полосе частот, он уберет интересующий вас сигнал.

Для повышения частоты дискретизации, поскольку вы уже используете FFT, вы можете добавить нули к концу сигнала в частотной области и выполнить обратное FFT. Это полностью сохраняет информацию о частоте и фазе исходного сигнала, хотя она распространяет ту же энергию по большему количеству выборок. Если вы сначала сдвинете его на 8 бит, чтобы получить 16-битные сэмплы, это не станет большой проблемой. Но я обычно поднимаю его с помощью целочисленного коэффициента усиления перед выполнением преобразования.

Пит

Edit: Комментарии становятся немного длиннее, поэтому я перейду к ответу.

Пики на выходе БПФ представляют собой пики гармоник, вызванные квантованием. Я склонен думать о них иначе, чем уровень шума. Вы можете помешать, как кто-то упомянул, устранить амплитуду пиков гармоник и сгладить минимальный уровень шума, но вы потеряете весь сигнал-шум на плоской части минимального уровня шума. Что касается БПФ. Когда вы интерполируете с использованием этого метода, он сохраняет ту же энергию и распространяется на большее количество выборок, что уменьшает амплитуду. Поэтому, прежде чем делать обратное, дайте вашему сигналу больше энергии, умножив на коэффициент усиления.

Являются ли сигналы простыми / сложными синусоидами или имеют жесткие края? то есть треугольник, прямоугольные волны и т. д. Я предполагаю, что они имеют непрерывность от цикла к циклу, это верно? Если это так, вы также можете увеличить разрешение БПФ до более точного определения частоты, увеличив число циклов сигнала, подаваемых на БПФ. Если вы можете точно определить используемые частоты, предполагая, что они несколько дискретны, вы сможете полностью воссоздать предполагаемый сигнал.

От 16-битного до 8-битного требования обрезания приведет к результатам, которые не соответствуют исходному источнику. (Таким образом, затрудняется поиск оптимального ответа.) Как правило, вы можете получить сигнал с фиксированной запятой, пытаясь «получить самое близкое соответствие», что означает округление до ближайшего числа (транкинг - операция на полу). Это наиболее вероятно, как они были изначально созданы. Добавление 0,5 (в данном случае 0,5 - 128) и последующее объединение результатов позволит вам получить более точные результаты. Если это не беспокоит, тогда все в порядке, но это определенно отрицательно скажется на точности.

ОБНОВЛЕНИЕ: Зачем? Потому что цель выборки сигнала состоит в том, чтобы иметь возможность максимально близко воспроизвести сигнал. Если порог преобразования плохо установлен на выборке, все, что вы делаете, это ошибка на одной стороне сигнала, и она плохо распределена и центрирована около нуля. В таких системах вы обычно стараетесь максимально использовать доступный динамический диапазон, особенно если у вас низкое разрешение, такое как 8-разрядный АЦП.

Band ограниченные версии? Если бы они были отфильтрованы на разных частотах, я подозреваю, что это позволило вам воспроизводить один и тот же звук без искажений, когда вы слишком далеко отошли от другого варианта. Вроде как mipmapping в графике. Я подозреваю, что это один и тот же сигнал с разными фильтрами наложения, это может быть полезно при воспроизведении оригинала. Это должен быть один и тот же базовый сигнал с применением разных сверток.

1 голос
/ 30 июля 2009

Следуя подходу в вашем вопросе, я бы предложил изучить алгоритмы восхождения на холм и тому подобное.

http://en.wikipedia.org/wiki/Hill_climbing содержит дополнительную информацию, а в боковой панели есть ссылки на другие алгоритмы, которые могут быть более подходящими.

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

...