Em sistemas de tempo contínuo, o conceito de ruído branco com banda limitada, gaussiano ou não, é bem definido e bem compreendido. Para sistemas de tempo discreto, o problema é mais complicado e você precisa considerar qual é a limitação da banda e como ela se compara à frequência de Nyquist.
precisa saber é o seguinte
2
@DilipSarwate: Para mim, "ruído branco com banda limitada" é um oxímoro! :-)
Peter K.
@PeterK. A noção de ruído branco ilimitado de banda é usada principalmente em sistemas de passagem de banda, onde as características do ruído fora da banda passante são irrelevantes, enquanto na faixa passante, o ruído é indistinguível do ruído branco que foi passado através de um filtro passa-faixa ideal que passa precisamente a faixa de freqüência que é a banda passante. Não é mais um oxímoro que o ruído branco (sem comentários pejorativos sobre limitações de banda). Veja também o comentário de DRazick (que está no local) após a resposta de Jason R (da qual discordo).
precisa
1
@DilipSarwate: Obrigado pela explicação. Entendi, mas ainda acho que é uma péssima escolha de terminologia. Para mim, "ruído branco filtrado por passagem de banda" é mais preciso, mas suponho que ele termine no mesmo local.
Peter K.
1
@PeterK. Infelizmente, "ruído branco filtrado por passagem de banda" geralmente significa o processo descrito na resposta de JasonR. Comece com ruído branco e filtre-o através de um filtro com função de transferência para obter um processo com PSD proporcional a | H ( f ) | 2 . O ruído branco com banda limitada é o mesmo, exceto que insistimos que H ( f ) deve ser a função de transferência de um filtro passa-banda ideal . O ponto principal do ruído branco é que não podemos colocar o sinal onde o ruído não se aplica ao ruído branco limitado por banda, desde que estejamos constrangidos a manter nossos sinais na banda.H( f)| H( f) |2H( f)
Dilip Sarwate
Respostas:
19
Você geraria ruído gaussiano ilimitado de banda, primeiro gerando ruído branco e depois filtrando-o para a largura de banda desejada. Como um exemplo:
% 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);
Eu sempre me perguntei isso, mas se algo assim é feito, então o que há de mais gaussiano nisso? Eu não acho que o PDF é em tudo neste momento ...
Spacey
8
Uma das características especiais das variáveis aleatórias gaussianas é que a soma de dois RVs gaussianos independentes também é distribuída gaussiana. Como o ruído de entrada é branco, é possível observar cada amostra na saída do filtro como uma soma de muitas variáveis aleatórias Gaussianas independentes (onde a variação de cada VR depende da variação do ruído de entrada e dos valores da torneira de filtro correspondente). Portanto, as amostras na saída do filtro também são distribuídas gaussianas. No entanto, obviamente, o ruído não é mais branco, pois há correlação entre amostras sucessivas na saída do filtro.
Jason R
Esta propriedade é descrita em mais detalhes na Wikipedia . Observe que a propriedade ainda é válida, mesmo que o ruído de entrada seja colorido (consulte a seção "Variáveis aleatórias correlacionadas").
Jason R
1
facepalm . Claro.
Spacey
3
No entanto, esse método não gera ruído branco. Não há necessidade de aplicar um filtro, todo ruído amostrado discreto é limitado à banda para começar.
Royi 21/06
9
Apenas como uma pequena adição à resposta de Jason: geralmente você precisa gerar ruído ilimitado de banda com uma dada variação . Você pode adicionar esse código ao código fornecido na resposta de Jason:σ2
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Observe que você precisa fazer o dimensionamento após a filtragem, porque, em geral, o filtro altera a variação de ruído.
Por que não se pode usar a abordagem mencionada neste post ?
Começa com as frequências desejadas e trabalha para trás para construir o sinal, em vez de filtrar. Ele usa código python, mas também links para o código Matlab original.
olhando para o código original do matlab, ele funciona para um tamanho de bloco de n, seu comprimento de fft. Se eu quiser amostras de 2n, você pode dobrar o comprimento de pés, que é mais do que fazer 2 pés. se você fizer 2 blocos separados, haverá uma transição descontínua do primeiro para o segundo bloco. você pode usar uma janela para suavizar a transição, mas precisará fazer mais de 2 blocos para evitar escalar suas séries temporais. Usando o método de filtro, quando o filtro estiver em estado estacionário, você poderá alimentar números aleatórios pelo tempo que desejar. O aumento do processamento para o método de filtro é dimensionado linearmente.
0
Sei que essa pergunta apareceu na exibição atual porque @Drazick modificou sua resposta para 2013.
xrand()frand()0 ≤ x < 1
"ruído branco" é, obviamente, um nome impróprio, mesmo para sinais analógicos. um "sinal de potência" com espectro plano até o infinito também possui potência infinita. o sinal virtualmente gaussiano e "branco" gerado como descrito tem uma potência finita (que é a variação e é 1) e largura de banda finita que, expressa como unilateral, é Nyquist. (para que a 'densidade espectral de potência "ou a potência por unidade de frequência seja 1 / Nyquist.) dimensione-a e faça o deslocamento da maneira que desejar.
suponho que eu possa editar isso mais tarde e adicionar algum pseudo-código tipo C para mostrar isso explicitamente.
Produzir ruído branco de espectro total e filtrá-lo é como se você quisesse pintar uma parede de sua casa de branco, então você decide pintar toda a casa de branco e depois pintar toda a casa, exceto a parede. É idiota. (Mas tem sentido em eletrônica).
Eu criei um pequeno programa C que pode gerar ruído branco em qualquer frequência e largura de banda (digamos, na frequência central de 16kHz e na largura de 2 kHz). Nenhuma filtragem envolvida.
O que eu fiz é simples: dentro do loop principal (infinito) eu gero um sinusóide na frequência central +/- um número aleatório entre-metade da largura de banda e + meia largura de banda, então mantenho essa frequência para um número arbitrário de amostras (granularidade) e isso é o resultado:
Ruído branco de 2kHz de largura na frequência central de 16kHz
Pseudo-có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
}
}
O STFT não é plano na banda. Você não mostrou por que existe alguma vantagem em sua técnica. Entre a maioria das tintas é armazenada como um branco acinzentado e depois misturada com pigmento. Tinta laranja não é feita apenas usando ingredientes laranja. Não há trabalho extra na geração de ruído branco.
@StanleyPawlukiewicz Na eletrônica, você está preparado porque um gerador de ruído e um filtro são dois "objetos" muito simples. Na programação, um filtro é complexo em número de instruções, muito mais do que apenas gerar os dados necessários. Então, quando a programação é preferível, minha abordagem se você tiver aplicativos críticos em termos de tempo. Se você votou negativamente, sugiro que pense novamente.
Zibri
1
seu barulho não é preferível. o espectro não é plano na banda. chamar uma função transcendental rapidamente não é mais rápido que filtrar. seus argumentos são infundados
1
Na verdade, a ondulação na banda é um parâmetro de design. Para dizer que o pico na freqüência central também é falsa
1
desde que sua técnica é tão fácil de modificar, por que você não escreve sua própria rotina de ondas senoidais em vez de vincular a uma e alegar que seu código é menos complexo e a comparar com um biquad. enquanto você o adiciona, que tal uma versão de ponto fixo. Você também pode pensar sobre como suas escalas técnica à medida que aumenta o número de amostras
Respostas:
Você geraria ruído gaussiano ilimitado de banda, primeiro gerando ruído branco e depois filtrando-o para a largura de banda desejada. Como um exemplo:
fonte
Apenas como uma pequena adição à resposta de Jason: geralmente você precisa gerar ruído ilimitado de banda com uma dada variação . Você pode adicionar esse código ao código fornecido na resposta de Jason:σ2
Observe que você precisa fazer o dimensionamento após a filtragem, porque, em geral, o filtro altera a variação de ruído.
fonte
Toda vez que você gera amostras de ruído discretas (usando o MATLAB
randn
/rand
por exemplo), na verdade você gera um ruído de banda limitada.Tudo o que você precisa fazer é ajustar a variação das amostras discretas à variação do ruído "Contínuo" de onde as amostras são retiradas.
A descrição completa é fornecida aqui - Como Simular AWGN (Aditivo Branco Gaussiano Ruído) em Sistemas de Comunicação para Largura de Banda Específica .
fonte
Por que não se pode usar a abordagem mencionada neste post ?
Começa com as frequências desejadas e trabalha para trás para construir o sinal, em vez de filtrar. Ele usa código python, mas também links para o código Matlab original.
Existem desvantagens em fazê-lo dessa maneira?
fonte
Sei que essa pergunta apareceu na exibição atual porque @Drazick modificou sua resposta para 2013.
rand()
frand()
"ruído branco" é, obviamente, um nome impróprio, mesmo para sinais analógicos. um "sinal de potência" com espectro plano até o infinito também possui potência infinita. o sinal virtualmente gaussiano e "branco" gerado como descrito tem uma potência finita (que é a variação e é 1) e largura de banda finita que, expressa como unilateral, é Nyquist. (para que a 'densidade espectral de potência "ou a potência por unidade de frequência seja 1 / Nyquist.) dimensione-a e faça o deslocamento da maneira que desejar.
suponho que eu possa editar isso mais tarde e adicionar algum pseudo-código tipo C para mostrar isso explicitamente.
fonte
Produzir ruído branco de espectro total e filtrá-lo é como se você quisesse pintar uma parede de sua casa de branco, então você decide pintar toda a casa de branco e depois pintar toda a casa, exceto a parede. É idiota. (Mas tem sentido em eletrônica).
Eu criei um pequeno programa C que pode gerar ruído branco em qualquer frequência e largura de banda (digamos, na frequência central de 16kHz e na largura de 2 kHz). Nenhuma filtragem envolvida.
O que eu fiz é simples: dentro do loop principal (infinito) eu gero um sinusóide na frequência central +/- um número aleatório entre-metade da largura de banda e + meia largura de banda, então mantenho essa frequência para um número arbitrário de amostras (granularidade) e isso é o resultado:
Ruído branco de 2kHz de largura na frequência central de 16kHz
Pseudo-código:
fonte