Алгоритм рисования вот такой http://www.learner.org/jnorth/images/graphics/s/RwOkaleeWaveform.gif хреновины.
Подсказывание должно происходить на условиях допустимости использования подсказанного в коммерческом или опенсорсном продукте (-;
Вопрос в том, как правильно и быстро нарисовать waveform, запихав на один экран 2-часовой файл.
Есть собственная реализация алгоритма, которая работает тормознее, чем Audacity. Читать чужие исходники, например Audacity - это нужно вемя и мозг, пока с этим проблемы. Вчера попробовал немного... Я догадываюсь, что у audacity похожий алгоритм на мой, просто у audacity ступенчатый зум по времени и каждую следующую степень зума он вычисляет на основе данных от предыдущей, а не с нуля, как у меня.
Мой алгоритм. 1) для данного уровня «временного масштаба» понять, сколько семплов сигнала влезает в один горизонтальный пиксель изображения.
2) Например 1024 семпла. Тогда читаем входной сигнал кусками по 1024 семпла.
3) Вычисляем для очередного «пакета» (1024 семпла) минимальное и максимальное значение амплитуды семпла. Эта пара значений будет основой для рисования одной вертикальной линии, которая графически описывает содержимое одного пакета в 1024 семплов. Примитивная идея в том, что если в течении 1024 семплов сигнал как-то мотало между -500 и +1500, то line(x, -500, x, +1500) (с масштабирующими коэффициентами) опишет этот кусок сигнала.
Масштаба, где в одном пикселе меньше 1 семпла у меня нет. В Audacity он есть, но это просто отдельный режим рисования с кружочками вокруг каждой точки и возможностью эти кружочки подвигать.
Если временной масштаб таков, что в одном пикселе - 1 или 2 семпла, то могут возникать визуальные разрывы. Рассмотрим простой случай - 1 семпл на пиксель. Вышеописанный алгоритм даст для каждого «пакета» (куда входит 1 семпл) такую пару min+max, где оба значения равны - точка, семпл-то один. Эти точки нужно бы соединить чем-то типа lineto. Я выполняю такой «пост-процессинг», где для каждого «пакета» min+max корректируются так, чтобы минимумы и максимумы соседних пакетов «встречались» на половине дистанции между ними - спасает.
Нагрузка на GUI всегда одинаковая - рисуется постоянное количество линий, определяемое шириной окна. Нормальные люди вообще кешируют этот график в виде цепочки прямоугольных pixmap-ов, чтобы не издеваться над графической библиотекой, вызывая line().
Нагрузка на процессор - в процедуре суммирования. Когда в одном горизонтальном пикселе картинки становится дофига семплов, начинается дофига работы по поиску минимумов и максимумов. Я догадываюсь, что каждый слой можно закешировать и считать соседние слои на базе соседних, но у меня временной масштаб не дискретный - нет слоёв. Когда в Audacity открываешь часовой файл в один экран и начинаешь его зумить по времени - всё летает, у меня вычисление картинки для нового временного масштаба гораздо тормознее.
Обсудите (-;