8-битные аудиосэмплы в 16-битные

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

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

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

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

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

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

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

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

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

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

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


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


person Nosredna    schedule 29.07.2009    source источник
comment
Я ни в коем случае не эксперт DSP, но короткий поиск (google.com/search?&q=improve++audio++bit+rate) выдал несколько документов: www2.computer.org/portal/web/csdl/doi?doc=abs/proceedings/icme/, iwaenc05.ele.tue.nl/proceedings/papers/S04 -02.pdf. Возможно, это даст вам некоторые идеи для следующих выходных ;-)   -  person Dirk Vollmar    schedule 30.07.2009
comment
Спасибо диво! Я прочитаю их.   -  person Nosredna    schedule 30.07.2009
comment
Большинство статей, которые я нашел, говорят о низкой частоте дискретизации. Лишь немногие говорят об устранении ошибки квантования. Я до сих пор не решил, стоит ли вообще думать об ошибке частоты дискретизации, поскольку у меня уже есть хороший интерполятор аудиокачества.   -  person Nosredna    schedule 30.07.2009
comment
есть некоторая литература с ключевым словом: расширение битовой глубины   -  person Olli Niemitalo    schedule 23.08.2016


Ответы (4)


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

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

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

person MaHuJa    schedule 30.07.2009
comment
Это именно то, что я намерен. Моя обычная стратегия заключается в том, что за проход я 1) выбираю, сколько чисел нужно варьировать. 2) Определите случайный диапазон движения для каждого. 3) Генерировать рандом в этом диапазоне. 4) Проведите оценку и решите, начинать ли снова. Это обычно удерживает меня от местных минут. - person Nosredna; 30.07.2009

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

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

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

person Robert Harvey    schedule 29.07.2009
comment
Это было первое, что я сделал. ;-) Сначала попробовал линейный, потом перешел на метод получше. Он делает небольшую очистку только потому, что когда вы попадаете между семплами, он работает лучше. Это немного лучше, чем необработанное, но на самом деле не учитывает тот факт, что точки из-за ошибки квантования находятся не в том месте. - person Nosredna; 30.07.2009
comment
Может быть, я неправильно понимаю ваше предложение, но не удвоит ли это частоту дискретизации, а не улучшит отношение сигнал/шум? - person Dirk Vollmar; 30.07.2009
comment
Точно так же фильтр нижних частот удаляет высокий шум, но не помогает шуму в верхней части сигнала. И, конечно, это влияет на этап. По сути, все эти старые синтезаторы в любом случае имели низкие частоты. Я действительно иду после хардкора ошибки квантования здесь. :-) Но спасибо за предложения. - person Nosredna; 30.07.2009
comment
Я думаю, что это помогло бы только увеличить частоту дискретизации сигнала, а не поддерживать его с той же частотой дискретизации, а просто увеличить размер выборки. - person cube; 30.07.2009
comment
divo, я готов добавить слоты для сэмплов и компенсировать это более высоким движением по данным, несмотря ни на что. Так что это не имеет большого значения. - person Nosredna; 30.07.2009
comment
Моя точка зрения заключалась в том, что я не вижу, как это уменьшит шум. Вам скорее нужно будет исправить исходные значения выборки, например. применяя БПФ и выполняя некоторую фильтрацию в частотной области. Кстати, в любом случае интерполяция будет выполняться фильтром реконструкции в ЦАП. - person Dirk Vollmar; 30.07.2009
comment
Если вы можете угадать, что представляют собой формы волны, вы можете попробовать воспроизвести их самостоятельно. Такие вещи, как прямоугольные волны, пилообразные волны и т. д. - person Robert Harvey; 30.07.2009
comment
@ Роберт Харви. Ну, некоторые очевидны, конечно. Вы можете увидеть, чем они пытаются быть, по частям. - person Nosredna; 30.07.2009
comment
Это звучит почти как проблема подбора кривой. - person Robert Harvey; 30.07.2009
comment
Я думаю, что это проблема оптимизации. - person Nosredna; 30.07.2009

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

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

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

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

Пит

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

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

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

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

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

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

person NoMoreZealots    schedule 30.07.2009
comment
К счастью, глядя на сигнал, в большинстве случаев это довольно очевидно — шум не похож на сигнал. Я понимаю, что не могу восстановить фактический сигнал, но я буду счастлив, если уберу уровень шума за пределы слышимого диапазона. Я знаю, что могу выполнить обратное БПФ. Моя цель — разделить 16-битные выборки на 256 и получить те же данные, с которых я начал. Вот почему я беспокоился об обратном БПФ. Можете ли вы объяснить последнее, что вы сказали о необходимости увеличения гейна? Я не понял, что ты имел в виду. - person Nosredna; 30.07.2009
comment
Я думаю, что любые 16-битные результаты, которые я получаю и которые могут быть усечены до 8-битных исходных циклов, действительны в том смысле, что это был возможный ввод. Но есть четкие пики сигнала, окруженные этим уровнем шума, которого не было в записанном звуке. Я знаю это из интервью с производителями синтезаторов той эпохи, которые переходили на 12- и 16-битные ЦАПы, как только могли себе это позволить. - person Nosredna; 30.07.2009
comment
Нет пиков от квантования. По крайней мере, не слишком много и не слишком высоко. Это действительно больше похоже на уровень шума. Я делал эффекты биткрашера и квантования, так что я хорошо знаком с шумом, который получается в результате. Для тех семплов, которые у меня есть, волны с резкими краями часто имеют вторую версию с ограниченной полосой пропускания для использования в более высоких регистрах. Я недостаточно знаю историю, чтобы понять, как они были созданы. Если бы я пошел по пути обратного БПФ, я бы все равно убедился, что могу перейти от 16-битного к 8-битному, взяв старшее слово. Это требование. - person Nosredna; 31.07.2009
comment
Да, версии с ограниченным диапазоном очень похожи на mipmapping. Это хорошая аналогия. Вы можете играть более высокие ноты с ними без наложения. - person Nosredna; 31.07.2009
comment
Как вы думаете, почему сэмплер округлый, а не ровный? Разве аналого-цифровое преобразование не просто накапливает напряжение или что-то в этом роде, пока не появится следующий импульс? По общему признанию, вся эта аналогия с цифрой не является моей сильной стороной, но у меня есть книги по DSP, в которых объясняется, как работают некоторые сэмплеры. - person Nosredna; 31.07.2009

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

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

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

  3. Подать сигнал Y[w] = (dBMag(X[w]) > Threshold) ? 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], вероятно, не будет равен вашим исходным сигналам. Я не уверен, насколько важно это ограничение. Я чувствую, что этот подход будет генерировать волны, которые звучат хорошо.

person mtrw    schedule 31.07.2009
comment
Ограничение имеет решающее значение. Я хочу иметь возможность иметь формы сигналов, которые будут сэмплировать до 8 бит и совпадать. В противном случае проблема проста. Но я подумаю об этом. - person Nosredna; 01.08.2009
comment
Возможно, вы могли бы применить подход к оптимизации, при котором функция стоимости должна минимизировать |y[n] - x[n]| + |Y[w]|, а область поиска — это 0 значений Y[w]. |y[n] - x[n]| часть функции стоимости будет поддерживать соответствие y[n] x[n] в старших битах, а |Y[w]| частично снижают уровень шума. Я не знаю, как оптимизация будет работать с обратным преобразованием Фурье между пространством поиска и функцией стоимости, у меня очень мало опыта с методами оптимизации. - person mtrw; 01.08.2009