2009-07-29 2 views
6

Это моё «увлекательное» увлечение.8 бит звуковых образцов до 16 бит

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

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

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

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

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

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

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

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

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

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


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

+0

Я ни в коем случае не специалист по DSP, но короткий поиск (http://www.google.com/search?&q=improve++audio++bit+rate) привел некоторые документы: http://www2.computer.org/portal/web/csdl/doi?doc=abs/proceedings/icme/2001/1198/00/11980031abs.htm, http://iwaenc05.ele.tue.nl/proceedings/papers/S04 -02.pdf. Может быть, это даст вам некоторые идеи на следующие выходные ;-) –

+0

Спасибо, диво! Я прочту их. – Nosredna

+0

Большинство документов, которые я нашел, говорят о низкой частоте дискретизации. Только несколько говорят о восстановлении после ошибки квантования. Я все еще не решил, стоит ли даже думать об ошибке частоты дискретизации, так как у меня уже есть хороший интерполятор качества звука. – Nosredna

ответ

1

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

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

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

+0

Это именно то, что я намерен. Моя обычная стратегия заключается в том, что за проход I 1) Выберите количество номеров, которые могут меняться. 2) Определите случайный диапазон движения для каждого. 3) Создайте случайное значение в этом диапазоне. 4) Сделайте eval и решите, начать ли это снова. Это обычно удерживает меня от местных минимумов. – Nosredna

2

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

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

Вы также можете попробовать применить low-pass filtering.

+0

Это было первое, что я сделал. ;-) Сначала я попробовал линейный, затем переключился на лучший метод. Он делает небольшую очистку только потому, что, когда вы нажимаете между образцами, он работает лучше. Это немного лучше, чем сырье, но на самом деле не учитывает тот факт, что точки, благодаря ошибке квантования, находятся в неправильном месте. – Nosredna

+0

Возможно, я неправильно понял ваше предложение, но разве это не удвоило бы частоту выборки вместо улучшения отношения S/N? –

+0

Аналогично, низкий проход снимает высокий уровень шума, но не помогает помехам под верхней частью сигнала. Конечно, это влияет на фазу. В принципе, все эти старые синтезаторы в любом случае имели низкий проход. Я действительно буду после ошибки квантования хардкор здесь. :-) Но спасибо за предложения. – Nosredna

1

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

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

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

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

Пит

Edit: Комментарии получают немного долго, так что я перееду некоторые к ответу.

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

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

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

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

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

+0

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

+0

Моя мысль заключается в том, что _any_ 16-битные результаты, которые я получаю, могут быть усечены до 8-битных исходных циклов, являются «действительными» в том смысле, что это возможный ввод. Но есть четкие (-ish) пики сигнала, окруженные этим уровнем шума, которого не было в записанном звуке. Я знаю, что из-за интервью с разработчиками синтезаторов той эпохи, которые перешли на 12 и 16 бит ЦАП, как только они могли себе это позволить. – Nosredna

+0

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

1

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

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

  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], вероятно, не будет равен вашим исходным сигналам. Я не уверен, насколько важно это ограничение. Я чувствую, что этот подход будет генерировать формы сигнала, которые звучат хорошо.

+0

Ограничение имеет решающее значение. Я хочу иметь формы сигналов, которые будут отображать до 8 бит и соответствовать. В противном случае проблема проста. Но я подумаю об этом. – Nosredna

+0

Возможно, вы могли бы сделать оптимизационный подход, когда функция стоимости должна минимизировать | y [n] - x [n] | + | Y [w] |, а пространство поиска - «0» значения Y [w]. | Y [n] - x [n] | часть функции стоимости сохранит y [n] совпадение x [n] в битах высокого порядка, а | Y [w] | частично надавите на шумовой пол вниз. Я не знаю, как оптимизация будет иметь дело с обратным преобразованием Фурье между пространством поиска и функцией стоимости. У меня очень мало опыта в методах оптимизации. – mtrw