Я заинтересован в реализации аудиоредактора на C или C++ в Windows и Linux. Я не могу понять, как отображать осциллограмму достаточно быстро в полностью увеличенном виде. Я не ищу информацию о быстрых методах буфера кадров. Это вопрос об алгоритмах и структурах данных, чтобы эффективно определять, что отображать.Быстрое отображение формы волны в C/C++
Скажем, я хочу иметь возможность редактировать 5-канальный 48-КГц, 24-битный звук продолжительностью 2 часа. Это 5 гигабайт выборочных данных. Я хочу, чтобы можно было полностью уменьшить масштаб с одного пикселя на выборку, пока все данные образца не будут видны сразу. Я хочу, чтобы приложение чувствовало отзывчивость, даже на медленной машине, например, для аргументов, Atom 1 ГГц. Когда я говорю отзывчивый, я бы хотел, чтобы обновления графического интерфейса, как правило, возникали в течение 1/30 секунды ввода пользователя.
Наивная реализация будет сканировать каждый образец во всей форме волны при принятии решения о том, что делать для полностью уменьшенного представления - ему нужно найти максимальные и минимальные значения выборки для всех выборок, «покрытых» каждой шириной пикселя дисплей. Я написал простое приложение, чтобы проверить скорость этого подхода. Я тестировал с 1-часовым, моно, 16-битным, 44,1 кГц образцом на моем 3,5-ГГц Xeon в 2015 году. Это занимает 0,12 секунды. Это сотни раз слишком медленно.
Вы можете представить себе сохранение кеша с уменьшенными данными, но я не вижу, как избежать повторного вычисления всего кеша после большинства вставок или удалений. Похоже, что должен быть лучший способ.
Вот диаграмма, показывающая, что я хочу добиться:
Это как дисплей в большинстве имеющихся в настоящее время аудио редакторы работ. Пользователи, вероятно, ожидают такого поведения. Я тестировал с Audacity, и он работает таким образом (хотя он также показывает что-то вроде среднего для образцов в более светлом цвете). Он может обрабатывать произвольные вставки в большие звуки, казалось бы, мгновенно. Я не буду читать 75 мегабайт исходного кода, чтобы узнать, как он это делает.
EDIT:
Различные люди предложили схемы, которые включают только с учетом подмножества образцов при показе Уменьшенном вид. Я пришел к выводу, что я не хочу этого делать, потому что он теряет слишком много полезной информации. Например, в том числе все образцы важны, если вы ищете глюк в звуке, например, щелчок в конвертации винила. В худшем случае, если сбой всего один образец длинный, я все равно хочу получить гарантию, что он будет показан в полностью увеличенном виде.
Downsampling! Даунсамплинг! 1/30 секунды - мечта на старой машине, но вы можете получить хорошие результаты с лучшим оборудованием. Также помните, что графика и IO будут медленной частью, если вы не будете уделять много внимания. Несжатая волна может стремиться считывать по одному образцу каждый n (неточный, но отзывчивый), а затем в фоновом режиме чтения и уменьшения. Кэш после того, как все остальное сделано и примет, у вас не будет производительности, которую вы хотите. Это не ОДИН алгоритм или ОДНА структура данных, а куча методов, которые дают это * впечатление *. –
Что вы имеете в виду под понижающей дискретизацией? По тому, что я понимаю из этого термина, если я использую квадратную волну 20 КГц, я получаю сигнал постоянного тока. В то время как дисплей должен показывать полный сигнал амплитуды. Я вижу, что чтение 1 в каждых n образцах, чтобы получить неточное, но отзывчивое отображение, является возможным ответом на мой первоначальный вопрос. Кстати, я уже могу быстро нарисовать данные на экране. Я просто рисую все строки в растровое изображение в ОЗУ, а затем выкладываю все на экран. –
Любое объяснение голосов? –