|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.02.2013, 14:58 | #21 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,285
|
Наработки
(интересная тема) Файл загружается при запуске. Самый верхний ползунок рисует на форме волну (перевернутую). Флажок Levels активирует просмотр нулевого уровня и уровня фильтрации, который задается ползунком около надписи level (сам уровень фильтрации задается в константах процедуры преобразования). Самый правый ползунок задает шаг для кнопок button2 и button3, которые позволяют более точно прокручивать волну. Button1 сохраняет в файл log расшифрованные единички и нули. Работает не идеально (скорее очень плохо). Файл должен начинаться с единицы (если в начале будет шум, как было в исходном mp3 файле, то не расшифрует).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
06.02.2013, 18:55 | #22 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Ну это так - всякое бывает.
Мне точно не известно, какой именно формы должны быть сигналы, но, судя по приведенным иллюстрациям вполне может оказаться важным, между какими именно точками кривой измерять длительность периода. Варианта здесь, минимум, 4: 1. При смене знака сигнала (т.е. при проходе через 0) с "-" на "+" - по фронту. 2. При смене знака сигнала (т.е. при проходе через 0) с "+" на "-" - по спаду. 3. По максимуму (изменению знака производной с "+" на "-"). 4. По минимуму (изменению знака производной с "-" на "+"). При этом следует иметь в виду, что устройства звукозаписи не обязаны сохранять фазу сигнала (т.е. сигнал в процессе записи может быть инвертирован). А для нас это может оказаться важным. Например если мы будем пытаться измерить промежуток между 3-м и 4-м максимумами на рис. в после №13, то вместо одинарной или двойной длины получим полуторную. Такую ситуацию нужно либо специально обрабатывать, либо в принципе не допускать (для чего сигнал может понадобиться инвертировать). В общем, в диагностических целях советую, если некоторый файл считывается с большим количеством ошибок, попытаться инвертировать его (изменить фазу на 180 градусов или умножить каждый отсчет на "-1"), после чего снова пропустить через свою программу. Если распознавание существенно улучшится, будет понятно, что следует делать. |
02.03.2013, 19:56 | #23 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Тут еще в другом проблема - вот допустим я начинаю идти по восходящей, то есть с минимума (ну от 0) иду вверх, пока последующее число больше предыдущего, как только оно становится меньше предыдущего - значит идет спад и я иду до числа, которое окажется больше предыдушего. Как оно поменяется - значит я нашел "период". Но косяк в том, что форма сигнала не всегда идеальная синусойда, и бывает так что возникает помеха, число может оказаться меньше предудущего так и не добравшись до верхней границы.
Блин не знаю, с одной стороны вроде простая задача, а с другой попал в ступор. По изменению полярности не получается (получается, но с подгонкой параметров под каждый файл, и не на всех файлах). Точно определить периоды по максиму/минимум - не получается ибо помехи. Не знаю, может быть какие-то алгоритмы FFT или как там оно? Мне это не поможет? Я просто более "системный" программист нежели прикладной, и с обработкой звуку сталкиваюсь второй раз в жизни. Первый раз был вывод звука на SB под дос.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
02.03.2013, 20:48 | #24 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,285
|
Вы посмотрели мой кривой код?
У меня используется порог, после которого считается, что мы попали в область, достаточно далекую от нуля, чтобы считать ее сигналом. Сравнивать соседние действительно опасно, или предварительно можно "сгладить" сигнал усреднением, хотя может и не поможет. Все вышесказанное, мое имхо, так как еще учусь Ждем советов профи.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
02.03.2013, 23:50 | #25 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Tronix, во-первых, нахождение максимума и нахождение локального максимума - разные задачи.
Перед началом информационной части в сигнале идет ракорд, по которому можно оценить параметры сигнала, т.е. расстояние между максимумами (если за основы мы берем именно максимум) в случае как "0", так и "1", а также оценочное значение амплитуды. Зная точку предыдущего максимума Вы с хорошей точностью можете предсказать две возможные точки появления следующего максимума - одну в случае, если записан "0", а другую - в случае "1". Анализируйте окрестность первой точки проверяйте, есть ли там максимум примерно ожидаемой амплитуды. Если не встретите - ищите его во второй точке. Не нужно анализировать все локальные максимумы на протяжении всего сигнала. Это первое. Можно зайти и с другого конца: Делаем вид, что пропускаем сигнал через систему ФНЧ и компараторов (обычно достаточно по одному либо одного компаратора с гистерезисом (триггер Шмидта)), после которой у нас должен получиться прямоугольный сигнал, в котором для декодирования используются длительности положительных или отрицательных импульсов. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос про запись данных в файл. | 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 |