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.
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 / f--√f
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:
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:
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.
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
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
Respostas:
Existem vários. Este site possui uma lista razoável (mas possivelmente antiga):
fonte
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:
Os coeficientes do filtro que ele fornece são os seguintes:
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:
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:
Onde
a 1 = 0,99516897 , a 2 = 0,94384177 , a 3 = 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.
fonte
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.
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
fonte