Как стать автором
Обновить

Комментарии 8

Интересно, существует ли математически точный алгоритм генерации розового шума?
Поясню. Предлагаемый алгоритм суммирования октавных полос — быстрый, удобный, но неточный. На графиках АЧХ видны неравномерности спектра, ступеньки через каждую октаву.
Белый шум получить проще простого, это последовательность независимых случайных значений, и он имеет ровный спектр. Красный шум (Броуновский, часто Brown неверно переводят как "коричневый") представляет собой интеграл белого шума. Он имеет спад 6 дБ на октаву. Все промежуточные случаи являются результатом дробного интегрирования белого шума, и именно эта тема у автора оказалась не раскрыта. Т.е., так называемый "розовый" шум со спадом АЧХ в 3 дБ на октаву представляет собой полуинтеграл белого шума. Хотелось бы задать вопрос математикам, есть ли какой-нибудь способ вычислить его с достаточной точностью за приемлемое время?

Я не математик, но ответить есть что.

Во первых, розовый, как и белый шум — это математическая абстракция, поэтому никакого «точного» алгоритма существовать не может — мы можем говорить лишь о некотором приближении. Строго говоря, последовательность независимых случайных значений не является белым шумом — так как она дискретна, в то время как белый шум непрерывный и имеет бесконечный спектр.

Далее. Дробное интегрирование/дифференцирование — тема, безусловно, интересная — но в данном случае её привлечение избыточно. Если вы попытаетесь синтезировать brown-ский шум (да, я тоже называю его коричневым) непосредственно через интегрирование случайных величин — он через некоторое время «улетит» в бесконечность и никаких гор не получится.

Хотите розовый шум с более «прямым» спектром? Да не вопрос — синтезируйте его посредством FIR-фильтра, которым фильтруйте белый шум. Чем больше у него будет отсчётов — тем ближе он будет к идеальному. Например, в 1024 отсчётов и минимально-фазовом исполнении его импульсная характеристика будет выглядеть примерно так:

и спектр:

Завал на низких частотах неизбежен — в идеальном случае значение постоянной составляющей фильтра равно бесконечности (1/sqrt(f) при f=0).
Вот как, оказывается всё просто, дробное интегрирование и дифференцирование можно свести к операции свёртки, правда, в обобщённом виде (там повсюду будут вырожденные функции и несобственные интегралы), что эквивалентно умножению Фурье-образа сигнала на образ фильтра:
image
Допустим, функция f(t) — гауссовский белый шум, а F(ω) — её Фурье-образ, комплексный белый шум, равномерный вдоль всей оси частот. Посмотрим, как меняется Фурье-образ при дифференцировании/интегрировании f(x).
При n = 0 («белый» шум): f(t) → F(ω)
При n = 1 («синий» шум): f'(t) → iω * F(ω). Амплитуда становится прямо пропорциональна частоте.
При n = -1 («красный» шум): ∫f(t)dt → -i/ω * F(ω). Амплитуда обратно пропорциональна частоте, при ω=0 она обращается в бесконечность. Это соответствует тому, что значения винеровского процесса (точнее, их дисперсия) бесконечно растут со временем, и при интегрировании белого шума на практике нужно подавлять низкие частоты.
При n = -0.5 («розовый» шум): f(-0.5)(t) → (iω)^(-0.5) * F(ω).
Если представить «полуинтеграл» от f(t) как свёртку (f ∗ g)(t), то преобразование Фурье даст sqrt(2π)*F(ω)*G(ω), что позволяет выразить G(ω) = 1/sqrt(2πiω), тогда функция g(t) равна 1/sqrt(-πt) при t<=0 и 0 при t>0.
Теперь понятно, почему никто не использует «полуинтегрирование». Функция 1/sqrt(-πt) имеет очень длинный хвост, т.е. очень медленно убывает при устремлении t в -∞, поэтому КИХ-фильтр получается слишком длинным и вычисление свёртки будет затратно.

Хотя, кажется, я знаю, как избавиться от "длинного хвоста".
В своём текущем виде функция g(t) как фильтр никуда не годится. При t=-1 и t=-10000 значения g(t) различаются всего в 100 раз. Например, при обработке аудиосигнала разрешением 16 бит длина фильтра составит порядка миллиарда сэмплов.
Надо проинтегрировать сигнал и продифференцировать фильтр.
g'(t) = { 1/(2sqrt(pi)(-t)^(3/2)) при t≤0; 0 при t > 0 }.
Эта функция при t=-1 и t=-10000 убывает в 1000000 раз. В том же примере со звуком, если вместо g(t) продискретизировать g'(t), длина КИХ-фильтра составит всего около 1000 сэмплов.

Миллиард сэмплов не понадобится, т.к. аудио-сигнал ограничен по частоте не только сверху, но и снизу. И с его интегрированием также возникнут всё те же сложности — он будет уходить в бесконечность из-за погрешностей вычислений. Избавится от длинного «хвоста» таким образом не получится. Сэкономить тут можно только перейдя на IIR (БИХ) фильтры — опять же, ценой пульсаций в АЧХ. Ещё можно попробовать факторизовать свёртку.

Можете ли на stocks попробовать такой же анализ, и подобрать параметры шума под выбранный тикер?

если вы пользуетесь софтом от MetaQuotes, то возможно вам будут интересен пример из CodeBase: https://www.mql5.com/ru/code/20588 — и также на этом сайте есть множество статей на данную тему.

Демка на shadertoy очень классная, в коментариях есть код для вращения камерой.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории