Какие существуют алгоритмы для генерации хорошего псевдослучайного приближения к (розовому) шуму, но подходящие для реализации с низкими вычислительными затратами на целочисленном DSP?
Какие существуют алгоритмы для генерации хорошего псевдослучайного приближения к (розовому) шуму, но подходящие для реализации с низкими вычислительными затратами на целочисленном DSP?
Ответы:
Есть несколько. Этот сайт имеет разумный (но, возможно, старый) список:
Линейная фильтрация
Первый подход в ответе Питера (т.е. фильтрация белого шума) - это очень простой подход. При обработке спектрального аудиосигнала JOS предоставляет фильтр низкого порядка, который можно использовать для получения достойного приближения , а также анализ того, насколько хорошо полученная спектральная плотность мощности соответствует идеальной. Линейная фильтрация всегда будет давать приближение, но на практике это может не иметь значения. Перефразируя JOS:
Не существует точного (рационального, конечного порядка) фильтра, который может производить розовый шум от белого шума. Это связано с тем, что идеальная амплитудная характеристика фильтра должна быть пропорциональна иррациональной функции , где обозначает частоту в Гц. Однако достаточно просто генерировать розовый шум в любой желаемой степени приближения, в том числе и с точки зрения восприятия. ф
Коэффициенты фильтра, который он дает, следующие:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
Они отформатированы как параметры для функции фильтра MATLAB , поэтому для ясности они соответствуют следующей передаточной функции:
Очевидно, что на практике лучше использовать полную точность коэффициентов. Вот ссылка на то, как звучит розовый шум, создаваемый этим фильтром:
Для реализации с фиксированной запятой, так как обычно более удобно работать с коэффициентами в диапазоне [-1,1), некоторая переработка передаточной функции будет в порядке. Как правило, рекомендация состоит в том, чтобы разбить вещи на секции второго порядка , но отчасти это объясняется (в отличие от использования секций первого порядка) для удобства работы с реальными коэффициентами, когда корни сложны. Для этого конкретного фильтра все корни действительны, и объединение их в сечения второго порядка, вероятно, все равно даст некоторые знаменательные коэффициенты> 1, поэтому разумным выбором будет три сечения первого порядка, как показано ниже:
где
Для предотвращения переполнения потребуется некоторый разумный выбор последовательности для этих секций в сочетании с некоторым выбором коэффициентов усиления для каждой секции. Я не пробовал ни один из других фильтров, приведенных в ссылке в ответе Питера , но, вероятно, применимы аналогичные соображения.
Белый шум
Очевидно, что подход фильтрации требует, прежде всего, источника однородных случайных чисел. Если подпрограмма библиотеки недоступна для данной платформы, один из самых простых подходов - использовать линейный конгруэнтный генератор . Один пример эффективной реализации с фиксированной запятой дан TI при генерации случайных чисел на TMS320C5x (pdf) . Подробное теоретическое обсуждение различных других методов можно найти в « Генерации случайных чисел» и «Методах Монте-Карло » Джеймса Джентла.
Ресурсы
Несколько источников, основанных на следующих ссылках в ответе Питера, заслуживают внимания.
Первый основанный на фильтрах кусок кода ссылается на введение в обработку сигналов от Orfanidis. Полный текст доступен по этой ссылке, и [в Приложении B] он охватывает как генерацию розового, так и белого шума. Как отмечается в комментарии, Орфанидис в основном охватывает алгоритм Восса.
Спектр, производимый генератором розового шума Восса-Маккартни . Далеко внизу страницы, после обширного обсуждения вариантов алгоритма Восса, на эту ссылку ссылаются гигантские розовые буквы . Это намного легче читать, чем некоторые из предыдущих диаграмм ASCII.
Библиография по 1 / f Noise от Вентиана Ли. На это ссылаются как в источнике Петра, так и в JOS. У него потрясающее количество упоминаний о 1 / f-шуме в целом, начиная с 1918 года.
Я использую алгоритм Корсини и Салетти с 1990 года: Дж. Корсини, Р. Салетти, «Генератор последовательностей шумов в спектре мощности 1 / f ^ gamma», транзакции IEEE по измерительным приборам и измерениям, 37 (4), декабрь 1988 г., 615 -619. Показатель гаммы находится между -2 и +2. Это хорошо работает для моих целей. издание
Если эта попытка добавить скриншот сработает, на рисунке ниже показан пример того, насколько хорошо работает алгоритм Корсини и Салетти (по крайней мере, как я программировал его в 1990 году). Частота дискретизации составляла 1 кГц, гамма = 1, и 1000 PSD 32k FFT были усреднены.
Это следует из моего предыдущего поста о генераторе шума 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
Как утверждают Корсини и Салетти в своей статье, , где - частота дискретизации, а - «верхний предел полосы частот, на которой мы будем генерировать выборки шума». Коэффициенты цифрового фильтра задаются их уравнениями (5.1):
где c = 1. Чтобы получить PSD C & S, подобные показанным выше, пусть c = 0 и .