Щелчки многопоточного синтезатора волновых таблиц. Это вызвано разрывами чтения?

В настоящее время я работаю над очень простым синтезатором с волновой таблицей. Я постараюсь дать понятный обзор.

У меня есть один поисковый сигнал с 4096 точками, который сэмплируется аудиопотоком. Однако, как правило, один осциллятор имеет несколько волновых форм, которые можно трансформировать с помощью параметра position. Например, возьмем две синусоиды, вторая из которых имеет половину периода первой. Когда мы воспроизведем их на frequency = 440Hz и position = 0.5, мы услышим два одинаково громких тона на частотах 440 Гц и 880 Гц. Вот ссылка на аудио (см. примечание 2).

Частотный спектр синусоидальных волн 440 Гц и 880 Гц

Из соображений производительности я генерирую таблицу поиска в другом потоке всякий раз, когда изменяется параметр позиции. И в этом моя проблема. Даже когда я не меняю положение таблицы и просто периодически генерирую свою таблицу поиска, я получаю странные, непредсказуемые сбои. Поскольку аудиоданные в таблице при этом не меняются, могу объяснить это только разрывными считываниями. Это правильно? И если да, то как мне обойти это? Нужно ли использовать двойной буфер с атомарной подменой указателя после завершения генерации данных?

Тот же спектр частот, но с глюками

Опять же, вот аудио для этой записи (см. примечание 2). Также немного данных осциллографа:

Изображение осциллографа, на котором виден такой глюк

Примечание 1. Заполнение моей таблицы поиска занимает ~50,000ns без оптимизации и ~10,000ns с оптимизацией. Но глюки вроде случаются с одинаковой вероятностью.

Примечание 2. Веб-сайт, на который я загрузил аудио, похоже, содержит некоторые странные гармоники, которые не слышны в моем видео. Просто чтобы вы знали.


person schroffl    schedule 18.03.2020    source источник


Ответы (1)


Нашел! Я случайно установил старую позицию сканера после создания таблицы поиска. Если последнее занимало слишком много времени, моя позиция в основном сбрасывалась на несколько микросекунд раньше, что объясняет визуальную неудачу на осциллографе.

person schroffl    schedule 18.03.2020
comment
Я пытался сделать это вчера, но Stackoverflow сказал, что мне нужно подождать еще два дня, прежде чем мне разрешат :) - person schroffl; 19.03.2020
comment
@PhilFreihofner Готово - person schroffl; 24.03.2020