Estoy tratando de implementar un programa que derive la cinemática (específicamente los parámetros cinemáticos: velocidad de rotación media, velocidad, dispersión, coeficientes de hermita h3 y h4) de un espectro de galaxias elípticas. Sé que esto se ha implementado de muchas maneras, la más común en los últimos tiempos es ppxf, pero quiero hacerlo con fines educativos. Empecé trabajando con un espectro (nombre de variable = especificación) de una estrella K2III (dado que son bastante comunes en las galaxias de tipo temprano), eliminé el continuo del espectro y lo reclasifiqué a un tamaño de longitud de onda logarítmica. Luego creé un espectro de galaxias artificiales (variablename = spec_gal), ampliando mi espectro estelar con una pérdida gaussiana con una dispersión de 200 km/s. Por lo tanto, acabo de calcular la convolución entre el espectro estelar y losvd usando np.convolve().
spec_gal = np.convolve(losvd_gauss, spec, mode='same')
¿Por qué los valores de flujo se vuelven tan pequeños cuando convoluciono la pérdida con el espectro? Debería ampliar las líneas de absorción, ¿no? Supongo que es porque multiplico pequeños valores de mi losvd con los valores espectrales.
Como una pequeña prueba, sé que quería recuperar mi losvd del espectro de galaxias sintéticas usando la transformación de Fourier. Como la convolución es multiplicativa en el espacio de Fourier, pensé, podría calcular las transformadas de Fourier de mis espectros usando scipy.fft().
spec_fourier = fft(spec)
spec_gal_fourier = fft(spec_gal)
Y derivar el losvd en el espacio de Fourier dividiendo el espectro de mi galaxia en el espacio de Fourier por el espectro estelar.
losvd_fourier = spec_gal_fourier/spec_fourier
Tracé los valores np.abs() de mis espectros transformados de Fourier. Pensé que podría recuperar mi losvd simplemente realizando la transformada inversa de Fourier usando scipy.ifft().
losvd = ifft(losvd_fourier)
Lo cual no me está dando el resultado correcto (vea el último gráfico a continuación) y agradecería comentarios, comentarios y sugerencias sobre posibles errores en la teoría y la implementación.
En primer lugar, hubo algunos errores en el tratamiento de mis espectros antes de la transformada de Fourier. Así que los pasos que faltaban eran:
1.) Los espectros deben promediarse a 0 restando la mediana.
2.) Debe tocar los espectros en los bordes con una función de ventana (por ejemplo, np.blackman())
3.) Cortar píxeles en ambos extremos de los espectros para evitar discontinuidades
Luego recupera la entrada correcta LOSVD, utilizando el método de deconvolución de división simple en el espacio de Fourier.
UH oh
g = g / g.sum()
, hice una prueba rápida con algunos datos simples y eso parece estar al menos cerca de lo correcto.intento de error
UH oh