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?
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?
Respostas:
Existem vários. Este site possui uma lista razoável (mas possivelmente antiga):
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. 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:
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.
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