Como posso calcular um espectro de energia com espaçamento de log?

20

Eu gostaria de calcular um espectro de potência no qual as frequências são espaçadas logaritmicamente.

No método de Welch, há uma troca entre a resolução de frequência do espectro de potência resultante e o número de médias (isto é, erro no resultado). Eu gostaria que esse trade-off fosse dinâmico, ou seja, faça menos médias para pontos de baixa frequência para ter uma resolução mais precisa em baixa frequência.

Existe uma maneira padrão de fazer isso?

Suponho que uma maneira seria inicialmente fazer pwelchcom uma resolução muito alta (baixo número de médias) e, em seguida, refinar o espectro resultante usando o binar logarítmico.

nibot
fonte
2
Geralmente calculo espectro regular e, em seguida, simplesmente planto os dados em uma escala de log. Não tenho certeza se é possível, sem usar diretamente a definição modificada de DFT, mas estou interessado em ver se realmente há maneiras.
Phonon
Pergunta SO relacionada ao OP para os interessados.
Lorem Ipsum
Outra questão relacionada no SO: stackoverflow.com/questions/9849233/...
nibot

Respostas:

9

Encontrei um artigo que aborda essa questão diretamente:

As primeiras figuras do artigo ilustram bem o problema que esse algoritmo resolve, e as referências contêm uma bibliografia útil de outras abordagens (transformação Q constante, transformação de Fourier temperada, artigo de pesquisa etc.).

Sua abordagem não é refazer a saída de uma estimativa do espectro de potência baseada em FFT, mas calcular apenas a transformada de Fourier discreta nas frequências de interesse (espaçadas logaritmicamente). Para cada frequência a ser estimada, eles basicamente implementam o algoritmo de Welch, mas com um comprimento de transformação (e, portanto, também, número de médias) escolhido especificamente para cada frequência. O cálculo de cada compartimento de frequência usa toda a série temporal, mas segmentada de maneira diferente. Os resultados têm a propriedade desejável de que a resolução (largura do compartimento) seja uma função suave da frequência e os resultados podem ser calibrados como uma densidade espectral de potência ou um espectro de potência.

Implementação do Matlab aqui: https://github.com/tobin/lpsd

insira a descrição da imagem aqui Divulgação: Os autores deste artigo estão na mesma instituição que eu.

nibot
fonte
1
Quais seriam os benefícios de calcular um espectro dessa maneira? Qual é a motivação para esse método?
21412 Spacey
1
Pode ser mais rápido do que computar o espectro de energia usando a FFT e, em seguida, reiniciar em algumas circunstâncias.
Nibot
Comecei uma implementação em Python: github.com/rudolfbyker/lpsd Ele ainda precisa de teste. Contribuições são bem-vindas.
Rudolfbyker
1

Nesse caso, eu usaria um método de mínimos quadrados para calcular a frequência de alguma lista de valores conhecida. O método mais comum é o método Lomb. Funciona de maneira bastante semelhante a uma FFT ou DFT, mas calcula apenas a frequência em frequências determinadas e pode lidar com dados ausentes, caso isso seja um problema. A ideia é a seguinte:

  1. w
  2. wtjXj

Px(ω)=12([jXjcosω(tjτ)]2jcos2ω(tjτ)+[jXjsinω(tjτ)]2jsin2ω(tjτ))

Observe que isso não será tão bem quanto um FFT, portanto, eu o faria apenas se o número de frequências desejadas for muito menor do que o FFT, que seria necessário para coletar todos os dados.

Caso contrário, poderia-se fazer um método de interpolação ou qualquer outra re-amostragem de uma FFT ou DFT.

PearsonArtPhoto
fonte