¿Cómo generar ruido blanco gaussiano limitado de banda en MATLAB?

16

En algunos documentos, leí que el ruido aditivo es blanco gaussiano de banda limitada.
¿Cómo puedo simular este tipo de ruido usando MATLAB?

Bo LI
fuente
En sistemas de tiempo continuo, el concepto de ruido blanco de banda limitada, gaussiano o no, está bien definido y bien entendido. Para sistemas de tiempo discreto, el problema es más complicado y debe considerar cuál es la limitación de banda y cómo se compara con la frecuencia de Nyquist.
Dilip Sarwate
2
@DilipSarwate: ¡Para mí, el "ruido blanco de banda limitada" es un oxímoron! :-)
Peter K.
@PeterK. La noción de ruido blanco limitado en banda se usa principalmente en sistemas de paso de banda donde las características del ruido fuera de la banda de paso son irrelevantes, mientras que dentro de la banda de paso, el ruido es indistinguible del ruido blanco que se ha pasado a través de un filtro de paso de banda ideal que pasa precisamente la banda de frecuencia que Es la banda de paso. No es más un oxímoron que el ruido blanco (sin ningún comentario peyorativo sobre las limitaciones de banda). Ver también, el comentario de DRazick (que es perfecto) después de la respuesta de Jason R (con la que no estoy de acuerdo).
Dilip Sarwate
1
@DilipSarwate: Gracias por la explicación. Lo entiendo, pero sigo pensando que es una muy mala elección de terminología. Para mí, el "ruido blanco filtrado de paso de banda" es más preciso, pero supongo que termina en el mismo lugar.
Peter K.
1
@PeterK. Desafortunadamente, "ruido blanco filtrado de paso de banda" generalmente significa el proceso descrito en la respuesta de JasonR. Comience con ruido blanco y filtre a través de un filtro con la función de transferencia para obtener un proceso con PSD proporcional a | H ( f ) | 2 . El ruido blanco limitado en la banda es el mismo, excepto que insistimos en que H ( f ) debe ser la función de transferencia de un filtro de paso de banda ideal . El punto clave con el ruido blanco es que no podemos poner la señal donde el ruido no se aplica al ruido blanco de banda limitada, siempre y cuando estemos obligados a mantener nuestras señales en la banda.H(f)|H(f)|2H(f)
Dilip Sarwate

Respuestas:

19

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);
Jason R
fuente
Siempre me he preguntado esto, pero si se hace algo así, ¿qué tiene de gaussiano? No creo que el PDF esté en este momento ...
Spacey
8
Una de las características especiales de las variables aleatorias gaussianas es que la suma de dos RV gaussianos independientes también se distribuye en gauss. Como el ruido de entrada es blanco, puede ver cada muestra en la salida del filtro como una suma de muchas variables aleatorias gaussianas independientes (donde la varianza de cada RV depende de la varianza del ruido de entrada y los valores de la derivación del filtro correspondiente). Por lo tanto, las muestras en la salida del filtro también están distribuidas en Gauss. Sin embargo, el ruido obviamente ya no es blanco, ya que existe una correlación entre muestras sucesivas en la salida del filtro.
Jason R
Esta propiedad se describe con más detalle en Wikipedia . Tenga en cuenta que la propiedad aún se mantiene incluso si el ruido de entrada es de color (consulte la sección "Variables aleatorias correlacionadas").
Jason R
1
Facepalm . Por supuesto.
Spacey
3
Sin embargo, este método no generará ruido blanco. No es necesario aplicar un filtro, cada ruido de muestreo discreto tiene una banda limitada para empezar.
Royi
9

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:σ2

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.

Matt L.
fuente
2
norte=0 0norteEl |h[norte]El |2=1
@Matt Nice además!
Spacey
4

Cada vez que genera muestras de ruido discretas (usando MATLAB's randn/ randpor 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.

σCnorte2δ(t)FsFsσCnorte2

Fs/ /2

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 .

Royi
fuente
Más información aquí: dsp.stackexchange.com/questions/17494/…
Royi
2

¿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?

MrUser
fuente
1
mirando el código original de matlab, funciona para un tamaño de bloque de n, su longitud fft. Si quiero 2n muestras, puede duplicar la longitud de fft, que es más que hacer 2 fft. si haces 2 bloques separados, habrá una transición discontinua del primer bloque al segundo. podría usar una ventana para suavizar la transición, pero luego debe hacer más de 2 bloques para evitar festonear sus series de tiempo. Usando el método de filtro, una vez que el filtro está en estado estable, puede alimentarlo con números aleatorios todo el tiempo que desee. El aumento de procesamiento para el método de filtro se escala linealmente.
0

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 uniformeX(digamos usando rand()o frand(), si es una buena versión) que varía de 0 a 1 (es decir0 0X<1), 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.

robert bristow-johnson
fuente
-1

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

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
    }


}
Zibri
fuente
1
El STFT no es plano en toda la banda. No ha demostrado por qué su técnica tiene alguna ventaja. Por cierto, la mayoría de la pintura se almacena como un blanco grisáceo y luego se mezcla con pigmento. La pintura anaranjada no se hace simplemente usando ingredientes anaranjados. No hay ningún trabajo adicional en la generación de ruido blanco.
@StanleyPawlukiewicz En electrónica eres righe porque un generador de ruido y un filtro son dos "objetos" muy simples. En la programación, un filtro es complejo en número de instrucciones, mucho más que solo generar los datos necesarios. Entonces, cuando la programación es preferible, mi enfoque es si tiene aplicaciones de tiempo crítico. Si votó en contra, le sugiero que lo piense nuevamente.
Zibri
1
Tu ruido no es preferible. El espectro no es plano en toda la banda. llamar a una función trascendental sobre la marcha no es más rápido que filtrar. sus argumentos no tienen fundamento
1
En realidad, la ondulación dentro de la banda es un parámetro de diseño. Decir que
1
debido a que su técnica es tan fácil de modificar, ¿por qué no escribe su propia rutina de onda sinusoidal en lugar de vincularla y afirmar que su código es menos complejo y compararlo con una biquad? mientras lo agregas, ¿qué tal una versión de punto fijo? También puede pensar en cómo se escala su técnica a medida que aumenta el número de muestras