В некоторых работах я читал, что аддитивный шум ограничен гауссовым белым.
Как я могу имитировать этот тип шума, используя MATLAB?
В некоторых работах я читал, что аддитивный шум ограничен гауссовым белым.
Как я могу имитировать этот тип шума, используя MATLAB?
Ответы:
Вы должны генерировать гауссовский шум с ограниченной полосой пропускания, сначала генерируя белый шум, а затем фильтруя его по желаемой полосе пропускания. В качестве примера:
% design FIR filter to filter noise to half of Nyquist rate
b = fir1(64, 0.5);
% generate Gaussian (normally-distributed) white noise
n = randn(1e4, 1);
% apply to filter to yield bandlimited noise
nb = filter(b,1,n);
Так же, как небольшое дополнение к ответу Джейсона: обычно вам нужно генерировать ограниченный диапазон шума с заданной дисперсией . Вы можете добавить этот код к коду, указанному в ответе Джейсона:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Обратите внимание, что вам необходимо выполнить масштабирование после фильтрации, потому что в общем случае фильтр изменяет дисперсию шума.
Каждый раз, когда вы генерируете дискретные образцы шума (используя MATLAB's randn
/rand
к примеру) вы на самом деле порождают группу ограниченный шум.
Все, что вам нужно сделать, - это настроить дисперсию дискретных выборок на дисперсию «непрерывного» шума, из которого предположительно взяты выборки.
Полное описание дается здесь - Как имитировать AWGN (аддитивный белый гауссов шум) в системах связи для определенной полосы пропускания .
Почему нельзя использовать подход, упомянутый в этом посте ?
Он начинается с нужных частот и работает в обратном направлении для формирования сигнала вместо фильтрации. Он использует код Python, но также ссылки на оригинальный код Matlab.
Есть ли какие-либо недостатки в этом?
я понимаю, что этот вопрос всплыл в текущем представлении, потому что @Drazick изменил свой ответ 2013 года.
если вы генерируете хорошее равномерное псевдослучайное число в формате PDF(скажем, используя rand()
или frand()
, если это хорошая версия), который варьируется от 0 до 1 (то есть), затем, если вы сделаете это 12 раз, сложите все 12 предположительно независимых и некоррелированных значений и вычтете 6,0 из этой суммы, вы получите нечто, очень близкое к единице-дисперсии и гауссовскому случайному числу с нулевым средним. если однородные псевдослучайные числа pdf являются «хорошими» (то есть они проявляют независимость друг от друга), эта сумма будет настолько же «белой», насколько вы можете получить сигнал с дискретным временем.
"белый шум" , конечно, неправильно, даже для аналоговых сигналов. «сигнал силы» с плоским спектром вплоть до бесконечности также имеет бесконечную силу. фактически гауссовский и «белый» сигналы, сгенерированные, как описано, имеют конечную мощность (которая является дисперсией и равна 1) и конечную ширину полосы, которая, выраженная как односторонняя, равна Найквисту. (таким образом, «спектральная плотность мощности» или мощность на единицу частоты равна 1 / Найквиста.) масштабируйте ее и смещайте, как вам угодно.
я могу редактировать это позже и добавить немного C-подобного псевдокода, чтобы показать это явно.
Создайте белый шум полного спектра и затем отфильтруйте его так, как будто вы хотите покрасить стену своего дома в белый цвет, поэтому вы решили покрасить весь дом в белый цвет, а затем закрасить весь дом, кроме стены. Идиотский (Но имеет смысл в электронике).
Я сделал небольшую C-программу, которая может генерировать белый шум на любой частоте и любой ширине полосы (скажем, на центральной частоте 16 кГц и ширине 2 кГц). Фильтрация не включена.
То, что я сделал, это просто: внутри основного (бесконечного) цикла я генерирую синусоиду на центральной частоте +/- случайное число от -half полосы пропускания до + halfbandwidth, затем я сохраняю эту частоту для произвольного числа выборок (гранулярность), и это это результат:
Белый шум шириной 2 кГц при центральной частоте 16 кГц
Псевдокод:
while (true)
{
f = center frequency
r = random number between -half of bandwidth and + half of bandwidth
<secondary loop (for managing "granularity")>
for x = 0 to 8 (or 16 or 32....)
{
[generate sine Nth value at frequency f+r]
output = generated Nth value
}
}