По материалам статьи Боба Каца (Bob Katz), инженера мастеринга студии Digital Domain, «Analog Saved My Life: The Good, The Bad and The Ugly» на сайте digido.com. Условия и результаты измерений взяты оттуда и сверены с учебниками по цифровой обработке; оценки звучания — позиция Каца как практика, а не стандарт.
Аналоговый компрессор (dynamic range compressor)компрессор (dynamic range compressor) — Устройство или программа, которая ослабляет сигнал, когда его уровень выше порога, и тем сужает динамический диапазон. с ламповым каскадом и его цифровая модель могут давать одинаковые гармоники, но в записи цифровой модели появляются ещё и составляющие, не связанные с нотами. Их источник — граница , половина частоты дискретизации (sample rate)частота дискретизации (sample rate) — Число отсчётов в каждом канале за одну секунду, то же число кадров аудиоданных в секунду. Измеряется в герцах: 44 100 Гц означает 44 100 отсчётов на канал в секунду.: гармоники выше неё не исчезают, а отражаются в слышимую полосу. Ниже разобрано, куда попадают такие отражения, как отличить их от интермодуляционных искажений (intermodulation distortion)интермодуляционные искажения (intermodulation distortion) — Составляющие на суммах и разностях частот входных тонов, |m·f₁ + k·f₂| при ненулевых m и k, которые нелинейная обработка добавляет к сигналу из нескольких тонов. В отличие от гармоник, они обычно не кратны частоте ни одного из тонов., которые даёт и аналоговая схема, что показал тест двумя тонами 19 и 20 кГц и как отражения ослабляют передискретизацией (oversampling)передискретизация (oversampling) — Работа с частотой дискретизации выше необходимой для полезной полосы. В АЦП уменьшает долю шума квантования в полезной полосе и смягчает требования к входному фильтру, в ЦАПе отодвигает спектральные копии, вокруг нелинейной обработки оставляет место для новых составляющих, чтобы они не отражались в полезную полосу. Новых сведений об исходном звуке не добавляет. и методом антипроизводной. В конце — код с juce::dsp::Oversampling.
Новые частоты на выходе кривой
Передаточная кривая (transfer curve, waveshaper)передаточная кривая (transfer curve, waveshaper) — Функция y = f(x), по которой обработка без памяти пересчитывает каждый входной отсчёт в выходной. Прямая y = x ничего не меняет, любой изгиб добавляет гармоники. без памяти пересчитывает каждый отсчёт: , где — входное усиление. У одного тона она добавляет гармоники, кратные его частоте, а симметричная кривая — только нечётные (статья о дисторшне). Если на входе два тона с частотами и , на выходе появляются ещё и интермодуляционные искаженияинтермодуляционные искажения (intermodulation distortion) — Составляющие на суммах и разностях частот входных тонов, |m·f₁ + k·f₂| при ненулевых m и k, которые нелинейная обработка добавляет к сигналу из нескольких тонов. В отличие от гармоник, они обычно не кратны частоте ни одного из тонов.: составляющие на сочетаниях частот из формулы (1) (Zölzer, §10.1, с. 342–343).
- частоты входных тонов, Гц;
- целые числа, в том числе отрицательные и ноль;
- порядок составляющей: при это номер гармоники первого тона.
Сумма и разность — составляющие второго порядка, и — третьего. Симметричная кривая, например гиперболический тангенс (hyperbolic tangent, tanh)гиперболический тангенс (hyperbolic tangent, tanh) — Функция tanh u = (eᵘ − e⁻ᵘ)/(eᵘ + e⁻ᵘ). Около нуля почти совпадает с u, при росте |u| плавно приближается к ±1, не достигая их. , даёт только нечётные порядки, асимметричная — все. Чем выше порядок, тем слабее составляющая, но у кривой, которая не записывается многочленом, порядки не кончаются.
В аналоговой схеме высокие порядки ничем не мешают: их ослабляют ограниченная полоса самих элементов и фильтры, а то, что остаётся выше 20 кГц, не слышно (Reiss, McPherson, с. 197). В цифровой обработке кривая получает только отсчёты, и порядок «сначала дискретизация, потом кривая» даёт те же числа, что «сначала кривая, потом дискретизация». Значит, цифровой выход — это отсчёты непрерывного сигнала , полоса которого не ограничена (Zölzer, §10.4, с. 350). Все его составляющие выше частоты Найквиста (Nyquist frequency)частота Найквиста (Nyquist frequency) — Половина частоты дискретизации, fₛ/2. В принятой низкочастотной модели точное восстановление по отсчётам требует, чтобы все частоты исходного сигнала были строго ниже этой границы. переносятся наложением спектров (aliasing)наложение спектров (aliasing) — Наложение частотных составляющих при дискретизации: разные непрерывные сигналы дают одинаковые отсчёты. Частота выше границы Найквиста может проявиться как более низкая. в полосу от 0 до по формуле статьи о дискретизации: частота превращается в с ближайшим к целым .
Отражённая составляющая не кратна частоте ноты и не совпадает с сочетаниями входных частот. Отфильтровать её после кривой нельзя: она уже лежит в слышимой полосе среди полезных составляющих (Reiss, McPherson, с. 197–198). На слух алиасинг описывают как размытость, лёгкую пелену и резкость звучания.
Тест двумя тонами
Для проверки на вход подают два тона у верхнего края полосы, например 19 и 20 кГц. Их гармоники и суммы лежат выше 22,05 кГц. Все сочетания этих тонов кратны 1 кГц, и ниже 17 кГц сильнее всего разностный тон кГц и его кратные: это интермодуляция чётных порядков, её уровень говорит о том, насколько асимметрична нелинейность. Остальные сочетания в этой области — высоких порядков: 16 кГц — уже седьмого, . Таблица 1 перечисляет сочетания до третьего порядка.
| Сочетание | Порядок | Частота, кГц | При 44,1 кГц, кГц | При 48 кГц, кГц |
|---|---|---|---|---|
| f₂ − f₁ | 2 | 1 | 1 | 1 |
| 2f₁ | 2 | 38 | 6,1 | 10 |
| f₁ + f₂ | 2 | 39 | 5,1 | 9 |
| 2f₂ | 2 | 40 | 4,1 | 8 |
| 2f₁ − f₂ | 3 | 18 | 18 | 18 |
| 2f₂ − f₁ | 3 | 21 | 21 | 21 |
| 3f₁ | 3 | 57 | 12,9 | 9 |
| 2f₁ + f₂ | 3 | 58 | 13,9 | 10 |
| f₁ + 2f₂ | 3 | 59 | 14,9 | 11 |
| 3f₂ | 3 | 60 | 15,9 | 12 |
При 44,1 кГц отражения смещены на 100 Гц относительно сетки 1 кГц, на которой лежат все настоящие сочетания: 4,1, 5,1, 12,9 кГц. Их видно по одной частоте. При 48 кГц отражения попадают на ту же сетку: кГц переходит в 9 кГц, где могла бы стоять и настоящая составляющая. Отличить их можно только сравнением с выходом, который считался при более высокой частоте. Высокие порядки при 44,1 кГц ложатся на любые частоты, кратные 100 Гц: например, кГц девятого порядка оказывается на 400 Гц.
Измерения Каца
Кац сравнивал компрессоры, которые работают как модели компрессора LA-2A или похожи на него. Сигнал 19 + 20 кГц уходил из Pro Tools в прибор по AES/EBU в 24 битах и возвращался в анализатор SpectraPlus. Для рисунка 1 оригинала уровень был около −20 dBFS (decibels relative to full scale)dBFS (decibels relative to full scale) — Уровень цифрового сигнала в децибелах относительно полной шкалы. Для пиковых значений 0 dBFS соответствует её границе; формат с плавающей точкой допускает значения выше неё. Соглашение об опоре RMS указывают отдельно. RMS при ослаблении компрессором около 1 дБ; на рисунках 1–3 частота дискретизации 44,1 кГц.
| Прибор | Устройство | Тон 1 кГц | Отражения |
|---|---|---|---|
| Неназванный плагин — модель LA-2A | Цифровая модель без передискретизации | на 30 дБ выше, чем у APB-16, то есть около −75 dBFS | Есть: 200, 400, 600, 800 Гц |
| McDSP APB-16, режим Moo Tube | Аналоговая обработка с цифровым управлением: ЦАП, аналоговая схема, АЦП | около −105 dBFS | Нет |
| ADL, копия LA-2A | Аналоговая: исходная схема, трансформаторы, лампы и оптопары | −65 dBFS; вторая гармоника тона 1 кГц всего на 20 дБ ниже | Нет; есть слабый фон сети |
| Pendulum OCL-2 | Аналоговый ламповый оптический компрессор | −105 dBFS | Нет |
| Tone Projects Unisum | Цифровой, с передискретизацией | Уровень не указан; только слабая интермодуляция около тонов | Нет ни при 96, ни при 44,1 кГц |
Самый сильный разностный тон дал аналоговый прибор: у копии LA-2A он на 10 дБ выше, чем у цифровой модели. Аналоговый эталон не свободен от интермодуляции; у него нет отражений, потому что непрерывная схема не дискретизирует сигнал до кривой. У цифровой модели к интермодуляции добавлены составляющие 200, 400, 600 и 800 Гц, которых у аналоговых приборов нет, и Кац делает вывод: модели без передискретизации дают алиасинг, сильнее всего при 44,1 кГц, а у аналоговых процессоров его нет при любой частоте дискретизации. Unisum работает с внутренней передискретизацией, поэтому частота проекта на его результат не влияет.
Опыт: два тона и отражения
Визуализация 1 повторяет тест на модели. Тоны 19 и 20 кГц по 0,25 (пик суммы −6 dBFS) проходят кривую , кривую со смещением рабочей точки или жёсткое ограничение. График показывает спектр выхода при выбранной : линии входных тонов, настоящих сочетаний и отражений различаются цветом, толщиной, пунктиром и метками, а крестики отмечают уровни, которые дала бы та же кривая в аналоговой цепи перед идеальным АЦП.
- входные тоны 19 и 20 кГц
- сочетания частот, как в аналоговой цепи
- отражения
- ×уровень в аналоговой цепи
Кривая «tanh, симметричная», входное усиление +6 дБ: пик суммы тонов на входе кривой 1,00. Передискретизация 1×: кривая работает при 44,1 кГц, всё выше 22,05 кГц отражается.
Отражения: суммарно −29,9 дБ, самое сильное — 14,9 кГц, −33,3 dBFS.
Интермодуляция, которую дала бы и аналоговая цепь: 18 кГц и 21 кГц — −33,3 dBFS; разностного тона 1 кГц нет: кривая симметрична.
Начальное состояние — с усилением +6 дБ при 44,1 кГц без передискретизации. Настоящие сочетания 18 и 21 кГц лежат на −33,3 dBFS, отражения 13,9 и 14,9 кГц — на том же уровне: это сочетания и того же третьего порядка. Суммарная мощность отражений −29,9 дБ относительно синусоиды 0 dBFS. Если выбрать кривую со смещением, появится разностный тон 1 кГц на −30 dBFS, и он останется при любой кратности передискретизации, а отражения второго порядка 4,1, 5,1 и 6,1 кГц исчезнут уже при 2×. При 48 кГц отражения встают на сетку 1 кГц, и отличить их от сочетаний можно только по крестикам.
Передискретизация
Прямой способ ослабить отражения — выполнить кривую на частоте в раз выше. Вход повышают до : между отсчётами вставляют нули и фильтром нижних частот (low-pass filter, LPF)фильтр нижних частот (low-pass filter, LPF) — Фильтр, который пропускает низкие частоты и ослабляет высокие. Перед дискретизацией помогает ограничить спектр входного сигнала. убирают всё выше исходной . Кривая работает при и снова создаёт бесконечный ряд составляющих, но теперь граница отражения выше. После кривой второй фильтр снова убирает всё выше исходной , и децимация (decimation)децимация (decimation) — Понижение частоты дискретизации: цифровой фильтр нижних частот ограничивает полосу, затем сохраняется каждый L-й отсчёт. оставляет каждый -й отсчёт (Reiss, McPherson, с. 198; Zölzer, §10.4, с. 350). Такую обработку называют передискретизациейпередискретизация (oversampling) — Работа с частотой дискретизации выше необходимой для полезной полосы. В АЦП уменьшает долю шума квантования в полезной полосе и смягчает требования к входному фильтру, в ЦАПе отодвигает спектральные копии, вокруг нелинейной обработки оставляет место для новых составляющих, чтобы они не отражались в полезную полосу. Новых сведений об исходном звуке не добавляет..
Составляющая частоты при отражается в , если лежит между и . В исходную полосу она попадёт, только если . Всё, что ниже границы из формулы (2), фильтр после кривой уберёт.
- кратность передискретизации: 2, 4, 8…;
- частота составляющей непрерывного выхода кривой, Гц.
При 44,1 кГц граница равна 66,15 кГц для 2×, 154,35 кГц для 4× и 330,75 кГц для 8×. У тонов 19 и 20 кГц сочетание порядка не выше кГц, поэтому 2× убирает все отражения до третьего порядка, 4× — до седьмого, 8× — до шестнадцатого. В опыте с при +6 дБ суммарный уровень отражений падает с −29,9 дБ до −52,6 при 2× и −96,8 при 4×, а при 8× опускается ниже −180 дБ. При 2× самое сильное отражение — 8,8 кГц от кГц пятого порядка, при 4× — 400 Гц от сочетания девятого порядка.
Насколько помогает каждое удвоение, зависит от того, как быстро убывают составляющие с ростом частоты (Zölzer, §10.4, с. 351). У гладкой они убывают быстро. У жёсткого ограничения излом формы волны даёт медленный спад: в опыте при +12 дБ и 44,1 кГц отражения остаются на −49 дБ даже при 8×. Поэтому мягкую кривую и передискретизацию применяют вместе: у мягкой кривой высокие порядки слабее, а повышенная частота уводит их за границу.
Частота проекта 96 кГц сама работает как двукратная передискретизация относительно 48 кГц: в опыте отражения ниже 20 кГц при 96 кГц лежат на −53 дБ против −30 при 48 кГц. Тот же сигнал на 96 кГц обходится всей цепочке плагинов вдвое большим числом отсчётов, а передискретизация внутри одного эффекта повышает частоту только там, где стоит кривая.
Фильтры и задержка
Выигрыш из опыта получен с идеальными фильтрами. Реальный фильтр интерполяции или децимации имеет переходную полосу и конечное подавление, и составляющие из переходной полосы проходят децимацию и отражаются. Pirkle рекомендует крутые фильтры с линейной фазой длиной от 256 до 1024 коэффициентов и напоминает, что любая обработка внутри передискретизации, например фильтр, рассчитывается для частоты , а не для (Pirkle, гл. 22, с. 624–626).
juce::dsp::Oversampling строит передискретизацию из ступеней по 2× с полуполосными фильтрами одного из двух видов. КИХ-фильтры (finite impulse response filter, FIR)КИХ-фильтр (finite impulse response filter, FIR) — Фильтр с конечной импульсной характеристикой: выход — взвешенная сумма текущего и нескольких прошлых входов, без обратной связи. Всегда устойчив; при симметричных коэффициентах задерживает все частоты одинаково. с равномерными пульсациями сохраняют фазу, но дают наибольшую задержку (latency)задержка (latency) — Время прохождения сигнала через тракт от входа до выхода. Включает буферизацию, драйвер, преобразователи и алгоритмы; длительность одного блока не равна полной задержке.; многофазные БИХ-фильтры (infinite impulse response filter, IIR)БИХ-фильтр (infinite impulse response filter, IIR) — Фильтр с бесконечной импульсной характеристикой: в разностное уравнение входят прошлые выходы. Даёт крутой спад малым числом коэффициентов, устойчив, только если все полюсы внутри единичной окружности. на фазовращателях задерживают сигнал меньше, но искажают фазу около частоты Найквиста (JUCE 9.0.3, juce_Oversampling.h). Задержку процессор сообщает хосту, чтобы тот сдвинул остальные дорожки, а исходный сигнал внутри плагина задерживают на ту же величину перед регулятором dry/wet (dry/wet, mix)регулятор dry/wet (dry/wet, mix) — Параметр эффекта, задающий соотношение исходного и обработанного сигнала на выходе: 0 % — только dry, 100 % — только wet. Коэффициенты промежуточных положений зависят от закона смешивания..
Таблица 3 — измерения того же теста с juce::dsp::Oversampling в режиме максимального качества, с целой задержкой. В режиме 2× результат совпадает с идеальной моделью. При 4× и 8× отражения упираются в фильтры: остаток около −92…−98 дБ лежит на 21,1 кГц. Это сочетание кГц седьмого порядка: оно не отражается при повышенной частоте, но попадает в переходную полосу фильтра децимации и после понижения частоты переходит в кГц. Для этого теста 8× поэтому почти ничего не добавляет к 4×.
| Кратность | Фильтры | Задержка, отсчётов | Отражения, дБ | Самое сильное отражение | Идеальная модель, дБ |
|---|---|---|---|---|---|
| 2× | КИХ | 49 | −52,7 | 8,8 кГц, −56,5 dBFS | −52,6 |
| 2× | БИХ | 4 | −52,6 | 8,8 кГц, −56,5 dBFS | −52,6 |
| 4× | КИХ | 61 | −91,9 | 21,1 кГц, −95,2 dBFS | −96,8 |
| 4× | БИХ | 6 | −94,3 | 21,1 кГц, −100,4 dBFS | −96,8 |
| 8× | КИХ | 65 | −93,5 | 21,1 кГц, −95,2 dBFS | ниже −180 |
| 8× | БИХ | 6 | −97,7 | 21,1 кГц, −100,3 dBFS | ниже −180 |
Без округления задержка КИХ-варианта 49, 59,5 и 64,25 отсчёта, БИХ-варианта — 3,14, 4,43 и 4,95. Хосту плагин сообщает целое число отсчётов, поэтому с useIntegerLatency = true класс добавляет в конце дробную задержку и сообщает целую. При 44,1 кГц 61 отсчёт — 1,4 мс. Кривая вычисляется в раз чаще, и к ней добавляются фильтры интерполяции и децимации каждой ступени в каждом канале.
Другие приёмы
Фильтр нижних частот перед кривой ослабляет высокие частоты входа, и они меньше участвуют в интермодуляции (Reiss, McPherson, с. 198). Меньше высоких составляющих на входе — меньше и сочетаний за . Фильтр после кривой отражения не уберёт: к этому моменту они уже в полосе.
При мастеринге рекомендуется многополосная и параллельная обработка. В многополосном компрессоре высокие частоты обрабатывает только верхняя полоса, и отражения от них не возникают в нижних. При параллельной обработке обработанный сигнал подмешивают тише исходного, и вместе с ним в смеси ослабляются его искажения.
Без повышения частоты обходится метод антипроизводной: для кривой без памяти он приближает обработку непрерывного сигнала (Zölzer, §10.4, с. 351). Как и PolyBLEP в осцилляторах, он получает поправку интегрированием.
Метод антипроизводной
Идеальное решение — восстановить непрерывный вход, применить к нему кривую, отфильтровать результат до и снова взять отсчёты. Метод антипроизводной (antiderivative antialiasing, ADAA) заменяет каждый шаг грубым приближением. Между соседними отсчётами вход считается отрезком прямой, а вместо фильтра выход усредняется за один период дискретизации (Zölzer, §10.4, с. 351–352). Среднее функции на отрезке выражается через её первообразную , и получается формула (3).
- вход кривой после усиления, ;
- первообразная кривой: ; для это ;
- порог, ниже которого разность соседних входов считается нулевой.
Числитель и знаменатель дроби при почти равных соседних входах стремятся к нулю, и дробь теряет точность. В пределе она равна ; Zölzer берёт среднее значений кривой в двух точках, потому что для прямой дробь даёт ровно его (Zölzer, §10.4, с. 352–353). Порог выбирают по точности чисел: во float вычитание теряет значащие цифры раньше, чем в double. Прямое вычисление std::log (std::cosh (u)) во float переполняется уже при около 89: превышает наибольшее число float. Поэтому вычисляют как .
Пример: соседние входы и . Обычная кривая выдаёт . Метод антипроизводной выдаёт — среднее на всём отрезке от 0,2 до 1.
Усреднение за период — фильтр нижних частот с задержкой на половину отсчёта. Для прямой формула (3) даёт , и амплитуда синусоиды частоты умножается на (Zölzer, §10.4, с. 353; вывод множителя — в разделе о комплексных амплитудах). На низких частотах множитель близок к 1, а у верхнего края полосы фильтр срезает и полезный сигнал: при 44,1 кГц для 19 кГц множитель равен 0,216, то есть −13,3 дБ. Составляющие, которые отражаются в низкие частоты, метод подавляет сильно, а те, что лежат сразу выше и отражаются чуть ниже неё, — всего примерно на 3 дБ (Zölzer, §10.4, с. 353).
На тесте 19 + 20 кГц это видно по модели опыта. При 44,1 кГц без передискретизации суммарные отражения падают с −29,9 до −44,2 дБ, но и тоны теряют 12,5 и 15,9 дБ, так что относительно сигнала выигрыша почти нет; отражение на 400 Гц ослабевает с −101,4 до −120,3 dBFS. С двукратной передискретизацией метод даёт −65,5 дБ против −52,6 у одной передискретизации, а тоны теряют около 2 дБ. При 4× отражения −118,1 дБ против −96,8, потеря тонов 0,4 дБ. Поэтому метод применяют вместе с невысокой передискретизацией: она отодвигает от слышимой полосы, а метод подавляет то, что всё же отразилось (Zölzer, §10.4, с. 354).
Вычислений метод добавляет немного: если вычисляется так же быстро, как , и сохраняется для следующего шага, нужны два вычитания и одно деление (Zölzer, §10.4, с. 352). Ограничение — только кривые без памяти; для схем с фильтрами и обратной связью внутри нелинейности он в простом виде не подходит (Zölzer, §10.4, с. 354).
Код на C++
Класс ниже выполняет насыщение при . Конструктор juce::dsp::Oversampling принимает число каналов, показатель степени двойки для кратности (2 — две ступени по 2×, то есть 4×), вид фильтров, режим максимального качества и признак целой задержки. Число каналов известно только в prepare, поэтому объект создаётся там. processSamplesUp возвращает блок при повышенной частоте, кривая меняет его на месте, processSamplesDown фильтрует результат и записывает его обратно в исходный блок (JUCE 9.0.3, juce_Oversampling.h).
// Насыщение tanh с передискретизацией: кривая работает при 4·fs, фильтры JUCE
// убирают продукты выше исходной fs/2 до возврата к fs.
class OversampledSaturator
{
public:
void prepare (const juce::dsp::ProcessSpec& spec)
{
oversampling = std::make_unique<juce::dsp::Oversampling<float>> (
spec.numChannels, factorLog2,
juce::dsp::Oversampling<float>::filterHalfBandPolyphaseIIR, true, true);
oversampling->initProcessing (spec.maximumBlockSize);
}
void reset() noexcept { oversampling->reset(); }
// Задержка в отсчётах исходной частоты: её сообщают хосту и учитывают в dry/wet.
int getLatencySamples() const noexcept
{
return static_cast<int> (oversampling->getLatencyInSamples());
}
void process (juce::dsp::AudioBlock<float> block) noexcept
{
auto up = oversampling->processSamplesUp (block);
for (size_t channel = 0; channel < up.getNumChannels(); ++channel)
for (auto& x : std::span { up.getChannelPointer (channel), up.getNumSamples() })
x = std::tanh (drive * x);
oversampling->processSamplesDown (block);
}
float drive = 2.0f; // входное усиление, +6 дБ
private:
static constexpr size_t factorLog2 = 2; // 2² = 4×
std::unique_ptr<juce::dsp::Oversampling<float>> oversampling;
};В процессоре плагина prepareToPlay вызывает prepare и reset, затем setLatencySamples (saturator.getLatencySamples()); processBlock передаёт в process блок буфера. Если у эффекта есть регулятор dry/wet, juce::dsp::DryWetMixer получает ту же задержку через setWetLatency, иначе смесь даст гребенчатую фильтрацию (comb filtering)гребенчатая фильтрация (comb filtering) — Ряд чередующихся подъёмов и провалов частотной характеристики, возникающий, например, при сложении сигнала с его задержанной копией. (статья о dry/wet). Внутри передискретизации всё, что зависит от частоты дискретизации, — фильтры, сглаживание параметров — настраивают на .
Код собран с JUCE 9.0.3 в консольном приложении с -Wall -Wextra -Wconversion -Wshadow без предупреждений. С БИХ-фильтрами и 4× класс сообщает задержку 6 отсчётов, как в таблице 3. Строка for (auto& x : std::span { … }) использует std::span (C++20) с выводом типа по аргументам конструктора (C++17).
Самопроверка
Тон 15 кГц проходит симметричную кривую при 48 кГц. Где окажется его третья гармоника и уберёт ли её двукратная передискретизация?
Третья гармоника — 45 кГц, выше кГц. Она отразится в кГц. При 2× граница из формулы (2) равна кГц: 45 кГц ниже неё, поэтому составляющая не отразится при 96 кГц, и фильтр перед децимацией её уберёт.
После теста 19 + 20 кГц при 44,1 кГц в спектре есть составляющие 1 кГц и 400 Гц. Какая из них говорит об отражениях?
400 Гц: настоящие сочетания тонов кратны 1 кГц, а 400 Гц — нет. Это отражение сочетания девятого порядка, например кГц, которое переходит в кГц. Составляющая 1 кГц — разность тонов, интермодуляция второго порядка, которую даёт и аналоговая асимметричная схема.
Почему при 48 кГц составляющая 1 кГц после симметричной tanh с двукратной передискретизацией не доказывает интермодуляцию?
Симметричная кривая не даёт сочетаний второго порядка, но при 96 кГц пятая гармоника 19 кГц, 95 кГц, отражается в кГц. 1 кГц ниже 24 кГц, фильтр децимации её пропускает. Отражение совпало с частотой разностного тона; отличить их помогает сравнение с выходом при большей кратности.
Плагин с передискретизацией 4× на КИХ-фильтрах не сообщает хосту задержку. Что услышит пользователь?
Обработанная дорожка отстанет от остальных на 61 отсчёт, около 1,4 мс при 44,1 кГц. Если внутри плагина исходный сигнал подмешивается без такой же задержки, сумма двух копий со сдвигом даёт гребенчатую фильтрацию: провалы на частотах, где копии в противофазе.
Источники
- Katz B. Analog Saved My Life: The Good, The Bad and The Ugly. в списке литературы → — тест двумя тонами 19 и 20 кГц, условия измерения, рисунки 1–4: цифровая модель LA-2A, McDSP APB-16, копия LA-2A от ADL, Pendulum OCL-2, Tone Projects Unisum при 96 и 44,1 кГц; описание звучания алиасинга, многополосная и параллельная обработка, оговорка о связи измерений со звучанием.
- Zölzer U. Digital Audio Signal Processing. §10.1, с. 342–343; §10.4: Aliasing and its Mitigation, с. 350–354. в списке литературы → — сочетания частот нескольких тонов, перестановка дискретизации и кривой без памяти, передискретизация с фильтрами интерполяции и децимации, зависимость от спада гармоник, метод антипроизводной: вывод, формулы (10.25)–(10.27), случай близких отсчётов, задержка на половину отсчёта, подавление вблизи fs/2, сочетание с передискретизацией, ограничение кривыми без памяти.
- Reiss J. D., McPherson A. P. Audio Effects: Theory, Implementation and Application. Гл. 8: Aliasing and Oversampling, Filtering, с. 197–198. в списке литературы → — бесконечный ряд гармоник, отсутствие проблемы в аналоговой схеме, отражения, которые нельзя отфильтровать, передискретизация вставкой нулей и фильтрами, фильтр нижних частот перед кривой против интермодуляции.
- Pirkle W. C. Designing Audio Effect Plugins in C++: For AAX, AU, and VST3 With DSP Theory. Гл. 22: Sample Rate Conversion, с. 624–626. в списке литературы → — интерполятор и дециматор вокруг нелинейной обработки, крутые фильтры с линейной фазой длиной 256–1024, расчёт обработки внутри передискретизации для частоты L·fs.
- JUCE 9.0.3. juce_Oversampling.h и juce_Oversampling.cpp — параметры конструктора, КИХ- и БИХ-фильтры полуполосных ступеней и их задержка,
initProcessing,processSamplesUp,processSamplesDown,getLatencyInSamplesи целая задержка. - JUCE 9.0.3. juce_DryWetMixer.h —
setWetLatency: задержка обработанного сигнала, на которую смеситель задерживает исходный.
Связи
Связи списком
Ссылается на
- АЦП и ЦАП
- Дискретизация: отсчёты, период и частота дискретизации
- Дисторшн и сатурация: передаточная кривая и гармоники
- Математика для аудио
- Микширование сигналов: усиление, фаза и запас уровня
- Осцилляторы синтезатора: формы, расстройка и саб-осциллятор
- Цифровые фильтры: импульсная характеристика, КИХ и БИХ
- Dry/wet и bypass: исходный и обработанный сигнал в плагине