Введение в процесс автоматического декода дампов

Forum Library

Professional
Messages
1,168
Reputation
195
Reaction score
483
Points
83
Содержание:
1. Краткая структура WAV-файла;
2. Обработка дискретной информации;
3. Поиск дампов;
4. Декодирование. Теория;

Структура WAV-файла (Windows PCM).
Звуковой файл можно четко разделить на две части. В первой части хранится информация о заголовке файла, во второй части хранятся непосредственно звуковые данные.
В заголовке хранится информация о размере файла, о количестве каналов (моно, стерео и т.д.), о частоте дискретизации и пр. Звуковые данные хранятся в виде дискрет. Для извлечения дискрет есть программа WAV-TXT, которая входит в известный экселевский пакет по декоду.



В первом скриншоте показан пример аудиофайла с реальным дампом открытого в программе Cool Edit pro



Во втором скриншоте показан пример аудиофайла с приближением. На данном скриншоте можно увидеть точки. Каждая точка это и есть дискрета, из которой построен данный график.

Code:
55, 58, 63, 65, 69, 73, 76, 79, 82, 85, 88, 90, 92, 93, 93, 93, 91, 86, 80
72, 63, 52, 38, 27, 15, 6, 0, 1, 4, 14, 26, 44, 62, 81,101,120,136,151
165,176,187,196,205,213,220,226,231,234,235,234,233,229,225,221,216,211,206
202,196,193,190,186,182,179,177,174,172,170,167,165,165,164,166,168,172,177
185,195,205,216,227,238,246,252,255,254,249,240,227,211,192,172,151,131,110
94, 79, 66, 56, 50, 44, 42, 39, 37, 37, 36, 35, 35, 35, 35, 35, 36, 36, 38
39, 41, 45, 47, 53, 57, 63, 68, 74, 78, 82, 86, 88, 89, 91, 92, 93, 93, 92
90, 86, 80, 72, 62, 50, 37, 27, 18, 13, 12, 16, 25, 40, 58, 78, 99,121,139
158,173,187,198,209,218,228,235,242,246,249,250,249,249,248,245,244,246,247
Здесь показан пример дискрет, взятых из реального аудиофайла.

Обработка дискретной информации.​

Перед процессом декодирования необходимо подготовить данные для более удобной обработки. Подготовка данных будет состоять из нескольких этапов:
1. Узнать размер аудиоданных из заголовочной информации аудиофайла и, при большом размере, необходимо выполнить поэтапную загрузку в память ПК, т.е. разбить аудиоданные на несколько частей. Вычислить необходимое количество частей можно по формуле:

ChankSize - общий размер аудиоданных
buf - размер аудиоданных, который ПК сможет загрузить для дальнейшей обработки
part - количество разбиваемых частей

part = ChankSize / buf

После этого необходимо отбросить дробную часть и мы получим нужное количество частей.

2. Определить минимальный и максимальный порог фонового шума для дальнейшего его отбрасывания при процессе декодирования и автоматического поиска дампов.

[ПСЕВДОКОД]
MIN = 255
MAX = 0

ЦИКЛ i от 0 до buf
ЕСЛИ MIN > data ТОГДА MIN=data
ЕСЛИ MAX < data ТОГДА MAX=data
[/ПСЕВДОКОД]

3. Выполить поэтапную загрузку в память

[ПСЕВДОКОД]
Переменные:
ChankSize - общий размер аудиоданных
buf - размер аудиоданных, который ПК сможет загрузить для дальнейшей обработки
PART - количество разбиваемых частей

ЕСЛИ buf > ChankSize ТОГДА (загрузить все данные)
В ПРОТИВНОМ СЛУЧАЕ (циклично загрузить данные PART раз)
[/ПСЕВДОКОД]

Поиск дампов.
При поиске дампов необходимо учитывать несколько важных параметров: минимальный и максимальный порог фонового шума, минимальная длина найденных данных (дампа), минимальная длина пустых данных (фонового шума), счетчик фонового шума, счетчик найденных данных.

[ПСЕВДОКОД]
Переменные:
ChankSize - общий размер аудиоданных
buf - размер аудиоданных, который ПК сможет загрузить для дальнейшей обработки
PART - количество разбиваемых частей
MIN,MAX - пороги фонового шума
data - данные
count - счетчик фонового шума
countdump - счетчик найденных данных
lengthdump - минимальная длина дампа

ЦИКЛ i от 0 до PART
ЕСЛИ (data > min) и (data < max) ТОГДА count = count + 1 В ПРОТИВНОМ СЛУЧАЕ count = 0
ЕСЛИ count < 300 ТОГДА
countdump = countdump + 1
ЕСЛИ countdump > lengthdump ТОГДА
(копируем найденные данные в новую переменную для дальнейшего декодирования)
[/ПСЕВДОКОД]

Декодирование. Теория.​

Процесс декодирования отлично описан в экселевской документации(у кого нет могу дать ссылки на скачивание) и подробно описывать его нет смысла. Вкратце декод состоит из трех этапов:
- определение тайминга;
- определение бит;
- декодирование битовой(двоичной) информации.

Тайминг - это количество дискрет за один полупериод.



Для более подробного понимания тайминга на картинке показан полупериод, полный период, показаны нули и единицы. Т.е. из этого следует, что полупериод нуля в два раза больше полупериода единицы. Если сложить два полупериода единицы, тогда получим примерный полупериод нуля.
Процесс определения бит из таймингов очень прост. Нам необходимо вычислить ноль - это (как мы выяснили выше) число, примерно в два раза больше полупериода единицы. Если следующее число после нуля в два раза меньше, то и следующее число после меньшего должно равняться приблизительно такому же значению (пиздец путаница, сам бы нихрена не понял если бы читал).
Можно вычислять биты по-другому. Необходимо вычислить длину нуля и "двигаться" вперед по графику приблизительно с таким же промежутком. Эта длина показана на графике синими точками. Если между этими точками был полупериод, значит это ноль, если был полный период значит единица.
Так же в начале и в конце дампа идут синхронизирующие нули, которые никак не относятся к дампу, а служат только лишь для вычисления длины полупериода или полного периода (показана синими точками).
Если будут вопросы, относительно вычисления тайминга и бит расскажу более подробно.
После получения бит остается сделать декодирование по графику.



По данному принципу работает мое автоматизированное ПО для декода.
В целом все. Если аудитория проявит интерес, то готов более подробно углубиться в каждый из этапов автоматического декодирования с реальными примерами исходников. Отвечу на все ваши вопросы в данном топике.
 
Top