Об имитации плаванья (drift-а) аналоговых осцилляторов.
Основная проблема в характере модуляции частоты. Требуется плавная модуляция, не имеющая явно выраженных ступенек и явно выраженной частоты. Можно, конечно, использовать random (step) lfo, сглаженное фильтром, но частота lfo будет явно прослеживаться в сигнале.
Пришла в голову следующая идея.
Берем генератор псевдослучайных чисел, но используем число на выходе не непосредственно для модуляции, а для задания направления смещения частоты.
Иначе говоря: если генератор выдал четное число, увеличиваем
частоту осциллятора. Выдал нечетное - уменьшаем. Таким образом, мы получаем плавное изменение частоты (она никогда не меняется более, чем на единицу). Что еще более важно, в модулирующем сигнале будут присутствовать воздействия разных масштабов.
А можно представить это в виде интегратора, на которые подаются ступеньки +1/-1.
Получается почти классический random walk-алгоритм !
Обычно объясняется на примере с пьяницей, который делает случайный
шаг в случайную сторону и выписывает замысловатую непредсказуемую траекторию. Разница лишь в том, что пьяница рано или поздно доберется до канавы, нам же нужно в среднем оставаться на месте (интегратор не должен уйти в насыщение).
На помощь приходит генератор псевдослучайных чисел в виде сдвигового регистра (m-последовательность максимальной длины). Тактируя регистр длиной n бит, на каждом шаге получаем случайное число от 1 до 2^(n-1). Более того, регистр выдает все числа от 1 до 2^(n-1) в случайном порядке ни разу не повторяясь. А после 2^(n-1) шагов вся последовательность начинается заново.
Получается, что за период повторения последовательности мы получим равное число четных и нечетных чисел (точнее, нечетных на одно больше, что легко учесть). Таким образом, частота осциллятора будет всегда в среднем оставаться на месте, никуда не уползая. А сам закон плаванья частоты будет определяться видом m-последовательности.
Для примера, 16-битный регистр с обратной связью на 16, 15, 12 и 1 отводах даст такую картинку:
[img width=\\\'500\\\' src=\\\'
http://diyfactory.ru/forum/uploads/img-1275-38f0d31470.png[/img]
А это 16, 15, 12, 10:
[img width=\\\'500\\\' src=\\\'
http://diyfactory.ru/forum/uploads/img-1276-4ddc59d2f2.png[/img]
Если тактировать такой генератор с частотой 10 Гц, то последовательность повторится через 6554с (1.8 часа).
Можно и немного отфильтровать сигнал, если окажется слишком грубым. Прошлая последовательность с ФНЧ:
[img width=\\\'500\\\' src=\\\'
http://diyfactory.ru/forum/uploads/img-1277-7eed133712.png[/img]
В железе еще не пробовал. Что скажете (кроме того, что надо пробовать :-) ?