Розовое ( ) генерирование псевдослучайного шума

20

Какие существуют алгоритмы для генерации хорошего псевдослучайного приближения к (розовому) шуму, но подходящие для реализации с низкими вычислительными затратами на целочисленном DSP?1/f

hotpaw2
источник
Как насчет памяти? Если это не проблема, а вычисления, я бы сказал, сделал iDFT со случайной фазой желаемой частотной кривой и сохранил бы ее в виде статической постоянной волны в вашем устройстве.
оставил
@leftaroundabout - Или умножил бы ДПФ случайного белого шума на частотную кривую 1 / f, тогда у IDFT были бы лучшие характеристики случайности?
hotpaw2
1
Белый шум - это, по сути, случайная фаза iFT постоянной функции, поэтому он не должен иметь большого значения.
оставлено около

Ответы:

11

Есть несколько. Этот сайт имеет разумный (но, возможно, старый) список:

Питер К.
источник
6
Если этот сайт отключится, ваш ответ исчезнет, ​​если вы приведете основы каждого решения, ответ будет значительно улучшен с использованием сайта в качестве ссылки.
Кортук
@Kortuk: Ответ вики сообщества, так что не стесняйтесь делать это сами! Информации там должно быть достаточно, чтобы указывать на другие веб-ссылки (например , ответ datageist для первого варианта). Я согласен, однако, что больше деталей было бы хорошо.
Питер К.
20

Линейная фильтрация

Первый подход в ответе Питера (т.е. фильтрация белого шума) - это очень простой подход. При обработке спектрального аудиосигнала JOS предоставляет фильтр низкого порядка, который можно использовать для получения достойного приближения , а также анализ того, насколько хорошо полученная спектральная плотность мощности соответствует идеальной. Линейная фильтрация всегда будет давать приближение, но на практике это может не иметь значения. Перефразируя JOS:

Не существует точного (рационального, конечного порядка) фильтра, который может производить розовый шум от белого шума. Это связано с тем, что идеальная амплитудная характеристика фильтра должна быть пропорциональна иррациональной функции , где обозначает частоту в Гц. Однако достаточно просто генерировать розовый шум в любой желаемой степени приближения, в том числе и с точки зрения восприятия. ф1/ff

Коэффициенты фильтра, который он дает, следующие:

B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];

Они отформатированы как параметры для функции фильтра MATLAB , поэтому для ясности они соответствуют следующей передаточной функции:

H(z)=.041.096z1+.051z2.004z312.495z1+2.017z2.522z3

Очевидно, что на практике лучше использовать полную точность коэффициентов. Вот ссылка на то, как звучит розовый шум, создаваемый этим фильтром:

Для реализации с фиксированной запятой, так как обычно более удобно работать с коэффициентами в диапазоне [-1,1), некоторая переработка передаточной функции будет в порядке. Как правило, рекомендация состоит в том, чтобы разбить вещи на секции второго порядка , но отчасти это объясняется (в отличие от использования секций первого порядка) для удобства работы с реальными коэффициентами, когда корни сложны. Для этого конкретного фильтра все корни действительны, и объединение их в сечения второго порядка, вероятно, все равно даст некоторые знаменательные коэффициенты> 1, поэтому разумным выбором будет три сечения первого порядка, как показано ниже:

H(z)=1b1z11a1z1 1b2z11a2z1 1b3z11a3z1

где

b1=0.98223157, b2=0.83265661, b3=0.10798089
a1=0.99516897, a2=0.94384177, a3=0.55594526

Для предотвращения переполнения потребуется некоторый разумный выбор последовательности для этих секций в сочетании с некоторым выбором коэффициентов усиления для каждой секции. Я не пробовал ни один из других фильтров, приведенных в ссылке в ответе Питера , но, вероятно, применимы аналогичные соображения.

Белый шум

Очевидно, что подход фильтрации требует, прежде всего, источника однородных случайных чисел. Если подпрограмма библиотеки недоступна для данной платформы, один из самых простых подходов - использовать линейный конгруэнтный генератор . Один пример эффективной реализации с фиксированной запятой дан TI при генерации случайных чисел на TMS320C5x (pdf) . Подробное теоретическое обсуждение различных других методов можно найти в « Генерации случайных чисел» и «Методах Монте-Карло » Джеймса Джентла.

Ресурсы

Несколько источников, основанных на следующих ссылках в ответе Питера, заслуживают внимания.

  • Первый основанный на фильтрах кусок кода ссылается на введение в обработку сигналов от Orfanidis. Полный текст доступен по этой ссылке, и [в Приложении B] он охватывает как генерацию розового, так и белого шума. Как отмечается в комментарии, Орфанидис в основном охватывает алгоритм Восса.

  • Спектр, производимый генератором розового шума Восса-Маккартни . Далеко внизу страницы, после обширного обсуждения вариантов алгоритма Восса, на эту ссылку ссылаются гигантские розовые буквы . Это намного легче читать, чем некоторые из предыдущих диаграмм ASCII.

  • Библиография по 1 / f Noise от Вентиана Ли. На это ссылаются как в источнике Петра, так и в JOS. У него потрясающее количество упоминаний о 1 / f-шуме в целом, начиная с 1918 года.

специалист по обработке данных
источник
Есть идеи, как он пришел с этими коэффициентами фильтра? Я предполагаю, что это просто нелинейная подгонка к желаемому наклону, но мне было бы весьма интересно узнать, существует ли более конкретный алгоритм.
нибот
Мое лучшее предположение было бы одним из методов приближения, упомянутых в его диссертации . Это отличное чтение в любом случае.
Datageist
Вау, это настоящий документ! Спасибо за ссылку.
нибот
1
Проблема, связанная с методом фильтра белого шума, заключается в том, что вы не получаете такие же фазовые зависимости величины, как у автокоррелированных временных рядов. Таким образом, если вы пытаетесь эмулировать естественные процессы, вы не должны генерировать белый шум и фильтровать его. Вы должны фактически создать автокоррелированный шум как временной ряд, т.е. текущее значение зависит от предыдущего значения + шум. Смотрите в статистике "AR" процессы. Вы можете проверить это путем генерации шума с использованием обоих методов, затем БПФ, и построить график зависимости реального от воображаемого (комплексная плоскость частотной области). Вы заметите большую разницу в шаблоне
Paul S
Привет Пол, добро пожаловать в DSP.SE. Если вы просто заботитесь о том, как звучит шум (например, в звуке), то первостепенное значение имеет спектр амплитуд. Было бы здорово, если бы вы могли подробно изложить свои мысли в новом ответе. Я не думаю, что у нас есть что-нибудь на сайте, описывающее эту технику.
обработке данных
1

Я использую алгоритм Корсини и Салетти с 1990 года: Дж. Корсини, Р. Салетти, «Генератор последовательностей шумов в спектре мощности 1 / f ^ gamma», транзакции IEEE по измерительным приборам и измерениям, 37 (4), декабрь 1988 г., 615 -619. Показатель гаммы находится между -2 и +2. Это хорошо работает для моих целей. издание

Если эта попытка добавить скриншот сработает, на рисунке ниже показан пример того, насколько хорошо работает алгоритм Корсини и Салетти (по крайней мере, как я программировал его в 1990 году). Частота дискретизации составляла 1 кГц, гамма = 1, и 1000 PSD 32k FFT были усреднены.

PSD для 1 / f шума по алгоритму Корсини и Салетти


Это следует из моего предыдущего поста о генераторе шума Corsini и Saletti (C & S). Следующие два рисунка показывают, насколько хорошо работает генератор C & S в отношении генерации низкочастотных (гамма> 0) и высокочастотных (гамма <0) шумов. На третьем рисунке сравниваются PSD шума 1 / f генератора C & S (аналогично моему первому посту) и генератора 1 / f примера B.9, приведенные в превосходной книге профессора Орфанидиса (см. B.29, стр. 736). Все эти PSD представляют собой в среднем 1000 PSD с частотой 32 тыс. FFT. Все они односторонние и средне вычтенные. Для PSD C & S я использовал 3 полюса / десятилетие и указал 4 десятилетия (от 0,05 до 500 Гц) в качестве желаемого диапазона использования. Таким образом, генератор C & S имел n = 12 полюсных и нулевых пар. Частота дискретизации составляла 1 кГц, Найквиста - 500 Гц, а разрешение составляло чуть более 0,0305 Гц. Эд V Низкочастотные PSD Высокочастотные PSD Сравнение 2 1 / F генераторов шума

Как утверждают Корсини и Салетти в своей статье, , где - частота дискретизации, а - «верхний предел полосы частот, на которой мы будем генерировать выборки шума». Коэффициенты цифрового фильтра задаются их уравнениями (5.1): где c = 1. Чтобы получить PSD C & S, подобные показанным выше, пусть c = 0 и .fc10fMfcfM

ai=exp[2π10(iN)/hγ/2hc]
bi=exp[2π10(iN)/hc]
f M =0,5f cfM=0.5fc

Эд V
источник
1
Состояние Корсини и Салетти «Этот фильтр состоит из N каскадных секций первого порядка, каждая с реальной парой полюс-ноль», а N полюсов «равномерно распределены по частотному логарифму с плотностью h полюсов на десятилетие частоты (p / г) и N нулей следуют соответственно. " Раздел «Обсуждение» в документе был сделан исключительно хорошо, поэтому не было никаких проблем, просто запрограммировав то, что они сказали сделать. Все, что у меня есть, это моя старая бумажная копия и отсканированная копия. Для PSD, приведенного выше, я использовал 3 полюса / десятилетие, и PSD вычитается из среднего значения и является односторонним. Эд V
Эд V