Этот пост будет лишним доказательством того, что файлы типа 96kHz/24bps не несут в себе никакой дополнительной информации по сравнению с обычными (44.1kHz/16bps).
Мы возьмём файл с частотой дискретизации 96kHz и на фоне шума запишем в него секретное сообщение (которое, правда, сможет прослушать любой с соответствующей программой, так что никакого "реального" шифрования тут не происходит).
Работать это будет по принципу амплитудной модуляции, AM. Судя по википедии, видов амплитудной модуляции три — "обычная", double-sideband suppressed-carrier и single-sideband suppressed-carrier. О том, что это такое, подробно ниже.
Предположим, у нас есть входной сигнал — синусоида с частотой колебания $\omega_{s}$. Мы хотим замодулировать её с частотой $\omega_{c} > \omega_{s}$. Делаем это так:
$f(t) = (1 + \sin \omega_{s}t) \sin \omega_{c}t$
Вот график нашего замодулированного сигнала:
Перемножим синусы в смодулированном сигнале:
$f(t) = \sin (\omega_{c} t) + 1/2 (\cos (\omega_{c} - \omega_{s})t - \cos (\omega_{c} + \omega_{s})t)$
Видим, что тут есть колебания на трех частотах — одно на несущей и два на несущей плюс-минус частота сигнала. Это "классическая" амплитудная модуляция, такой сигнал легко демодулировать обратно с помощью так называемого детектора огибающей (envelope detector). Смысл работы этого детектора — нахождение огибающей сигнала, т.е. зеленой линии на картинке снизу. Эта огибающая — и есть наш сигнал плюс некое постоянное значение.
Этот детектор можно построить на обычном диоде и конденсаторе. В каком-то номере журнала "Радио" даже была статья, как сделать радио из куска проволоки, диода, конденсатора и высокоомного наушника. Такому радио не нужно дополнительное питание, он использует как раз мощность волны-носителя.
Более сложная схема для реализации в железе, но простая для нас — DSB-SC (double-sideband suppressed-carrier). В ней колебания на частоте волны-носителя приглушены или убраны из смодулированного сигнала, т.е. модулируется он так:
$f(t) = \sin \omega_{s}t \sin \omega_{c}t = 1/2 (\cos (\omega_{c} - \omega_{s})t - \cos (\omega_{c} + \omega_{s})t)$
Для демодуляции этого сигнала воссоздаются колебания с несущей частотой и умножаются на смодулированный сигнал:
$f(t) = 1/2 (\cos (\omega_{c} - \omega_{s})t - \cos (\omega_{c} + \omega_{s})t) \sin \omega_{c} t = -1/2 \sin \omega_{s} t + 1/4 (\sin (2\omega_{c} - \omega_{s})t - \sin (2\omega_{c} + \omega_{s})t)$
Мы видим, что таким образом у нас есть наш исходный сигнал (с множителем $-1/2$) и сигналы с высокими частотами (около $2\omega_{c}$), которые мы можем просто отфильтровать.
Теперь к изначальной теме встраивания сообщения в аудио файл. Допустим, что самый высокий тон человеческой речи не превышает 5 кГц, и смодулируем сообщение с частотой 30 кГц по схеме DSB-SC. Тогда замодулированный сигнал будет лежать в диапазоне частот 25-35 кГц. Нижний предел находится выше предела восприятия человека, а верхний предел меньше половинного значения частота дискретизации (48 кГц). Таким образом, файл с частотой дискретизации 96 кГц может хранить одновременно и аудио, и некий секретный голосовой сигнал.
Вот реализация идеи на SuperCollider:
Вот пример файла, закодированного таким образом:
Секретное сообщение
В доказательство того, что я не обманываю, привожу спектрограмму:
Да, разумеется, сообщение можно прятать в чем угодно, а не только в шуме. Просто ради демонстрации я выбрал шум.
Мы возьмём файл с частотой дискретизации 96kHz и на фоне шума запишем в него секретное сообщение (которое, правда, сможет прослушать любой с соответствующей программой, так что никакого "реального" шифрования тут не происходит).
Работать это будет по принципу амплитудной модуляции, AM. Судя по википедии, видов амплитудной модуляции три — "обычная", double-sideband suppressed-carrier и single-sideband suppressed-carrier. О том, что это такое, подробно ниже.
Предположим, у нас есть входной сигнал — синусоида с частотой колебания $\omega_{s}$. Мы хотим замодулировать её с частотой $\omega_{c} > \omega_{s}$. Делаем это так:
$f(t) = (1 + \sin \omega_{s}t) \sin \omega_{c}t$
Вот график нашего замодулированного сигнала:
Синусоида $\sin t$, смодулированная с несущим сигналом $\sin 10 t$. |
Перемножим синусы в смодулированном сигнале:
$f(t) = \sin (\omega_{c} t) + 1/2 (\cos (\omega_{c} - \omega_{s})t - \cos (\omega_{c} + \omega_{s})t)$
Видим, что тут есть колебания на трех частотах — одно на несущей и два на несущей плюс-минус частота сигнала. Это "классическая" амплитудная модуляция, такой сигнал легко демодулировать обратно с помощью так называемого детектора огибающей (envelope detector). Смысл работы этого детектора — нахождение огибающей сигнала, т.е. зеленой линии на картинке снизу. Эта огибающая — и есть наш сигнал плюс некое постоянное значение.
Этот детектор можно построить на обычном диоде и конденсаторе. В каком-то номере журнала "Радио" даже была статья, как сделать радио из куска проволоки, диода, конденсатора и высокоомного наушника. Такому радио не нужно дополнительное питание, он использует как раз мощность волны-носителя.
Более сложная схема для реализации в железе, но простая для нас — DSB-SC (double-sideband suppressed-carrier). В ней колебания на частоте волны-носителя приглушены или убраны из смодулированного сигнала, т.е. модулируется он так:
$f(t) = \sin \omega_{s}t \sin \omega_{c}t = 1/2 (\cos (\omega_{c} - \omega_{s})t - \cos (\omega_{c} + \omega_{s})t)$
Для демодуляции этого сигнала воссоздаются колебания с несущей частотой и умножаются на смодулированный сигнал:
$f(t) = 1/2 (\cos (\omega_{c} - \omega_{s})t - \cos (\omega_{c} + \omega_{s})t) \sin \omega_{c} t = -1/2 \sin \omega_{s} t + 1/4 (\sin (2\omega_{c} - \omega_{s})t - \sin (2\omega_{c} + \omega_{s})t)$
Мы видим, что таким образом у нас есть наш исходный сигнал (с множителем $-1/2$) и сигналы с высокими частотами (около $2\omega_{c}$), которые мы можем просто отфильтровать.
Теперь к изначальной теме встраивания сообщения в аудио файл. Допустим, что самый высокий тон человеческой речи не превышает 5 кГц, и смодулируем сообщение с частотой 30 кГц по схеме DSB-SC. Тогда замодулированный сигнал будет лежать в диапазоне частот 25-35 кГц. Нижний предел находится выше предела восприятия человека, а верхний предел меньше половинного значения частота дискретизации (48 кГц). Таким образом, файл с частотой дискретизации 96 кГц может хранить одновременно и аудио, и некий секретный голосовой сигнал.
Вот реализация идеи на SuperCollider:
// Подготовка записи
s.recChannels = 2
s.recHeaderFormat = "WAV"
s.recSampleFormat = "int16"
// Модуляция. Записываем 10 секунд секретного сообщения на фоне обычного шума
(
{
var noise = LPF.ar (WhiteNoise.ar (0.8)),
// Модулируем сигнал с микрофона с частотой 30 кГц
signal = SinOsc.ar (30000, mul: 0.2) * SoundIn.ar ([0,1]);
noise + signal; // Складываем полезный сигнал и шум
}.play;
s.record ("~/test2/hiddenmessage.wav".standardizePath);
SystemClock.sched (10.0, {s.stopRecording; s.freeAll; nil}) // Запишем 10 секунд сообщения
)
// Демодуляция
(
var buf = Buffer.read (s, "~/test2/hiddenmessage.wav".standardizePath);
{
10 * BLowPass4.ar (SinOsc.ar (30000) *
BHiPass4.ar (PlayBuf.ar (2, buf, doneAction: 2), 25000), 5000)
}.play
)
Вот пример файла, закодированного таким образом:
Секретное сообщение
В доказательство того, что я не обманываю, привожу спектрограмму:
Да, разумеется, сообщение можно прятать в чем угодно, а не только в шуме. Просто ради демонстрации я выбрал шум.
Comments
Post a Comment