8-битные звуковые образцы до 16 бит

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

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

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

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

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

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

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

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

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

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

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


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

6
задан Nosredna 30 июля '09 в 1:28
источник поделиться
4 ответов

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

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

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

1
ответ дан MaHuJa 30 июля '09 в 15:50
источник поделиться

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

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

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

2
ответ дан Robert Harvey 30 июля '09 в 1:43
источник поделиться

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

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

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

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

Пит

Изменить: Комментарии получаются немного длинными, поэтому я переведу часть ответа.

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

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

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

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

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

1
ответ дан NoMoreZealots 30 июля '09 в 15:59
источник поделиться

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

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

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

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

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

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

Примечания:

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

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

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

1
ответ дан mtrw 31 июля '09 в 23:34
источник поделиться

Другие вопросы по меткам