<!-- canonical: https://jmrplens.github.io/phonometry/es/signals/spectra/synchronous-averaging/ -->
Source: https://jmrplens.github.io/phonometry/es/signals/spectra/synchronous-averaging/

Una máquina rotativa repite su firma una vez por revolución. Enterrada en el
ruido de banda ancha y en los tonos del resto de los ejes, esa forma de onda
repetitiva es difícil de leer directamente. El **promediado síncrono en el
tiempo** (TSA) la recupera: dado el periodo $T$ de una revolución, trocea el
registro en bloques sucesivos de longitud $T$ y los promedia. Toda componente
síncrona con $T$ se refuerza; todo lo asíncrono, el ruido y los armónicos de
ejes no relacionados, se promedia hasta desaparecer. `time_synchronous_average`
implementa el modelo de P. D. McFadden, *A revised model for the extraction of
periodic waveforms by time domain averaging* (1987).

*Dos cosas que conviene leer por separado. A la izquierda, la ley de $\sqrt N$
haciendo su trabajo: el ruido de un solo periodo tiene un valor eficaz de 0,83
y, tras 40 promedios, la forma de onda promediada se aparta de la verdadera
0,138 en valor eficaz, un factor 6,0 frente al $\sqrt{40} = 6{,}32$ que predice
la ley. A la derecha, la elección que no cuesta nada: en el orden 32,05 el peine
de $N = 20$ vale 6×10⁻¹⁴, mientras que la potencia de dos habitual, $N = 32$,
todavía deja pasar 0,19 del tono interferente. Aquí veinte promedios le ganan a
treinta y dos, y solo por dónde cae el nodo.*

<details>
<summary>Ver el código de esta figura</summary>

```python

from phonometry import (
    comb_filter_response,
    noise_signal,
    time_synchronous_average,
)

fs = 8192.0
period = 1.0 / 32.0        # una revolución: 256 muestras a esta frecuencia
m, n_avg = 256, 40
phase = np.arange((n_avg + 1) * m) / m
periodic = (
    np.cos(2.0 * np.pi * phase)
    + 0.5 * np.cos(2.0 * np.pi * 3.0 * phase + 0.4)
    - 0.3 * np.cos(2.0 * np.pi * 6.0 * phase)
)
recording = periodic + noise_signal(fs, phase.size / fs, rms=0.9, seed=11)
res = time_synchronous_average(recording, fs, period, n_averages=n_avg)

fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(11, 4.6))
t_ms = 1e3 * res.times
ax0.plot(t_ms, recording[:m], color="#cccccc", label="Un periodo ruidoso")
ax0.plot(t_ms, res.period_waveform, color="#1f77b4", lw=1.8,
         label=f"Promedio de N = {n_avg} periodos")
ax0.plot(t_ms, periodic[:m], "--", color="#d62728", label="Forma verdadera")
ax0.set_xlabel("Tiempo [ms]"); ax0.set_ylabel("Amplitud"); ax0.legend()

orders = np.linspace(31.0, 33.0, 4000)
freqs = orders / period
ax1.plot(orders, comb_filter_response(freqs, period, 32), color="#2ca02c",
         label="N = 32 (potencia de dos)")
ax1.plot(orders, comb_filter_response(freqs, period, 20), color="#1f77b4",
         label="N = 20 (nodo en 32,05)")
ax1.axvline(32.05, color="#d62728", ls=":", label="Tono interferente")
ax1.set_xlabel("Frecuencia [órdenes]"); ax1.set_ylabel("Magnitud del filtro peine")
ax1.set_ylim(0, 1.05); ax1.legend()
plt.show()
```

</details>

El método `.plot()` dibuja la forma de onda promediada y el filtro peine en una
sola llamada:

```python
res.plot()          # etiquetas en inglés; res.plot(language="es") en español
```

Antes del álgebra, el procedimiento en sí: un disparo marca cada revolución,
el registro se trocea en cada disparo, y los bloques alineados se promedian:
lo que se repite con el periodo sobrevive intacto mientras el contenido
asíncrono se atenúa.

## 1. El promedio es un filtro peine

Promediar $N$ periodos sucesivos (McFadden Ec. 5),

$$
a(t) = \frac{1}{N} \sum_{n=0}^{N-1} y(t + n\,T),
$$

es, en el dominio de la frecuencia, la multiplicación del espectro de la señal
por un **filtro peine** (Ec. 8). Su magnitud (Ec. 9) es el núcleo de Dirichlet

$$
|C(f)| = \left| \frac{\sin(N\pi f T)}{N \sin(\pi f T)} \right| .
$$

El peine tiene un **diente** de altura unidad en cada armónico $k/T$ (los
órdenes $fT = 1, 2, 3, \dots$), *independiente de $N$*: las componentes
síncronas con el periodo pasan intactas. Entre los dientes tiene **nodos** en
$j/(NT)$ para todo $j$ que no sea múltiplo de $N$, donde la respuesta es
exactamente cero. `comb_filter_response` evalúa esta forma cerrada
directamente:

```python

from phonometry import comb_filter_response

period = 1.0 / 32.0
comb_filter_response(np.array([16.0 / period]), period, 8)   # 1.0 en un diente
comb_filter_response(np.array([0.25 / period]), period, 2)   # 1/sqrt(2)
comb_filter_response(np.array([0.5 / period]), period, 2)    # 0.0 en un nodo
```

`SynchronousAverageResult` lleva la respuesta sobre los primeros armónicos en
`comb_frequencies` y `comb_response`, de modo que la forma del filtro que el
promedio aplicó está disponible junto a la forma de onda recuperada.

## 2. El ruido cae como la raíz cuadrada del número de promedios

El ruido asíncrono de varianza $\sigma^2$ promediado sobre $N$ periodos tiene
varianza residual $\sigma^2/N$: la desviación típica residual cae como
$1/\sqrt{N}$, y la relación señal-ruido en amplitud mejora en $\sqrt{N}$. Eso
es una reducción de potencia de $10\log_{10} N$ dB, declarada como
`noise_reduction_db`, con la ganancia en amplitud $\sqrt{N}$ como
`amplitude_snr_gain`:

```python
res = time_synchronous_average(recording, fs, period, n_averages=100)
res.noise_reduction_db      # 20.0 dB = 10*log10(100)
res.amplitude_snr_gain      # 10.0   = sqrt(100)
res.plot(language="es")     # forma de onda promediada + el peine aplicado
```

*La ley $\sqrt{N}$ medida de principio a fin: el error RMS de la forma de onda
promediada de una firma de engranaje de tres armónicos en ruido de varianza
unidad cae a lo largo de la línea ideal $\sigma/\sqrt{N}$ a medida que el
número de periodos promediados crece de 1 a 128.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

from phonometry import time_synchronous_average

fs = 8192.0
samples = 256
period = samples / fs
m = np.arange(samples) / fs
true = (np.cos(2 * np.pi * m / period)
        + 0.5 * np.cos(2 * np.pi * 3 * m / period + 0.7)
        + 0.25 * np.cos(2 * np.pi * 5 * m / period + 1.1))
rng = np.random.default_rng(5)
recording = np.tile(true, 128) + rng.standard_normal(128 * samples)

counts = [1, 2, 4, 8, 16, 32, 64, 128]
errors = []
for n in counts:
    res = time_synchronous_average(recording[:n * samples], fs, period,
                                   n_averages=n)
    errors.append(np.sqrt(np.mean((res.period_waveform - true) ** 2)))

# Una línea: la forma de onda promediada y el peine que aplicó:
res.plot(language="es")
plt.show()

# La ley sqrt(N) a mano: error medido contra la línea ideal:
fig, ax = plt.subplots()
ax.loglog(counts, errors, "o-", label="error RMS medido")
ax.loglog(counts, 1 / np.sqrt(np.array(counts)), "r--",
          label="sigma/sqrt(N) ideal")
ax.set(xlabel="Número de promedios N", ylabel="Error RMS")
ax.legend()
plt.show()
```

</details>

Esta ley es la ideal: se cumple cuando el ruido no está correlacionado de un periodo
al siguiente, de modo que el ruido de color o síncrono correlacionado entre periodos
no tiene por qué seguirla. El `residual` (entrada menos la reconstrucción
periódica sobre el tramo analizado) y su `residual_rms` indican, por tanto, el
ruido realmente restante una vez eliminada la componente síncrona.

## 3. Elegir N para rechazar un orden interferente

Como hay un diente sobre *todos* los órdenes enteros, el TSA deja pasar los
armónicos del eje objetivo pero también cualquier tono que caiga en un orden
entero. Un tono en un orden *no armónico* $q = fT$ solo es atenuado por el
peine, no eliminado, y cuánto depende de dónde caiga el nodo más cercano. El
resultado del modelo revisado de McFadden es que tal interferente se rechaza
mejor eligiendo $N$ de modo que un nodo caiga exactamente sobre él, es decir,
el menor $N$ con $Nq$ entero, en vez de con el número de promedios potencia
de dos habitual. Un nodo exacto solo existe cuando el orden $q$ es racional, de
modo que algún $N$ finito hace $Nq$ entero; para un orden irracional o solo
estimado, elige el $N$ cuyo nodo caiga más cerca del orden interferente.

Su propio ejemplo es un tono en 32,05 órdenes. Con $N = 20$ el producto
$20 \cdot 32{,}05 = 641$ es entero, así que un nodo del peine cae sobre el tono
y lo rechaza en más de 100 dB. La elección común $N = 32$ da
$32 \cdot 32{,}05 = 1025{,}6$, que se sitúa en un lóbulo lateral: el tono
apenas se toca. La figura de arriba muestra ambos peines en torno al orden 32; el
promedio de extremo a extremo lo confirma:

```python
# 8.º orden verdadero más un interferente fuerte en 32,05 órdenes
phase = np.arange(41 * 256) / 256
recording = np.cos(2 * np.pi * 8.0 * phase) + 0.7 * np.cos(2 * np.pi * 32.05 * phase)

leak_20 = time_synchronous_average(recording, fs, period, n_averages=20)
leak_32 = time_synchronous_average(recording, fs, period, n_averages=32)
# leak_20.period_waveform coincide con el 8.º orden limpio; leak_32 no
```

Así que un número de promedios potencia de dos, por conveniente que sea, no es
en general la elección óptima: los órdenes interferentes presentes en la
máquina deberían fijar $N$.

## De dónde sale el periodo, y cuán estable tiene que ser

Todo lo anterior da $T$ por sabido. En una medición real hay que *medir* $T$, y
la suposición escondida detrás de un `period` escalar es que el eje mantiene ese
periodo durante todo el registro, que es el modo de fallo dominante de la
técnica y falla en silencio.

**Conseguir el periodo.** Instrumenta el eje con un pulso por revolución: un
sensor óptico apuntando a una única tira de cinta reflectante, una sonda
inductiva sobre un chavetero, o la salida de índice de un encóder. Registra ese
canal a la vez que la vibración y toma $T$ como el intervalo medio entre pulsos
a lo largo del tramo analizado. No lo tomes de la velocidad de placa: una placa
de características es un valor nominal, no una medida, y una máquina en carga no
está en su placa.

**Cuán estable tiene que ser.** El álgebra del peine del §1 lo responde con
exactitud. Un error relativo de periodo $\delta$ mueve el $k$-ésimo armónico del
diente del peine en el orden $k$ al orden $k(1+\delta)$, donde el mismo núcleo de
Dirichlet lo atenúa en

$$
\left|\frac{\sin(\pi k N \delta)}{N \sin(\pi k \delta)}\right| ,
$$

de modo que la pérdida crece con el número de armónico **y** con el número de
promedios, justo las dos cosas que uno quiere grandes. Mantener esa pérdida por
debajo de 1 dB pide aproximadamente $k N \delta < 0{,}25$. Promediar 40
revoluciones y esperar el 10.º armónico intacto exige por tanto que el periodo
sea correcto con un error menor que $0{,}25/(10 \times 40) = 6{,}3 \times
10^{-4}$, es decir, una **estabilidad de velocidad del 0,06 %**; el orden 20 con
$N = 40$ exige el 0,03 %. Una máquina que mantiene la velocidad al 1 % pierde
todo lo que hay por encima del primer orden o el segundo, de forma progresiva, y
la forma de onda resultante parece suave, que es lo que se lee como un engranaje
sano.

**Los remedios, por orden.** Toma el periodo del tacómetro y no de la placa;
trocea sobre los intervalos de pulso medidos (un promedio por meseta de
velocidad si la velocidad va a saltos); remuestrea angularmente el registro
contra el tacómetro (seguimiento de órdenes) antes de promediar cuando la
velocidad deriva de forma continua; y si fallan los tres, promedia menos
revoluciones y asume la penalización de $\sqrt{N}$, porque un promedio corto al
periodo correcto vale más que uno largo al periodo equivocado.

**La comprobación de aceptación.** `residual_rms` debería caer como
$1/\sqrt{N}$. Si deja de caer, o la velocidad ha derivado, o lo que queda es
síncrono y ningún número de promedios lo va a eliminar.

### Cómo se monta la medición

- **Transductor y montaje.** Un acelerómetro atornillado o pegado sobre el
  soporte del rodamiento más cercano al engranaje que interesa, con su eje en la
  dirección de la carga. Una base magnética hunde la banda útil a un par de
  kilohercios y esconde los armónicos de engrane que el promedio existe para
  enseñar.
- **La frecuencia de muestreo sale del contenido que quieres conservar.** Un
  piñón de 37 dientes a 1800 r/min engrana a $37 \times 30 = 1110$ Hz, así que
  conservar cinco armónicos de engrane pide $f_\mathrm{s} \ge 2{,}56 \times 5550 =
  14{,}2$ kHz: 16 kHz en la práctica, 25,6 kHz en un analizador que lo ofrezca.
- **Longitud de registro de $N+1$ revoluciones**, con $N$ elegido por la regla de
  los órdenes interferentes del §3 y no por costumbre.
- **Los dos canales en un mismo frontal de muestreo simultáneo**, con la
  ganancia fija durante toda la tirada: un desfase entre canales desplaza cada
  frontera de bloque y gira la forma de onda promediada.
- **Anota el punto de funcionamiento** (velocidad, carga, temperatura del
  aceite), porque una forma de onda TSA solo es comparable con otra tomada en el
  mismo punto.

## 4. Muestras por periodo no enteras

Cuando $f_\mathrm{s} T$ es entero, las fronteras de periodo caen sobre muestras, los
bloques se trocean directamente y una señal periódica sin ruido se recupera
con precisión de máquina (`interpolated` es `False`). Cuando $f_\mathrm{s} T$ no es
entero las fronteras caen entre muestras; cada bloque se alinea entonces a una
malla entera común mediante el retardo fraccionario de banda limitada de
[`fractional_delay`](/phonometry/es/signals/spectra/test-signals/), y la forma de onda
se recupera dentro de ese error de interpolación (`interpolated` es `True`):

```python
fs = 8192.0
period = 1.0 / 31.7                       # fs * period no es entero
t = np.arange(int(40 * period * fs)) / fs
recording = np.cos(2.0 * np.pi * t / period)  # un ciclo por revolución
res = time_synchronous_average(recording, fs, period)
res.interpolated                          # True: alineación por retardo fraccionario
res.samples_per_period                    # muestras enteras de un periodo
```

Por defecto el promedio usa tantos periodos completos como contenga el
registro; pasa `n_averages` para fijar el número (para la elección de nodo del
§3), y `n_harmonics` para fijar cuántos armónicos de $1/T$ abarca la respuesta
del peine devuelta.

La alineación de banda limitada comparte su núcleo con la alineación
submuestral de respuestas al impulso de la
[página de señales de prueba](/phonometry/es/signals/spectra/test-signals/), y la forma
de onda recuperada, al ser exactamente un periodo, puede repetirse para
reconstruir la parte síncrona de la señal, para restarla o para análisis de
órdenes.

## Qué herramienta de diagnóstico, y cuándo

El promediado síncrono, el cepstrum y el espectro de la envolvente responden
preguntas distintas sobre una máquina rotativa, y se componen en lugar de
competir:

- **El promediado síncrono** necesita el periodo (un pulso de tacómetro o
  una velocidad de eje fiable) y devuelve *la forma de onda misma*, una
  revolución completa: la herramienta cuando quieres ver qué hace un eje o
  un engranaje concreto por vuelta, diente a diente.
- **El [cepstrum](/phonometry/es/signals/spectra/cepstrum-echoes/)** no necesita
  referencia y detecta *cualquier* familia periódica del espectro
  (armónicos, bandas laterales): la herramienta cuando el periodo es
  desconocido o varias familias se solapan y hay que separarlas.
- **El [espectro de la envolvente](/phonometry/es/signals/spectra/cepstrum-echoes/#5-el-espectro-de-la-envolvente-modulaciones-como-líneas)**
  encuentra periodicidades de la *amplitud*: la herramienta para los fallos
  de rodamiento, cuya tasa de repetición modula una resonancia de alta
  frecuencia en lugar de aparecer como un tono grave.

La composición es práctica habitual: promedia síncronamente primero y
resta después; el campo `residual` es el registro con la parte síncrona
eliminada, exactamente sobre lo que conviene ejecutar el espectro de la
envolvente cuando las componentes fuertes del engranaje ya no enmascaran la
modulación.

Lo que sale de esa cadena es un conjunto de *rayas*, y el diagnóstico lo lleva
su frecuencia, no su amplitud. Las familias cinemáticas de la máquina (las
frecuencias de paso de bola por la pista exterior y por la interior, el giro de
la bola, la jaula, la frecuencia de engrane y sus bandas laterales a la
frecuencia de eje, el paso de pala, el deslizamiento del motor y el paso de
polos) se calculan a partir de la geometría y la velocidad de eje, y se dibujan
sobre el espectro de la envolvente medido en
[frecuencias de fallo de máquinas](/phonometry/es/vibration/machinery/machine-diagnostics/).
Como esas familias se expresan en *órdenes del eje*, la misma señal de
tacómetro que fija el periodo de promediado fija también las frecuencias de las
familias: un error de velocidad corrompe a la vez el promediado y la
identificación.

## Qué cubre esta guía

El modelo revisado de McFadden para el promediado en el dominio del tiempo
(*Mechanical Systems and Signal Processing*, 1987): la descripción por filtro
peine del promedio (Ec. 8, magnitud Ec. 9) implementada por
`comb_filter_response`, la ley de reducción de ruido en raíz cuadrada expuesta
como `noise_reduction_db` y `amplitude_snr_gain`, y la elección de $N$ que
sitúa un nodo del peine sobre un orden interferente, siguiendo el propio
ejemplo del artículo con el orden 32,05. `time_synchronous_average` también
implementa la alineación de banda limitada por retardo fraccionario usada
cuando $f_\mathrm{s} T$ no es entero.

El TSA necesita un periodo conocido; encontrar ese periodo, o detectar
familias periódicas sin conocerlo, es tarea del
[cepstrum](/phonometry/es/signals/spectra/cepstrum-echoes/), no de esta
página. Localizar periodicidades de modulación de amplitud, como los fallos de
rodamiento, es el [espectro de la
envolvente](/phonometry/es/signals/spectra/cepstrum-echoes/#5-el-espectro-de-la-envolvente-modulaciones-como-líneas),
también fuera de esta página. El artículo de McFadden no es una norma de
certificación, así que no hay ningún apartado de cumplimiento contra el que
comprobar la implementación.

## Véase también

- [Cepstrum y ecos](/phonometry/es/signals/spectra/cepstrum-echoes/): detección sin referencia de familias de armónicos y bandas laterales, y el espectro de la envolvente.
- [Correlación y retardo](/phonometry/es/signals/spectra/correlation-delay/): la envolvente de Hilbert que sustenta el análisis de envolvente.
- [Señales de prueba](/phonometry/es/signals/spectra/test-signals/): el núcleo de retardo fraccionario que usa la alineación de periodo no entero.
- [Frecuencias de fallo de máquinas](/phonometry/es/vibration/machinery/machine-diagnostics/): las familias de rodamientos y engranajes contra las que se lee el espectro de la envolvente del residuo.
- Referencia de la API: [`signals.synchronous_average`](/phonometry/es/reference/api/signals/synchronous-average/).
