En algunos documentos, leí que el ruido aditivo es blanco gaussiano de banda limitada.
¿Cómo puedo simular este tipo de ruido usando MATLAB?
En algunos documentos, leí que el ruido aditivo es blanco gaussiano de banda limitada.
¿Cómo puedo simular este tipo de ruido usando MATLAB?
Respuestas:
Generaría ruido gaussiano de banda ilimitada generando primero ruido blanco y luego filtrándolo al ancho de banda que desee. Como ejemplo:
% 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);
Solo como una pequeña adición a la respuesta de Jason: por lo general, debe generar ruido de banda ilimitada con una variación dada . Puede agregar este código al código que figura en la respuesta de Jason:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Tenga en cuenta que debe realizar la escala después del filtrado, porque en general el filtro cambia la variación de ruido.
Cada vez que genera muestras de ruido discretas (usando MATLAB's randn
/ rand
por ejemplo), en realidad genera un ruido de banda limitada.
Todo lo que necesita hacer es ajustar la varianza de las muestras discretas a la varianza del ruido "continuo" del que supuestamente se toman esas muestras.
Aquí se ofrece una descripción completa: cómo simular AWGN (ruido blanco gaussiano aditivo) en sistemas de comunicación para ancho de banda específico .
¿Por qué no se puede usar el enfoque mencionado en esta publicación ?
Comienza con las frecuencias deseadas y funciona hacia atrás para generar la señal, en lugar de filtrar. Utiliza el código de Python, pero también se vincula al código original de Matlab.
¿Hay algún inconveniente en hacerlo de esa manera?
Me doy cuenta de que esta pregunta apareció en la vista actual porque @Drazick modificó su respuesta de 2013.
si genera un buen número seudoaleatorio pdf uniforme(digamos usando rand()
o frand()
, si es una buena versión) que varía de 0 a 1 (es decir), si lo hace 12 veces, sume los 12 valores supuestamente independientes y no correlacionados, y reste 6.0 de esa suma, tendrá algo que está muy cerca de una varianza unitaria y un número aleatorio gaussiano de media cero. si los números seudoaleatorios pdf uniformes son "buenos" (es decir, exhiben independencia entre sí), esta suma será tan "blanca" como puede ser una señal de tiempo discreto.
"ruido blanco" es, por supuesto, un nombre inapropiado, incluso para señales analógicas. una "señal de potencia" con espectro plano hasta el infinito también tiene potencia infinita. la señal virtualmente gaussiana y "blanca" generada como se describe tiene una potencia finita (que es la varianza y es 1) y un ancho de banda finito que, expresado como unilateral, es Nyquist. (por lo que la "densidad espectral de potencia" o la potencia por unidad de frecuencia es 1 / Nyquist.) escale y compense como quiera.
Supongo que puedo editar esto más tarde y agregar un pseudocódigo tipo C para mostrar esto explícitamente.
Producir ruido blanco de espectro completo y luego filtrarlo es como si quisiera pintar una pared de su casa de blanco, por lo que decide pintar toda la casa de blanco y luego volver a pintar toda la casa excepto la pared. Es idiota (Pero tiene sentido en electrónica).
Hice un pequeño programa en C que puede generar ruido blanco en cualquier frecuencia y en cualquier ancho de banda (digamos a una frecuencia central de 16 kHz y "ancho" de 2 kHz). No hay filtrado involucrado.
Lo que hice es simple: dentro del bucle principal (infinito), genero una sinusoide en la frecuencia central +/- un número aleatorio entre medio ancho de banda y + medio ancho de banda, luego mantengo esa frecuencia para un número arbitrario de muestras (granularidad) y esto es el resultado:
Ruido blanco de 2 kHz de ancho a una frecuencia central de 16 kHz
Pseudocódigo:
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
}
}