Какие существуют алгоритмы для генерации хорошего псевдослучайного приближения к (розовому) шуму, но подходящие для реализации с низкими вычислительными затратами на целочисленном DSP?1 / ф
Как насчет памяти? Если это не проблема, а вычисления, я бы сказал, сделал iDFT со случайной фазой желаемой частотной кривой и сохранил бы ее в виде статической постоянной волны в вашем устройстве.
оставил
@leftaroundabout - Или умножил бы ДПФ случайного белого шума на частотную кривую 1 / f, тогда у IDFT были бы лучшие характеристики случайности?
hotpaw2
1
Белый шум - это, по сути, случайная фаза iFT постоянной функции, поэтому он не должен иметь большого значения.
Если этот сайт отключится, ваш ответ исчезнет, если вы приведете основы каждого решения, ответ будет значительно улучшен с использованием сайта в качестве ссылки.
Кортук
@Kortuk: Ответ вики сообщества, так что не стесняйтесь делать это сами! Информации там должно быть достаточно, чтобы указывать на другие веб-ссылки (например , ответ datageist для первого варианта). Я согласен, однако, что больше деталей было бы хорошо.
Питер К.
20
Линейная фильтрация
Первый подход в ответе Питера (т.е. фильтрация белого шума) - это очень простой подход. При обработке спектрального аудиосигнала JOS предоставляет фильтр низкого порядка, который можно использовать для получения достойного приближения , а также анализ того, насколько хорошо полученная спектральная плотность мощности соответствует идеальной. Линейная фильтрация всегда будет давать приближение, но на практике это может не иметь значения. Перефразируя JOS:
Не существует точного (рационального, конечного порядка) фильтра, который может производить розовый шум от белого шума. Это связано с тем, что идеальная амплитудная характеристика фильтра должна быть пропорциональна иррациональной функции
, где обозначает частоту в Гц. Однако достаточно просто генерировать розовый шум в любой желаемой степени приближения, в том числе и с точки зрения восприятия. ф1/f−−√f
Коэффициенты фильтра, который он дает, следующие:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
Они отформатированы как параметры для функции фильтра MATLAB , поэтому для ясности они соответствуют следующей передаточной функции:
Очевидно, что на практике лучше использовать полную точность коэффициентов. Вот ссылка на то, как звучит розовый шум, создаваемый этим фильтром:
Для реализации с фиксированной запятой, так как обычно более удобно работать с коэффициентами в диапазоне [-1,1), некоторая переработка передаточной функции будет в порядке. Как правило, рекомендация состоит в том, чтобы разбить вещи на секции второго порядка , но отчасти это объясняется (в отличие от использования секций первого порядка) для удобства работы с реальными коэффициентами, когда корни сложны. Для этого конкретного фильтра все корни действительны, и объединение их в сечения второго порядка, вероятно, все равно даст некоторые знаменательные коэффициенты> 1, поэтому разумным выбором будет три сечения первого порядка, как показано ниже:
H(z)=1−b1z−11−a1z−11−b2z−11−a2z−11−b3z−11−a3z−1
где
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 были усреднены.
Это следует из моего предыдущего поста о генераторе шума 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 и .fc≥10fMfcfM
Состояние Корсини и Салетти «Этот фильтр состоит из N каскадных секций первого порядка, каждая с реальной парой полюс-ноль», а N полюсов «равномерно распределены по частотному логарифму с плотностью h полюсов на десятилетие частоты (p / г) и N нулей следуют соответственно. " Раздел «Обсуждение» в документе был сделан исключительно хорошо, поэтому не было никаких проблем, просто запрограммировав то, что они сказали сделать. Все, что у меня есть, это моя старая бумажная копия и отсканированная копия. Для PSD, приведенного выше, я использовал 3 полюса / десятилетие, и PSD вычитается из среднего значения и является односторонним. Эд V
Ответы:
Есть несколько. Этот сайт имеет разумный (но, возможно, старый) список:
источник
Линейная фильтрация
Первый подход в ответе Питера (т.е. фильтрация белого шума) - это очень простой подход. При обработке спектрального аудиосигнала JOS предоставляет фильтр низкого порядка, который можно использовать для получения достойного приближения , а также анализ того, насколько хорошо полученная спектральная плотность мощности соответствует идеальной. Линейная фильтрация всегда будет давать приближение, но на практике это может не иметь значения. Перефразируя JOS:
Коэффициенты фильтра, который он дает, следующие:
Они отформатированы как параметры для функции фильтра 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 и .fc≥10fM fc fM ai=exp[−2π10(i−N)/h−γ/2h−c]
bi=exp[−2π10(i−N)/h−c] f M =0,5f cfM=0.5fc
источник