Алгоритм у меня был следующий - я брал MP3 файл и загружал его в Audacity где сливал 2 канала стерео в один моно 44100 Гц и по максимуму усиливал без зашкаливания, чтобы динамический диапазон не растрачивался попусту - в таком виде я сохранял 8-bit signed RAW-файл с расширением .r8s который скармливался первой программке, которая усредняла отсчёты по два (чтобы получить 22050 Гц из 44100 Гц) и подменяла получившиеся уровни по следующей слегка логарифмической шкале:
и это всё сохранялось как unsigned 8-bit RAW-файл 22050 Гц с расширением .r8u (тут только 4 уровня сигнала было, но его всё ещё можно было проиграть в Audacity как показано на видео выше), ну и далее с помощью ещё одной программки происходило сжатие в .bin в описанном в начале топика формате TWOBITS:
Code:
\ TWOBITS FORMAT: \ ONE BYTE PLAYS 3 DIFFERENT 2-BIT SAMPLES \ OR MAXIMUM 50 IDENTICAL 2-BIT SAMPLES \ 00000000 - END OF STREAM \ 0NNNNNBB - OUTPUT BB NNNNN+3 TIMES \ 10NNNNBB - OUTPUT BB NNNN+35 TIMES \ 11DDCCBB - OUTPUT BB THEN CC THEN DD
Shaos wrote:
Shaos wrote:
Аналогичным образом можно сжимать однобитный сигнал:
Code:
00000000 - конец стрима 0nnnnnnb - повторить b nnnnnn+7 раз (т.е. от 7 до 70) 1gfedcba - вывести подряд биты a,b,c,d,e,f,g
Если уходить на большее кол-во битов, то надо сразу идти на 4, т.к. 3 бита звучат не намного лучше 2-х - я просимулировал в Audacity. Плюс к этому из 16 возможных уровней при 4-х битах можно задействовать только 15 (0001...1111), чтобы иметь уровень нуля посередине (1000), а минимальное значение (0000) можно использовать как команду размножения: 0000bbbb nnnnnnnn - что будет значить повторить bbbb nnnnnnnn раз (от 1 до 256), а 00000000 всё также будет обозначать конец стрима...
Ну или 0000nnnn будет означать повторить последний уровень nnnn+3 раз (от 3 до 18)
Я тут аккуратно поработал с 3-х битным вариантом и получил более-менее приемлемый результат, который заведомо лучше 2-х битного (но подозреваю, что сжимается оно сильно хуже)
...
Сжимать его можно по алгоритму аналогичному TWOBITS:
Code:
00000xxx - конец потока 0nnnnBBB - повторить BBB nnnn+2 раз (3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) 10nnnBBB - повторить BBB nnn*2+18 раз (18,20,22,24,26,28,30,32) 11CCCBBB - вывести BBB потом CCC
Я тут второе число с шагом 2 сделал - так большее покрытие будет, а нечётные значения можно догнать одиночной посылкой того же значения. Надо прикинуть какие закономерности там ещё есть кроме повторения - может удастся что-то "поумнее" сделать - типа минус 1 и продолжить N раз или плюс 1 и продолжить N раз...
Эти форматы достаточно простые - их даже аппаратно можно в реальном времени разжимать, причём на мелкой логике
Users browsing this forum: Bing [Bot] and 3 guests
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum