Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 14:58   #21
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Наработки
(интересная тема)
Файл загружается при запуске.
Самый верхний ползунок рисует на форме волну (перевернутую).
Флажок Levels активирует просмотр нулевого уровня и уровня фильтрации, который задается ползунком около надписи level (сам уровень фильтрации задается в константах процедуры преобразования).
Самый правый ползунок задает шаг для кнопок button2 и button3, которые позволяют более точно прокручивать волну.
Button1 сохраняет в файл log расшифрованные единички и нули.
Работает не идеально (скорее очень плохо).
Файл должен начинаться с единицы (если в начале будет шум, как было в исходном mp3 файле, то не расшифрует).
Вложения
Тип файла: zip decoder.zip (6.87 Мб, 16 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.02.2013, 18:55   #22
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Ну это так - всякое бывает.
Мне точно не известно, какой именно формы должны быть сигналы, но, судя по приведенным иллюстрациям вполне может оказаться важным, между какими именно точками кривой измерять длительность периода.
Варианта здесь, минимум, 4:
1. При смене знака сигнала (т.е. при проходе через 0) с "-" на "+" - по фронту.
2. При смене знака сигнала (т.е. при проходе через 0) с "+" на "-" - по спаду.
3. По максимуму (изменению знака производной с "+" на "-").
4. По минимуму (изменению знака производной с "-" на "+").
При этом следует иметь в виду, что устройства звукозаписи не обязаны сохранять фазу сигнала (т.е. сигнал в процессе записи может быть инвертирован). А для нас это может оказаться важным. Например если мы будем пытаться измерить промежуток между 3-м и 4-м максимумами на рис. в после №13, то вместо одинарной или двойной длины получим полуторную. Такую ситуацию нужно либо специально обрабатывать, либо в принципе не допускать (для чего сигнал может понадобиться инвертировать).

В общем, в диагностических целях советую, если некоторый файл считывается с большим количеством ошибок, попытаться инвертировать его (изменить фазу на 180 градусов или умножить каждый отсчет на "-1"), после чего снова пропустить через свою программу. Если распознавание существенно улучшится, будет понятно, что следует делать.
s-andriano вне форума Ответить с цитированием
Старый 02.03.2013, 19:56   #23
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

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

Блин не знаю, с одной стороны вроде простая задача, а с другой попал в ступор. По изменению полярности не получается (получается, но с подгонкой параметров под каждый файл, и не на всех файлах). Точно определить периоды по максиму/минимум - не получается ибо помехи. Не знаю, может быть какие-то алгоритмы FFT или как там оно? Мне это не поможет?

Я просто более "системный" программист нежели прикладной, и с обработкой звуку сталкиваюсь второй раз в жизни. Первый раз был вывод звука на SB под дос.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 02.03.2013, 20:48   #24
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вы посмотрели мой кривой код?
У меня используется порог, после которого считается, что мы попали в область, достаточно далекую от нуля, чтобы считать ее сигналом.
Сравнивать соседние действительно опасно, или предварительно можно "сгладить" сигнал усреднением, хотя может и не поможет.

Все вышесказанное, мое имхо, так как еще учусь
Ждем советов профи.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 02.03.2013, 23:50   #25
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Tronix, во-первых, нахождение максимума и нахождение локального максимума - разные задачи.
Перед началом информационной части в сигнале идет ракорд, по которому можно оценить параметры сигнала, т.е. расстояние между максимумами (если за основы мы берем именно максимум) в случае как "0", так и "1", а также оценочное значение амплитуды.
Зная точку предыдущего максимума Вы с хорошей точностью можете предсказать две возможные точки появления следующего максимума - одну в случае, если записан "0", а другую - в случае "1".
Анализируйте окрестность первой точки проверяйте, есть ли там максимум примерно ожидаемой амплитуды. Если не встретите - ищите его во второй точке.
Не нужно анализировать все локальные максимумы на протяжении всего сигнала.

Это первое.
Можно зайти и с другого конца:

Делаем вид, что пропускаем сигнал через систему ФНЧ и компараторов (обычно достаточно по одному либо одного компаратора с гистерезисом (триггер Шмидта)), после которой у нас должен получиться прямоугольный сигнал, в котором для декодирования используются длительности положительных или отрицательных импульсов.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про запись данных в файл. pinkiller Общие вопросы C/C++ 4 05.01.2012 15:57
Вопрос про MaskEdit и воиспроизведение *.wav Deis C++ Builder 4 20.04.2011 20:07
Вопрос про воиспроизведение *.wav Deis Помощь студентам 3 18.03.2011 17:43
Вопрос про MaskEdit и воиспроизведение *.wav в C++ Builder 6 Deis Помощь студентам 0 11.03.2011 22:33
Вопрос про обработку исключений Ok-ei Общие вопросы C/C++ 17 19.08.2009 22:49