Вопрос

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

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

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

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

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

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

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

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

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

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

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


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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

Пит

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

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

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

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

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

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

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

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

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

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

scroll top