.......... ALEXMOD: projects |
Dithering (Дизеринг) - что это и зачем?
| |
BesPav | Дата: Четверг, 05.05.2011 | Сообщение # 1 |
Завсегдатай
Группа: Пользователи
Сообщений: 88
Репутация: 0
Статус: Offline
| Вот хороший материал, позволяющий разобраться в сути вопросов со стороны звукорежиссера: Материал староват, хотя теорема Пифагора старше, но до сих пор работает. Фрагмент: ... Системы понижения разрядности в мастеринге Алексей Лукин Наиболее популярным форматом для распространения музыки в настоящее время является CD-DA - звуковой компакт-диск. Звук на компакт-диск записывается в некомпрессированном формате PCM с частотой дискретизации 44,1 кГц и разрядностью 16 бит. Качество звука на компакт-диске устраивает абсолютное большинство слушателей. Однако наиболее критически настроенные слушатели отмечают некоторые недостатки CD-DA, связанные с недостаточным динамическим диапазоном, эффектами 16-разрядного квантования и "звоном" интерполяционных фильтров. В этой статье рассмотрим, как можно минимизировать артефакты квантования при мастеринге аудио для компакт-дисков или других цифровых носителей. Разрядность аудио и эффекты квантования Как известно, для представления звука в цифровой форме аналоговый сигнал дискретизируется по времени и квантуется по амплитуде, то есть непрерывный сигнал заменяется дискретными его значениями - отсчетами в некоторых точках. Частота дискретизации 44,1 кГц означает, что по времени эти отсчеты берутся 44100 раз в секунду. Разрядность 16 бит означает, что амплитуда каждого такого отсчета может принимать одно из 65536 возможных значений. Теоретически динамический диапазон формата 16/44,1 составляет 98,5 дБ. Много это или мало? Рассмотрим на примере. Пусть мы хотим записать на компакт-диск симфонический концерт. Динамический диапазон классической музыки часто достигает 40…50 дБ. Получается, что во время самых тихих участков записи (-45 дБ) на квантование по амплитуде остается всего около 8 бит. Все наверняка знают, как звучат восьмибитные записи. Кроме высокого уровня шума, в таких записях часто встречаются и более неприятные артефакты квантования в виде гармонических искажений, которые зависят от уровня сигнала. При записи звука на студии все чаще используются форматы аудио с более высокой разрядностью, чем 16 бит. За последние несколько лет 24-битный формат стал стандартом для высококачественной звукозаписи, и в нем работают большинство студий. При подготовке студийных фонограмм к записи на CD встает необходимость преобразования разрядности записей в 16 бит. Несмотря на кажущуюся простоту этой операции, для ее выполнения существуют различные методы. Их качеством в значительной степени определяется звучание получающейся 16-битной фонограммы. Как видно из примера с классической музыкой, относительная величина искажений в цифровом формате зависит от уровня сигнала. Искажения тем заметнее, чем ниже уровень сигнала. Поэтому одно из возможных решений - максимизация уровня сигнала перед снижением разрядности, что делается с помощью приборов динамической обработки - компрессоров и лимитеров. Однако сжатие динамического диапазона фонограммы, которое при этом достигается, не всегда благоприятно отражается на звучании. Если отвлечься от артефактов, вносимых приборами динамической обработки, то сужение динамического диапазона само по себе может приводить к потере музыкальной выразительности. Поэтому для записей с широким динамическим диапазоном (классика, джаз и др.) желательно применять наиболее качественные методы снижения разрядности. ...
|
|
| |
Alex | Дата: Пятница, 06.05.2011 | Сообщение # 2 |
Автор сайта
Группа: Администраторы
Сообщений: 3030
Репутация: 120
Статус: Offline
| В оболочке rockbox с которой мы дело имеем, функция дизеринга (добавления псевдослучайного шума в младшие разряды после округления на выходе с 32бит до 16) сделана отключаемой из меню. Помнится Afart даже замеры выкладывал спектра выходного в широкой полосе с включенным и выключенным dithering ( по русски он там коряво называется фасонирование)))) Замеры показывали что ничего положительного он не вносит, ну или реализация его в оболочке посредственна. Dithering OFF Dithering ON
Love the MUSIC, not equipment! High-end portable now has a simple solution: aleXmod+RE272
|
|
| |
Alex | Дата: Пятница, 10.06.2011 | Сообщение # 3 |
Автор сайта
Группа: Администраторы
Сообщений: 3030
Репутация: 120
Статус: Offline
| Кстати, для тех кто разбирается в программировании на С, вот листинг кода отвечающего за данную функцию (комментарии приветствуются):
/* Dithering */ static struct dither_data dither_data[2] IBSS_ATTR; /* 0=left, 1=right */ static long dither_mask IBSS_ATTR; static long dither_bias IBSS_ATTR; ______________________________________________
/** * The "dither" code to convert the 24-bit samples produced by libmad was * taken from the coolplayer project - coolplayer.sourceforge.net * * This function handles mono and stereo outputs. */ static void sample_output_dithered(int count, struct dsp_data *data, const int32_t *src[], int16_t *dst) { const int32_t mask = dither_mask; const int32_t bias = dither_bias; const int scale = data->output_scale; const int32_t min = data->clip_min; const int32_t max = data->clip_max; const int32_t range = max - min; int ch; int16_t *d;
for (ch = 0; ch < data->num_channels; ch++) { struct dither_data * const dither = &dither_data[ch]; const int32_t *s = src[ch]; int i;
for (i = 0, d = &dst[ch]; i < count; i++, s++, d += 2) { int32_t output, sample; int32_t random;
/* Noise shape and bias (for correct rounding later) */ sample = *s; sample += dither->error[0] - dither->error[1] + dither->error[2]; dither->error[2] = dither->error[1]; dither->error[1] = dither->error[0]/2;
output = sample + bias;
/* Dither, highpass triangle PDF */ random = dither->random*0x0019660dL + 0x3c6ef35fL; output += (random & mask) - (dither->random & mask); dither->random = random;
/* Round sample to output range */ output &= ~mask;
/* Error feedback */ dither->error[0] = sample - output;
/* Clip */ if ((uint32_t)(output - min) > (uint32_t)range) { int32_t c = min; if (output > min) c += range; output = c; }
/* Quantize and store */ *d = output >> scale; } }
if (data->num_channels == 2) return; __________________________________________________ static void dither_init(struct dsp_config *dsp) { memset(dither_data, 0, sizeof (dither_data)); dither_bias = (1L << (dsp->frac_bits - NATIVE_DEPTH)); dither_mask = (1L << (dsp->frac_bits + 1 - NATIVE_DEPTH)) - 1; }
void dsp_dither_enable(bool enable) { struct dsp_config *dsp = &AUDIO_DSP; dither_enabled = enable; sample_output_new_format(dsp); }
Love the MUSIC, not equipment! High-end portable now has a simple solution: aleXmod+RE272
|
|
| |
fixc | Дата: Пятница, 10.06.2011 | Сообщение # 4 |
Новичок
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: Offline
| Какие именно комментарии интересуют? или просто преобразовать каждую строку в человекопонятный вид?
|
|
| |
Alex | Дата: Пятница, 10.06.2011 | Сообщение # 5 |
Автор сайта
Группа: Администраторы
Сообщений: 3030
Репутация: 120
Статус: Offline
| В общих чертах мне понятно. Комментарий - насколько хорошо процесс прописан, можно ли что-либо улучшить, итп. Вот интересный материал (unfortunatelly in English). Оказывается проводятся опыты по оптимизации вида кривых шума и их флияния на субьективное восприятие слушателями.
Dithered noise shaping technology has been incorporated into a handful of hardware devices. While all are based on the same concepts, some perform better than others. After simulating and listening to all available public domain algorithms, Lavry Engineering came to some conclusions in forming a basis for Acoustic Bit Correction. The principal conclusions are:
a. The practice of greatly amplifying low level signals to determine triangular flat PDF (probability density function) dither reveals the effectiveness of distortion and noise modulation elimination. This practice yields misleading results when testing unflattened dithers and/or noise shapers. It conflicts directly with L. Fielder’s findings showing completely different threshold detectability curves for quiet and loud levels. Noise shaping listening tests must be done at "reasonable" volume levels. ( Треугольный PDF дизеринг достаточно эффективен для снижения искажений при воспроизведении низкоуровневых сигналов, подвергаемых "усечению" в цифровом виде.)
b. Given the above requirement, our listening tests concluded a strong preference for "triangle high pass" dither (this dither is produced by simultaneously adding a new random number and subtracting the previous value). Such dither is frequency-shaped to carry more high frequency energy (the energy content at low frequencies is minimal). (Опытным путем доказано что наиболее эффективен т.н ВЧ треугольный дизеринг (когда к сигналу подмешивается случайный сигнал и одновременно вычитается предыдущее значениею Такой дизер приводит не к равномерному спектру шума в выходном сигнале, а масимуме в ВЧ области, находящейся вне области максимальной чувствительности слуха на СЧ)
c. Listening tests revealed a preference for smoothly varying noise shaping curves. Peaks and notches seem to irritate the listener (admittedly while turning the volume up). In addition, despite the temptation to optimize the noise shaping curve to the average listener’s hearing threshold, given a significant variation from listener to listener requires reasonable compromises in tailoring such a curve. In other words, smooth the curve. (В общем случае наиболее предочтительными оказываются кривые шума не имеющие резких всплесков, и стремление сглаживания этих кривых является предопределяющим в получении максимального качества)
Love the MUSIC, not equipment! High-end portable now has a simple solution: aleXmod+RE272
|
|
| |
BesPav | Дата: Пятница, 10.06.2011 | Сообщение # 6 |
Завсегдатай
Группа: Пользователи
Сообщений: 88
Репутация: 0
Статус: Offline
| Вторая часть приведенной мной статьи с графиками:
http://www.ugex.ru/showthread.php?t=356&s=348072b3b34d5167ac8553fb354a48a7&p=3039&viewfull=1#post3039
Если кто не дочитал статью в первом посте. На русском.
Вот этот кусок кода:
/* Dither, highpass triangle PDF */ random = dither->random*0x0019660dL + 0x3c6ef35fL; output += (random & mask) - (dither->random & mask); dither->random = random;
Собственно занимается генерацией случайных значений. Сюда и нужно подсовывать вариации функций, отвечающих за спектр шума.
Оптимизации? Алекс, ну тогда нужно говорить подо что... Сам понимаешь, компилятор будет преобразовывать этот код на Си в команды процессора. И оптмизировать сишный код, который генерит псевдослучайный шум, добавляет его к сигналу и округляет сумму (с учетом остатка округления) можно долго и нудно.
Компилятор-то может строгий и лаконичный сишный код превратить в серьезную нагрузку для итогового вычислительного устройства.
|
|
| |
Alex | Дата: Пятница, 10.06.2011 | Сообщение # 7 |
Автор сайта
Группа: Администраторы
Сообщений: 3030
Репутация: 120
Статус: Offline
| Для меня все программерские вещи весьма далеки. Если кто-либо видит здесь узкое место, которое можно модифицировать, то почему бы не попробовать? Пока что, я лично убеждаюсь что исходно все в рокбоксе сделано вполне себе на уровне. Да и насколько все это нужно, неясно. Замеры Afart для сигнала -60дБ показывают отсуствие влияния включения/выключения дизеринга. Стало быть, это можно выловить лишь на более низких уровнях ( в пдф, ссылку на который я приводил выше, приведены "ужасные" картинки для уровней -95дБ что вообщето находится на границе физических возможностей CD-DA формата 16битного разрешения. ) Я затрудняюсь представить золотоухого индивидуума, который бы на фоне сигнала-10..-20дБ смог уловить искажения нюансов находящихся на уровне -90дБ и менее...
Love the MUSIC, not equipment! High-end portable now has a simple solution: aleXmod+RE272
|
|
| |
fixc | Дата: Пятница, 10.06.2011 | Сообщение # 8 |
Новичок
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: Offline
| Алгоритм написан исходя из теории, т.е. я как понимаю подмешиванием рандомного шума random = dither->random*0x0019660dL + 0x3c6ef35fL; Если в теории что-то можно улучшить можно и сюда превнести. Можно поиграться конечно с этим параметром, но думаю эти циферки уже максимально хорошо подорбаны.
Сообщение отредактировал fixc - Пятница, 10.06.2011, 11:55 |
|
| |
igor120765 | Дата: Пятница, 10.06.2011 | Сообщение # 9 |
Новичок
Группа: Пользователи
Сообщений: 28
Репутация: 0
Статус: Offline
| Всё это в очередной раз подтверждает то,что данная прошивка практически если не идеальна,то весьма близка к.Именно поэтому неотбоксированные девайсы мне совсем не интересны,привет хайфайменам 601-801 и флаю... Поверьте,мною много раз ставились опыты по исследованию влияния эквалайзера рокбокса на звук.Ничего,кроме выпрямления ачх,не замечено (это не кривой 601 с кривой китайской прошей!) Как бы нет проблем чуть поправить какие-либо замечательные наушники,избавив себя от трат на порядок больших в поисках несуществующего - разрешения и ровности в одном флаконе)))
|
|
| |
BesPav | Дата: Пятница, 10.06.2011 | Сообщение # 10 |
Завсегдатай
Группа: Пользователи
Сообщений: 88
Репутация: 0
Статус: Offline
| Все правы, но детализирую и поясню. По порядку.
Алекс, AfArt, если я не ошибаюсь, то при измерениях -60 дБ воспроизводился сигнал 16/44100, я уже не помню по каким ключевым словам найти это сообщение. В этом случае дизеринг рокбокса будет под шумами 16 бит. Тем более - эти самые -60 дБ были в записи сигнала или - 60 стояло на регуляторе громкости рокбокса, а сам сигнал был с полным размахом? Если второй случай - тогда шум дизеринга будет меньше искажений регулятора и соответственно вкл/выкл не внесет дополнительных изменений. Кинь ссылку, если помнишь где замеры AfArt, а? 24 бита воспроизводились с 0дБ и там дизеринг не включался, а измерять нужно именно этот случай. И при воспроизведении сигнала, изначально имеющего -60 дБ по уровню.
Fixc, рандом здесь - это переменная, значение которой случайным образом выбирается во время работы программы. Т.е. шум вроде как случайный, и характер случайности распределен по треугольной функции. Вот тут: sample = *s; sample += dither->error[0] - dither->error[1] + dither->error[2]; dither->error[2] = dither->error[1]; dither->error[1] = dither->error[0]/2;
output = sample + bias;
Ну а в функции рандома: random = dither->random*0x0019660dL + 0x3c6ef35fL; Вероятнее всего - 0x3c6ef35fL - это единичный отсчет 16 битного сигнала в представлении Long (4 байта, 32 битный), а 0x0019660dL - это единичный отсчет 24 разрядного сигнала в 32 битном виде. Так вот это выражение говорит - к имеющемуся 24 битному отсчету сигнала нужно прибавить случайное количество 24-битных ступенек, распределенных треугольно относительно 24 битного уровня сигнала, соответствующего первому уровню 16-битного представления в пределах ближайших двух отсчетов 16 битного уровня. Блин, прочитал и не понял. Но суть где-то очень рядом. Короче сигнал должен немножко дрожать относительно -1 0 +1 в 16 битном виде. Именно это дрожание - и есть дизеринг. Еще короче - к сигналу прибавляется (единичка, нолик, минус единичка) а частота прибавления определяется этой функцией.
Igor120765. Так самое главное - эквалайзер рокбокса - это набор параметрических фильтров (Тех самых, математических, синусоидальных, Чебышева, Кауэра, эллиптических), синтезируемых по заданным вами параметрам. А эквалайзер китайцев - это преобразование Фурье в частотную область, применение коэффициентов эквалайзера к спектру сигнала, а потом обратное преобразование Фурье. Так вот эта пара преобразований Вам и не нравится. И именно про этот вариант эквалайзера говорят - выключите и забудьте о нем.Добавлено (10.06.2011, 16:08) --------------------------------------------- И еще, поймите главное - дизеринг не уменьшает количество шума. Он всего-то позволяет перераспределить спектральную плотность мощности шума в те участки, где его присутствие будет менее заметным. При этом автоматом очистятся остальные области. Я не слышу выше 18 кГц, ну так мне и шум нужно скапливать именно там - за границей слуха. И побочный эффект - устранение накопления ошибки из-за того, что округленные до 16 бит остатки 24 битного сигнала накапливаются уже после ЦАПа - в аналоговой части.
|
|
| |
fixc | Дата: Пятница, 10.06.2011 | Сообщение # 11 |
Новичок
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: Offline
| Quote (BesPav) Ну а в функции рандома: random = dither->random*0x0019660dL + 0x3c6ef35fL; Вероятнее всего - 0x3c6ef35fL - это единичный отсчет 16 битного сигнала в представлении Long (4 байта, 32 битный), а 0x0019660dL - это единичный отсчет 24 разрядного сигнала в 32 битном виде. Так вот это выражение говорит - к имеющемуся 24 битному отсчету сигнала нужно прибавить случайное количество 24-битных ступенек, распределенных треугольно относительно 24 битного уровня сигнала, соответствующего первому уровню 16-битного представления в пределах ближайших двух отсчетов 16 битного уровня. Блин, прочитал и не понял. Но суть где-то очень рядом.
Ну я бы с этим не согласился .... если в бинарный вид перевести не сильно похоже на единичный отсчет, но все может быть. А как раз само прибавление, а точнее удаление лишнего идут вот здесь:
output += (random & mask) - (dither->random & mask);
Т.е. по маске mask отсекаем лишние. И из рандома который был до, вычитаем что есть сейчас.
output = sample + bias; - а это начальное значение как раз, т.е. опора к которой все клеиться.
Мы берем одну из точек треугольника, потом сливаем с bias(вроде как 24-битный сигнал), потом генерим рандомный сигнал и сливаем с ним, а потом уже обрезаем лишние.
Но я могу и ошибаться ...
UPD: random = dither->random*0x0019660dL + 0x3c6ef35fL; - известная формула рандомного генератора, много где используется можно в гугле вбить вторую цифру и проверить )) Т.е. тут только алгоритм менять в корне, а так все по науке. Прикручивать другой генератор случ. чисел ....... может какой-то смысл имеет но толку не будет особого ибо они все псевдо-случайные, а не случайные.
Сообщение отредактировал fixc - Пятница, 10.06.2011, 18:25 |
|
| |
AfArt | Дата: Суббота, 11.06.2011 | Сообщение # 12 |
Завсегдатай
Группа: Модераторы
Сообщений: 58
Репутация: 1
Статус: Offline
| BesPav, http://player.ru/showthread.php?t=59891&highlight=rmaa&page=68 Выходной уровень с плеера (независимо от настроек) принимался за 0дБ в анализаторе (карте) работающем в 24 битном разрешении. Относительно него и идёт весь отсчёт, т.е. -60дБ на графиках это именно -60дБ в записи относительно принятого ранее 0дБ, каторый в свою очередь мы могли устанавливать в РБ и как 0 дБ, и как минус NдБ.
Нужно регулятор громкости, он же precut заставить работать более мягко. Вот я слышал такое выражеение - "внутренняя обработка сигнала с повышением разрядности", - толком я не представляю что это такое, но мне почему-то кажется, что это именно то что нужно. Извините, если я чего-то ляпнул глупого))).
Или это как-раз то, о чём Алекс когда-то мечтал - получение на выходе из РБ 24-битного сигнала, тода бы и регулировка была более аккуратной?
|
|
| |
Alex | Дата: Понедельник, 13.06.2011 | Сообщение # 13 |
Автор сайта
Группа: Администраторы
Сообщений: 3030
Репутация: 120
Статус: Offline
| В конкретном случае Х5 процессор оперирует в модуле DSP данными в 32битном формате, и лишь на выходе усекает их до 16бит. Чтобы облагородить сей процесс в оболочке есть отключаемая функция дизеринга. Замеры Afart показали, что ее влияние незаметно для сигналов -60дБ (нет разницы в характере спектра и гармониках с и без дизеринга). Т.е работает он с очень малыми сигналами в фонограмме (видимо наглядно будет если пробовать его включать и выключать на тестовом сигнале с уровнями близкими к минимуму разрешения доступному в 16битном формате т.е -80...-90дБ и менее. Также в списке модулей рокбокс есть модуль который именуется "высокое разрешение" и призван к грамотной работе с младшими разрядами т как раз в модулях pre-cut и эквалайзера. Если интересно посмотреть, выложу листинг позже. Я, что-то, так и не нашел каким образом реализована цифровая регулировка громкости т.н. SW VOLUME (т.к. этот модуль видимо используется лишь в некоторых простых плейерах, не имеющих хардварной возможности регулировки громкости в кодеке (видимо за неимением таковых)) и есть ли там, к чему придраться...
Love the MUSIC, not equipment! High-end portable now has a simple solution: aleXmod+RE272
|
|
| |
BesPav | Дата: Понедельник, 13.06.2011 | Сообщение # 14 |
Завсегдатай
Группа: Пользователи
Сообщений: 88
Репутация: 0
Статус: Offline
| Fixc, все правильно! Хоть с генератором разобрались...
AfArt, спасибо! Да, действительно память не подводит. Измерения дизеринга были в 16 битах.
А можно очень Вас попросить изыскать время и проделать следующее:
1. В cooledit/audition сгенерировать 24-битную/44.100 синусоиду с уровнем -60 дБ. (а можно и -10 дБ, это не важно) 2. Выставить регулятор громкости в оболочке АлексМода на 0 дБ. (надеюсь, он не перегружает вход Вашей карты?) 3. И вот именно для таких условий записать выход мода в режиме 24/44.100 (или 88k, 96k, 192k и пр...) 4. Соответственно со включенным и выключенным дизерингом.
Если дизеринг реализован по-учебнику (а есть основания полагать именно такой вариант), то в случае включенного дизеринга уровень шума в диапазоне 15-20 кГц останется таким же горбом (как на 16 битных), а вот в диапазоне 500 Гц - 10 кГц пропадет та жуткая картинка нелинейных искажений (как на 24-битах, где динамический диапазон).
Вот после этих измерений можно будет сказать, есть ли смысл ковырять код дизеринга. И подтвердить квалификацию наших уважаемых меломанов.
|
|
| |
Alex | Дата: Понедельник, 13.06.2011 | Сообщение # 15 |
Автор сайта
Группа: Администраторы
Сообщений: 3030
Репутация: 120
Статус: Offline
| Не -60 а -90дБ сделать нужно. Если Артем не может сделать, то я могу ему сделать. Вот на таком сигнале влияние включения дизеринга должно быть явным и ощутимым, как в учебнике.
Love the MUSIC, not equipment! High-end portable now has a simple solution: aleXmod+RE272
|
|
| |
|
|
|