Saltar al contenido

Numpy Root-Mean-Squared (RMS) suavizado de una señal

Posteriormente a investigar con expertos en este tema, programadores de diversas áreas y maestros dimos con la respuesta al dilema y la plasmamos en este post.

Solución:

Eso es posible usar convolución para realizar la operación a la que se refiere. Lo hice un par de veces para procesar señales de EEG también.

import numpy as np
def window_rms(a, window_size):
  a2 = np.power(a,2)
  window = np.ones(window_size)/float(window_size)
  return np.sqrt(np.convolve(a2, window, 'valid'))

Desglosándolo, el np.power(a, 2) parte hace una nueva array con la misma dimensión que apero donde cada valor se eleva al cuadrado. np.ones(window_size)/float(window_size) produce un array o longitud window_size donde esta cada elemento 1/window_size. Así que la convolución efectivamente produce una nueva array donde cada elemento i es igual a

(a[i]^2 + a[i+1]^2 + … + a[i+window_size]^2)/window_size

que es el valor RMS de la array elementos dentro de la ventana móvil. Debería funcionar muy bien de esta manera.

Tenga en cuenta, sin embargo, que np.power(a, 2) produce un nuevo array de misma dimensión. Si a es De Verdad grande, me refiero a lo suficientemente grande como para que no quepa dos veces en la memoria, es posible que necesite una estrategia en la que cada elemento se modifique en su lugar. También el 'valid' El argumento especifica que se descarten los efectos de borde, lo que resulta en una menor array producido por np.convolve(). Podría conservarlo todo especificando 'same' en su lugar (ver documentación).

Si eres capaz, tienes la habilidad dejar una noticia acerca de qué te ha parecido este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *