¿Cómo puedo calcular un espectro de potencia con espacio de registro?

20

Me gustaría calcular un espectro de potencia en el que las frecuencias están logarítmicamente espaciadas.

En el método de Welch, existe una compensación entre la resolución de frecuencia del espectro de potencia resultante y el número de promedios (es decir, error en el resultado). Me gustaría que esta compensación sea dinámica, es decir, hacer menos promedios para puntos de baja frecuencia para tener una resolución más fina a baja frecuencia.

¿Hay una forma estándar de hacer esto?

Supongo que una forma sería hacer inicialmente pwelchcon una resolución muy alta (bajo número de promedios), y luego refinar el espectro resultante usando binning logarítmico.

nibot
fuente
2
Usualmente calculo el espectro regular y luego simplemente trazo los datos en una escala logarítmica. No estoy seguro de que sea posible sin usar la definición modificada de DFT directamente, pero estoy interesado en ver si realmente hay formas.
Phonon
Pregunta SO relacionada con OP para los interesados.
Lorem Ipsum
Otra pregunta relacionada sobre SO: stackoverflow.com/questions/9849233/…
nibot

Respuestas:

9

Encontré un artículo que aborda esta pregunta directamente:

Las primeras figuras en el documento ilustran muy bien el problema que resuelve este algoritmo, y las referencias contienen una bibliografía útil de otros enfoques (transformación Q constante, transformación de Fourier templada, un artículo de encuesta, etc.).

Su enfoque no es volver a enlazar la salida de una estimación de espectro de potencia basada en FFT existente, sino solo calcular la transformada de Fourier discreta en las frecuencias de interés (espaciadas logarítmicamente). Para cada frecuencia a estimar, básicamente implementan el algoritmo de Welch, pero con una longitud de transformación (y, por lo tanto, también un número de promedios) elegidos específicamente para cada frecuencia. El cálculo de cada intervalo de frecuencia utiliza la serie de tiempo completa, pero segmentada de manera diferente. Los resultados tienen la propiedad deseable de que la resolución (ancho del depósito) es una función suave de la frecuencia, y los resultados pueden calibrarse como una densidad espectral de potencia o un espectro de potencia.

Implementación de Matlab aquí: https://github.com/tobin/lpsd

ingrese la descripción de la imagen aquí Divulgación: Los autores de este artículo están en la misma institución que yo.

nibot
fuente
1
¿Cuáles serían los beneficios de calcular un espectro de esta manera? ¿Cuál es la motivación para este método?
Spacey
1
Puede ser más rápido que calcular el espectro de potencia usando el FFT y luego volver a cambiar en algunas circunstancias.
nibot
Comencé una implementación de Python: github.com/rudolfbyker/lpsd Todavía necesita pruebas. Las contribuciones son bienvenidas.
rudolfbyker
1

En este caso, usaría un método de mínimos cuadrados para calcular la frecuencia de alguna lista de valores conocida. El método más común es el método Lomb. Funciona bastante similar a una FFT o DFT, pero solo calculará la frecuencia a frecuencias predeterminadas, y podría manejar los datos faltantes, en caso de que sea un problema. La idea es la siguiente:

  1. Decidir una lista de frecuencias (w) sobre el cual calcular, que se ajustan a las bandas de frecuencia deseadas en las que desea muestrear.
  2. Dadas las frecuencias w, tiempos en que fueron muestreados tjy valores Xj, encuentre el poder de las frecuencias de la siguiente manera:

PAGSX(ω)=12([jXjcosω(tj-τ)]2jcos2ω(tj-τ)+[jXjpecadoω(tj-τ)]2jpecado2ω(tj-τ))

Tenga en cuenta que esto no se escalará tan bien como lo haría una FFT, por lo que solo haría esto si el número de frecuencias deseadas es mucho menor que la FFT que se requeriría para recopilar todos los datos.

De lo contrario, se podría hacer un método de interpolación o cualquier otro muestreo de una FFT o DFT.

PearsonArtPhoto
fuente