Geração de ruído pseudo-aleatório rosa ( )


20

Quais são alguns algoritmos para gerar uma boa aproximação pseudo-aleatória ao ruído (rosa), ainda adequados para implementação com baixo custo computacional em um DSP inteiro?1/f


E a memória? Se isso não é uma preocupação, mas a computação é, eu diria que faça um iDFT de fase aleatória da curva de frequência desejada e salve-a como uma onda estática constante no seu dispositivo.
usar o seguinte comando

@leftaroundabout - Ou multiplicar a DFT de ruído branco aleatório pela curva de frequência 1 / f, em seguida, fazer uma IDFT terá melhores características de aleatoriedade?
hotpaw2

1
O ruído branco é essencialmente um iFT de fase aleatória da função constante, portanto não deve fazer muita diferença.
usar o seguinte código

Respostas:


11

6
Se esse site cair, sua resposta desaparecerá. Se você trouxer os princípios básicos de cada solução, a resposta seria muito melhorada, usando o site como referência.
Kortuk

@ Kortuk: A resposta é wiki da comunidade, então fique à vontade para fazer isso sozinho! As informações devem ser suficientes para apontar para outras referências da web (como a resposta do datagrafista para a primeira opção). Concordo, porém, que mais detalhes seriam bons.
Peter K.

20

Filtragem Linear

A primeira abordagem na resposta de Peter (isto é, filtrar o ruído branco) é uma abordagem muito direta. No Spectral Audio Signal Processing , o JOS fornece um filtro de ordem baixa que pode ser usado para produzir uma aproximação decente , juntamente com uma análise de quão bem a densidade espectral de potência resultante corresponde ao ideal. A filtragem linear sempre produzirá uma aproximação, mas isso pode não ter importância na prática. Parafraseando JOS:

Não existe um filtro exato (racional, de ordem finita) que possa produzir ruído rosa a partir do ruído branco. Isso ocorre porque a resposta de amplitude ideal do filtro deve ser proporcional à função irracional , onde denota a frequência em Hz. No entanto, é fácil o suficiente gerar ruído rosa para qualquer grau desejado de aproximação, incluindo a percepção exata. f1/ff

Os coeficientes do filtro que ele fornece são os seguintes:

B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];

Eles são formatados como parâmetros para a função de filtro MATLAB , portanto, por uma questão de clareza, eles correspondem à seguinte função de transferência:

H(z)=.041.096z1+.051z2.004z312.495z1+2.017z2.522z3

Obviamente, é melhor usar a precisão total dos coeficientes na prática. Aqui está um link para como é o ruído rosa gerado usando esse filtro:

Para a implementação de ponto fixo, como geralmente é mais conveniente trabalhar com coeficientes na faixa [-1,1), será necessário reelaborar a função de transferência. Geralmente, a recomendação é dividir as coisas em seções de segunda ordem , mas parte do motivo (em oposição ao uso de seções de primeira ordem) é a conveniência de trabalhar com coeficientes reais quando as raízes são complexas. Para este filtro específico, todas as raízes são reais e, combinando-as em seções de segunda ordem, provavelmente ainda produziriam alguns coeficientes de denominador> 1, portanto, três seções de primeira ordem são uma escolha razoável, como segue:

H(z)=1b1z11a1z1 1b2z11a2z1 1b3z11a3z1

Onde

a 1 = 0,99516897 , a 2 = 0,94384177 , a 3 = 0,55594526

b1=0.98223157, b2=0.83265661, b3=0.10798089
a1=0.99516897, a2=0.94384177, a3=0.55594526

Alguma escolha criteriosa de sequenciamento para essas seções, combinada com alguma escolha de fatores de ganho para cada seção, será necessária para evitar o estouro. Eu não tentei nenhum dos outros filtros fornecidos no link na resposta de Peter , mas considerações semelhantes provavelmente se aplicariam.

Ruído branco

Obviamente, a abordagem de filtragem requer uma fonte de números aleatórios uniformes em primeiro lugar. Se uma rotina de biblioteca não estiver disponível para uma determinada plataforma, uma das abordagens mais simples é usar um gerador congruencial linear . Um exemplo de implementação eficiente de ponto fixo é dado pela TI na Geração de número aleatório em um TMS320C5x (pdf) . Uma discussão teórica detalhada de vários outros métodos pode ser encontrada nos Métodos de Geração de Números Aleatórios e Monte Carlo, por James Gentle.

Recursos

Vale ressaltar várias fontes baseadas nos links a seguir na resposta de Pedro.

  • O primeiro pedaço de código baseado em filtro faz referência a Introduction to Signal Processing by Orfanidis. O texto completo está disponível nesse link e [no Apêndice B] tem cobertura da geração de ruído rosa e branco. Como o comentário menciona, Orfanidis cobre principalmente o algoritmo Voss.

  • O espectro produzido pelo gerador de ruído rosa Voss-McCartney . Bem perto da parte inferior da página, após extensa discussão sobre variantes do algoritmo Voss, esse link é referenciado em letras cor de rosa gigantes . É uma leitura muito mais fácil do que alguns dos diagramas ASCII anteriores.

  • Uma bibliografia sobre 1 / f Noise de Wentian Li. Isso é mencionado na fonte de Peter e pelo JOS. Ele tem um número estonteante de referências ao ruído 1 / f em geral, que remonta a 1918.


Alguma idéia de como ele apresentou esses coeficientes de filtro? Eu acho que é apenas um ajuste não linear para a inclinação desejada, mas eu ficaria muito interessado em saber se existe um algoritmo mais específico.
Nibot

Meu melhor palpite seria uma das técnicas de aproximação mencionadas em sua tese . É uma ótima leitura de qualquer maneira.
datageist

Uau, isso é um documento e tanto! Obrigado pelo link.
Nibot

1
O problema com o método de ruído branco do filtro é que você não obtém as mesmas relações de fase de magnitude que em uma série temporal autocorrelacionada. Portanto, se você estiver tentando imitar processos naturais, não deverá gerar ruído branco e filtrá-lo. Você deve realmente criar ruído correlacionado automaticamente como uma série temporal, ou seja, o valor atual depende do valor anterior + ruído. Veja nas estatísticas os processos "AR". Você pode testar isso gerando ruído usando os dois métodos, depois a FFT, e plotando real versus imaginário (plano complexo do domínio da frequência). Você notará uma grande diferença no padrão
Paul S

Olá Paul, bem-vindo ao DSP.SE. Se você se importa apenas com o som do ruído (no áudio funciona, por exemplo), o espectro de magnitude é a principal preocupação. Seria ótimo se você pudesse detalhar seus pensamentos em uma nova resposta. Acho que ainda não temos nada no site descrevendo essa técnica.
datageist

1

Eu tenho usado o algoritmo de Corsini e Saletti desde 1990: G. Corsini, R. Saletti, "Um gerador de sequência de ruído de espectro de potência 1 / f ^ gama", IEEE Transactions on Instrumentation and Measurement, 37 (4), dezembro de 1988, 615 -619. O expoente gama está entre -2 e +2. Funciona bem para meus propósitos. Ed

Se essa tentativa de adicionar uma captura de tela funcionar, a figura abaixo mostra um exemplo de como o algoritmo Corsini e Saletti funciona (pelo menos como eu o programava em 1990). A frequência de amostragem foi de 1 kHz, gama = 1 e média de 1000 PSDs de 32k FFT.

PSD para ruído 1 / f via algoritmo Corsini e Saletti


Isso segue o meu post anterior sobre o gerador de ruído Corsini e Saletti (C&S). As próximas duas figuras mostram o desempenho do gerador C&S em relação à geração de ruídos de baixa frequência (gama> 0) e alta frequência (gama <0). A terceira figura compara os PSDs de 1 / f de ruído do gerador C&S (igual ao meu primeiro post) e o Exemplo B.9 1 / f, fornecido no excelente livro do Prof. Orfanidis (eqn B.29, p. 736). Todos esses PSDs são médias de 1000 PSDs de 32k FFT. Eles são todos unilaterais e com subtração média. Para os PSDs da C&S, usei 3 pólos / década e especifiquei 4 décadas (0,05 a 500 Hz) como a faixa utilizável desejada. Portanto, o gerador C&S tinha n = 12 polos e zero pares. A frequência de amostragem foi de 1 kHz, Nyquist foi de 500 Hz e o elemento de resolução foi de pouco mais de 0,0305 Hz. Ed V PSDs de baixa frequência PSDs de alta frequência Comparando 2 geradores de ruído 1 / f

fc10fMfcfM

ai=exp[2π10(iN)/hγ/2hc]
bi=exp[2π10(iN)/hc]
fM=0.5fc


1
Estado de Corsini e Saletti "Este filtro consiste em N seções de primeira ordem em cascata, cada uma com um par pólo-zero real" e os pólos N são "distribuídos uniformemente em relação ao logaritmo de frequência com uma densidade de pólos h por década de frequência (p / d) e os zeros N seguem em conformidade. " A seção Discussão do artigo foi excepcionalmente bem-feita, portanto não havia problema em apenas programar o que eles disseram fazer. Tudo o que tenho é minha cópia impressa antiga e uma cópia digitalizada dela. Para o PSD acima, usei 3 pólos / década e o PSD é subtraído à média e unilateral. Ed V
Ed V
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.