Skip to main content

Dithering (часть 2)

В начале поста хочу рассказать о некоторой неточности, совершенной мной в предыдущем посте. А именно, "треугольно" распределенный шум берут в диапазоне $[-2\Delta, 2\Delta]$ (при этом мощность его будет $W = 2\Delta^{2}/3$). Придумали его не для того, чтобы звучать тише, а чтобы сделать первый и второй условные моменты функции ошибки $E[\epsilon^{m}|x] = \int_{-\infty}^{\infty} \epsilon^{m}p_{\epsilon|x}(\epsilon, x) d\epsilon$ независимыми от $x$. Привожу цитату из статьи Quantization and Dither: A Theoretical Survey авторов Stanley P.Lipshitz, Robert A. Wannamaker и John Vanderkooy:
Now consider a triangular-pdf dither of 2-LSB peak-to-peak amplitude resulting from the sum of two independent rectangular-pdf noises $v_{1}$ and $v_{2}$, each of 1-LSB peak-to-peak amplitude (...)
(...) so this dither renders both the first and second moments of the total error independent of $x$. The second moment of the total error is a constant $\Delta^{2}/4$ for all inputs, (...)
Ну что же, ошибки случаются ;-) Стоит заметить, что при применении такого шума тишина уже не будет звучать как тишина. Даю послушать:
Sine wave (triangular dither) 440 Hz (44100 Hz, 7 bit)

Теперь я расскажу о шумах, которые используются для dithering и не являются белыми (то есть их мощность распределена по используемым частотам неравномерно). Для этого ещё раз вернемся к фильтрам. Здесь я буду использовать такие фильтры, что результирующий сигнал будет иметь вид:
$f'_{n} = \sum_{i = 0}^{N-1} \phi_{i} f_{n-i}$

То есть фильтр для получения семпла в данный момент времени будет использовать этот семпл и $N-1$ прошлых семплов.

Используя уже известный нам инструмент (Фурье-преобразование), найдем АЧХ фильтра ($\omega_{ref}$ — частота дискретизации):

$\left|\Phi(\omega)\right|^{2} = \sum_{k=0}^{N-1} \phi_{k}^{2} + 2 \sum_{k=1}^{N-1} (\sum_{l=0}^{N - k - 1} \phi_{l}\phi_{l+k}) cos (\frac{2\pi}{\omega_{ref}}k\omega)$

при прохождении через данный фильтр мощность сигнала изменится в $A$ раз, где

$A = \frac{\int_{-\omega_{ref}/2}^{\omega_{ref}/2} \left|\Phi(\omega)\right|^{2} d\omega}{\omega_{ref}} = \sum_{k=0}^{N-1} \phi_{k}^{2}$

Возьмем фильтр, преобразующий сигнал по формуле $f'_{n} = f_{n-1} - f_{n}$ Его АЧХ равно (используя формулу выше):

$\left|\Phi(\omega)\right| = \sqrt {2 (1 + cos (\frac{2\pi}{\omega_{ref}}\omega))}$
Получается, что это такой вот high-pass фильтр

АЧХ high-pass фильтра. По горизонтали — частоты в долях $\omega_{ref}$
Теперь пропустим через него равномерно распределенный шум в диапазоне $[-\Delta, \Delta]$. Получится шум в диапазоне $[-2\Delta, 2\Delta]$ с мощностью $W = 2 \Delta^{2}/3$. По сути это тот же треугольно распределенный шум (так как две участвующих в фильтре случайные величины так и останутся независимыми), но со спектром как на картинке выше! Этот шум сконцентрирован больше в верхних частотах, которые человек слышит хуже.

На компьютере генератор такого шума можно реализовать как замыкание:

(defun get-filtered-triangle ()
  (let ((oldval 0))
    (lambda (magnitude)
      (let ((noise (uniform-noise magnitude)))
        (prog1 (- oldval noise)
          (setq oldval noise))))))

Вот так звучит этот шум (исходный сигнал тот же, что и в прошлом посте):
Sine wave (triangular high-pass dither) 440 Hz (44100 Hz, 7 bit)

Именно такой шум используется в Audacity в виде треугольного. В следующем посте я расскажу ещё про одну технику понижения слышимости шума — noise shaping.

Comments

Popular posts from this blog

Гладкая сшивка кусочно-постоянной функции.

Накануне мне понадобилось найти гладкую функцию, определенную на $\textbf{R}[a,c]$, равную единице на одном отрезке числовой оси, скажем, $[a, b-\epsilon]$ и нулю на другом, скажем $[b+\epsilon, c]$. Для того, чтобы гладко склеить эти два кусочка, я решил найти монотонно убывающий многочлен $f(x)$, равный $f(0) = 1$ и $f(1) = 0$, а потом "вставить" его в отрезок $[b-\epsilon, b+\epsilon]$. Для гладкости сшивки должны выполняться условия $f'(0) = f'(1) = 0$. Я решил пойти далее и положить $f^{(n)}(0) = f^{(n)}(1) = 0$ для всех $n = 1,2,\cdots,N$. То есть первые N производных должны быть равны нулю в т. $x = 0$ и $x = 1$. Понятно, что это легко сделать при наперед известном N, но как найти общую формулу? Я некоторое время промучился над этой задачей, пока не решил её следующим способом. Пусть искомая функция $f(x) = 1 + x^{N+1}L_{1}(x)$, где $L_{1}(x)$ — некий многочлен. Тогда у нас выполняется условие $f(0) = 1$ и $f^{(n)}(0) = 0$ (так как первая производная будет

Ресемплинг аудио.

В этом посте расскажу о ресемплинге аудио (в частности, о даунсемплинге), под чем я подразумеваю понижение частоты дискретизации, с которой был записан звук. Известно, что в компьютере непрерывный аудио сигнал представлен в виде семплов (по-русски, измерений), сделанных в равно отстоящие друг от друга промежутки времени. Например, если звук записан с частотой дискретизации 44.1 кГц, то за одну секунду было сделано 44100 семплов. Здесь я расскажу о том, как восстановить исходный непрерывный сигнал по взятым семплам и как выбирать и менять частоту семплирования (или, что то же самое, частоту дискретизации). Преобразование Фурье. Преобразованим Фурье $F(\xi)$ функции $f(x)$ называется следующая функция: $F(\xi) = \int_{-\infty}^{\infty} f(x) e^{-ix\xi}dx$ обратное преобразование определено как $f(x) = \frac{1}{2\pi}\int_{-\infty}^{\infty} F(\xi) e^{ix\xi}d\xi$ Вопрос о том, когда существует преобразование Фурье и обратимо ли оно (т.е. работает ли вторая формула), очень сложе

На что влияет размер (глубина) семпла?

В этом посте я разберу ещё одну характеристику представления аудио на компьютере — размер или глубину семпла. В теореме Шеннона, с которой мы ознакомились в первом посте, сказано, что семплы нужно брать с определенной частотой, чтобы восстановить исходный сигнал. Однако, в ней ничего не сказано о том, сколько памяти компьютера нужно выделить на один семпл. По сути  ней семплы — это обычные вещественные числа. В компьютере же семплы чаще всего представляются целыми числами в диапазоне от $-2^{n-1}$ до $2^{n-1}-1$ (целые числа со знаком), где $n$ — количество бит на один семпл (bps, bits per sample). С количеством бит на семпл связана другая величина — динамический диапазон (или отношение сигнал-шум, что в данном случае то же самое). Он измеряется в децибелах определяется так: $DR = 20 \lg (2^{n}) \approx 6 n$ Динамический диапазон показывает логарифм отношения самого сильного сигнала к самому слабому. Теперь, что будет, если мы выберем $n$ маленьким? Если взять синусоидальную волн