<!-- canonical: https://jmrplens.github.io/phonometry/es/guides/transfer-stiffness/ -->
Source: https://jmrplens.github.io/phonometry/es/guides/transfer-stiffness/

La propiedad de transferencia vibroacústica de un elemento resiliente (un
aislador de vibraciones, montura, fuelle o manguera) es su **rigidez dinámica de
transferencia** `k₂₁`, el cociente dependiente de la frecuencia entre la *fuerza
de bloqueo* en el lado de salida (receptor) y el desplazamiento en el lado de
entrada (fuente) (ISO 10846-1, 3.7):

$$
k_{2,1} = \frac{F_{2,b}}{u_1} \quad [\mathrm{N/m}].
$$

Como un aislador de vibraciones solo es eficaz entre estructuras de gran rigidez
en el punto de excitación, la fuerza que entrega al receptor aproxima esta fuerza
de bloqueo (ISO 10846-1, Ec. 7), de modo que `k₂₁` es la magnitud que caracteriza
la transmisión del aislador. `k₂₁` alimenta las normas de fuente estructural y
de predicción en edificación: ISO 9611, EN 15657 y EN 12354-5.

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

```python

from phonometry import vibration

# Aislador Kelvin-Voigt k + jwc cargado con una masa de bloqueo de 8 kg.
k, c, m2 = 1.0e6, 120.0, 8.0
f0 = np.sqrt(k / m2) / (2.0 * np.pi)
f = np.logspace(np.log10(f0 / 5.0), np.log10(f0 * 40.0), 600)

k_true = k + 1j * 2.0 * np.pi * f * c
t = vibration.base_transmissibility(f, m2, k, c)
k_indirect = vibration.transfer_stiffness_indirect(f, t, m2)  # avisa donde T no es pequeña

# Una línea: la determinación indirecta empaquetada como resultado dibuja su
# propio espectro de nivel Lk(f):
res = vibration.indirect_transfer_stiffness_result(f, t, blocking_mass=m2)
res.plot(language="es")
plt.show()

# A mano, la rigidez verdadera del elemento frente a la estimación indirecta:
fig, ax = plt.subplots()
ax.semilogx(f, vibration.transfer_stiffness_level(k_true),
            label="$L_k$ real de $k+j\\omega c$")
ax.semilogx(f, vibration.transfer_stiffness_level(k_indirect), "--",
            label="método indirecto $-(2\\pi f)^2 m_2 T$")
ax.axvline(f0, color="0.6", linestyle=":", label="resonancia $f_0$")
ax.set(xlabel="Frecuencia [Hz]", ylabel="Nivel de rigidez de transferencia $L_k$ [dB re 1 N/m]")
ax.grid(True, which="both", alpha=0.3)
ax.legend()
plt.show()
```

</details>

## 1. El nivel de rigidez de transferencia y el factor de pérdidas

Los resultados se expresan como un **nivel** re la rigidez de referencia
`k₀ = 1 N/m` (ISO 10846-2 y -3, 3.17) y, en el rango de baja frecuencia donde las
fuerzas de inercia del elemento son despreciables, el **factor de pérdidas** es
la tangente del ángulo de fase de `k₂₁` (ISO 10846-1, 3.8):

$$
L_k = 10\lg\frac{|k_{2,1}|^2}{k_0^2} = 20\lg\frac{|k_{2,1}|}{k_0}, \qquad
\eta = \frac{\mathrm{Im}(k_{2,1})}{\mathrm{Re}(k_{2,1})}.
$$

```python
from phonometry import vibration

# Una montura resiliente con |k2,1| = 1 MN/m y un factor de pérdidas del 5 %:
k = 1e6 * (1.0 + 0.05j)
print(round(float(vibration.transfer_stiffness_level(k)), 2))   # 120.00  dB re 1 N/m
print(round(float(vibration.loss_factor(k)), 3))                # 0.05
```

## 2. Determinación directa e indirecta

¿Por qué una fuerza *bloqueada* y no, por ejemplo, la transmisibilidad del
aislador? Porque una transmisibilidad es una propiedad del conjunto completo:
cambia con las masas y rigideces que el aislador conecte en cada caso, así
que unos datos medidos en un banco no se trasladarían a otra instalación. La
fuerza bloqueada por unidad de desplazamiento de entrada es una propiedad del
elemento solo, y predice la fuerza que el elemento entrega a cualquier
receptor mucho más rígido que el propio elemento, que es exactamente la
situación para la que se diseña un aislador de vibración. Por eso ISO 10846
intercala el aislador entre una masa de entrada excitada y una salida que
está o bien bloqueada rígidamente o bien cargada con una masa conocida:

El **método directo** (ISO 10846-2) mide la fuerza de salida bloqueada y el
desplazamiento de entrada, `k₂₁ = F₂,b/u₁`. El **método indirecto** (ISO 10846-3)
carga la salida con una masa de bloqueo compacta `m₂` y mide la transmisibilidad
de vibración `T = u₂/u₁`; la fuerza de bloqueo es entonces la fuerza de inercia de
la masa (ISO 10846-3, Ec. 1):

$$
k_{2,1} = -(2\pi f)^2\,(m_2 + m_f)\,T \qquad (T \ll 1),
$$

con `m_f` la masa de la brida de salida. La aproximación es válida bastante por
encima de la resonancia masa/resorte, donde `T` es pequeña.

```python

from phonometry import vibration

# Método indirecto: masa de bloqueo de 10 kg, transmisibilidad 0,01 a 500 Hz.
k = vibration.transfer_stiffness_indirect(500.0, 0.01, blocking_mass=10.0)
print(f"{abs(complex(k)):.3e}")            # 9.870e+05  N/m

# Agrupa una medición en barrido en un resultado con su nivel y factor de pérdidas:
f = np.logspace(1.5, 3.3, 200)
t = vibration.base_transmissibility(f, mass=8.0, stiffness=1e6, damping=120.0)
res = vibration.indirect_transfer_stiffness_result(f, t, blocking_mass=8.0)
print(round(float(res.level[-1]), 1))      # ~126  dB re 1 N/m (alta f)

res.plot()   # el espectro de nivel Lk(f), como en la figura de arriba (requiere matplotlib)
```

El `TransferStiffnessResult` transporta el `k₂₁` complejo y expone `.level`,
`.loss_factor`, `.magnitude`, `.to("impedance"/"apparent_mass")` y `.plot()`.

Los dos métodos se reparten el eje de frecuencia. El método directo funciona
desde 1 Hz, el límite inferior del alcance de ISO 10846-2 (en la práctica el
suelo lo fijan el banco y su instrumentación), hasta donde se cuelan las
resonancias propias del banco (típicamente unos pocos cientos de hercios
para elementos grandes); el método indirecto solo es válido bastante por
encima de la
resonancia masa de bloqueo/resorte, donde la transmisibilidad es pequeña, y
extiende la caracterización hasta el rango de kilohercios. Un conjunto de
datos completo de un aislador suele ser el empalme de ambos.

## 3. Validez del método indirecto

La ISO 10846-3 (apartado 6) exige que la aproximación `T ≪ 1` sea exacta dentro
de **1 dB** (12 % de la magnitud de la rigidez), lo que acota el rango de
frecuencia utilizable por ambos lados:

* **Desadaptación de impedancias (Desigualdad 2).** Válido solo donde
  `ΔL₁,₂ = La₁ − La₂ ≥ 20 dB`, es decir, `|T| ≤ 0,1` (la constante
  `TRANSMISSIBILITY_LIMIT`). `transfer_stiffness_indirect` calcula el `|T|`
  por banda y emite un `PhonometryWarning` cuando alguna banda lo supera
  (habitual cerca o por debajo de la resonancia masa/resorte, como en la
  figura anterior).
* **Masa de bloqueo rígida (Desigualdad 3).** Por encima de una frecuencia
  superior `f₃` la masa de bloqueo deja de moverse como cuerpo rígido; los
  resultados solo son válidos mientras su masa efectiva medida
  `m₂,eff = 2F₂/(a′₁ + a″₁)` (Ec. 4) se mantenga dentro de 1 dB de la masa
  rígida: `10 lg(m₂,eff²/m₂²) ≤ 1 dB`.
* **Linealidad (apartado 7.6).** Dos espectros de entrada separados 10 dB
  deben dar niveles de rigidez de transferencia dentro de 1,5 dB.

La propia idealización de la fuerza de bloqueo la cuantifica la ISO 10846-1,
Ec. (6): para un aislador con rigidez en el punto de excitación de salida
`k₂,₂` sobre una terminación de rigidez `k_t`, la fuerza entregada es
`F₂/F₂,b = 1/(1 + k₂,₂/k_t)`, dentro del 10 % de la fuerza de bloqueo para
`|k₂,₂| < 0,1 |k_t|` (Ec. 7):

```python

from phonometry import vibration

# |T| = 0,5 viola la Desigualdad (2): el resultado indirecto queda avisado.
with warnings.catch_warnings(record=True) as caught:
    warnings.simplefilter("always")
    vibration.transfer_stiffness_indirect(50.0, 0.5, blocking_mass=10.0)
print(caught[0].category.__name__)                     # PhonometryWarning

# Aproximación de la fuerza de bloqueo en el límite del 10 % (ISO 10846-1, Ec. 6):
print(round(abs(complex(vibration.blocking_force_ratio(1e5, 1e6))), 4))   # 0.9091
```

## 4. Relación con la familia de FRF

La rigidez dinámica es un miembro de la familia de funciones de respuesta en
frecuencia (ISO 10846-1, Anexo A / Tabla A.2): es la recíproca de la receptancia
y se relaciona con la impedancia mecánica `Z` y la masa efectiva `m_eff` por
`k = jω·Z = −ω²·m_eff`. Estas conversiones son el mismo pivote `convert_frf` de la
[movilidad mecánica](/phonometry/es/guides/mechanical-mobility/):

```python
from phonometry import vibration

k = 1e6 + 5e4j                                  # N/m, a 250 Hz
Z = vibration.convert_frf(k, 250.0, "dynamic_stiffness", "impedance")
print(abs(complex(vibration.convert_frf(Z, 250.0, "impedance", "dynamic_stiffness"))))  # 1.0012e6
```

## 5. Ficha de informe

`TransferStiffnessResult.report(path)` genera un informe de caracterización de
la rigidez dinámica de transferencia de un elemento resiliente de una página
(definición de la ISO 10846-1:2008; determinada por el método directo,
ISO 10846-2:2008, o el método indirecto de masa de bloqueo, ISO 10846-3:2002).
La rigidez de transferencia es una función de respuesta en frecuencia continua,
no una magnitud por bandas de octava, de modo que la ficha la presenta con
honestidad como el espectro de nivel $L_k(f)$ más una tabla compacta de puntos
característicos (el método de determinación, la masa de bloqueo del método
indirecto, el rango de frecuencias y la meseta de rigidez a baja frecuencia
$|k_{2,1}|$, su nivel $L_k$ y el factor de pérdidas allí), y un $L_k$ a baja
frecuencia enmarcado (la meseta que caracteriza el elemento por debajo de sus
resonancias internas). Es una caracterización, así que no hay veredicto de
aprobado/no aprobado; `language="es"` genera la ficha en español. La ficha
siempre incrusta el espectro $L_k(f)$, por lo que necesita los extras de informe
y de gráficos (`pip install "phonometry[report,plot]"`).

```python

from phonometry import ReportMetadata, TransferStiffnessResult, transfer_stiffness_direct

freqs = np.array([20, 31.5, 50, 80, 125, 200, 315, 500, 800, 1250, 2000], dtype=float)
k21 = 1e6 + 1j * (2 * np.pi * freqs) * 80.0     # elemento Kelvin-Voigt k + jwc
u1 = 1e-6 + 0j
k = transfer_stiffness_direct(k21 * u1, u1)     # método directo: k2,1 = F2,b/u1
res = TransferStiffnessResult(frequencies=freqs, transfer_stiffness=k)
res.report(
    "rigidez_transferencia.pdf",
    metadata=ReportMetadata(
        specimen="Aislador de vibraciones de caucho",
        measurement_standard="ISO 10846-2",
    ),
    language="es",
)   # ficha de una página (necesita phonometry[report,plot])
```

## Qué cubre esta guía

**Cubierto.** La definición `k₂₁ = F₂,b/u₁` de la ISO 10846-1:2008, el nivel
(ISO 10846-2 y -3, 3.17) y el factor de pérdidas (ISO 10846-1, 3.8)
(`transfer_stiffness_level`, `loss_factor`), el método directo de la
ISO 10846-2:2008 (`transfer_stiffness_direct`) y el método indirecto de la
ISO 10846-3:2002 de la Fórmula 1 (`transfer_stiffness_indirect`). También
están implementadas la aproximación de la fuerza de bloqueo de las
Ecuaciones 6-7 (`blocking_force_ratio`) y las relaciones FRF del Anexo A /
Tabla A.2 (`convert_frf`). `TransferStiffnessResult` agrupa una
determinación en barrido, y `.report()` genera la ficha de caracterización.

**No cubierto.** Las Partes 4 y 5 de la serie ISO 10846, que cubren
elementos distintos de los soportes resilientes y el método de punto de
excitación en baja frecuencia, no están implementadas.
`transfer_stiffness_indirect` solo comprueba la Desigualdad 2 (el límite de
transmisibilidad `|T| ≤ 0,1`): la Desigualdad 3, la comprobación de masa de
bloqueo rígida de la Fórmula 4, se describe pero no se calcula
automáticamente. El criterio de linealidad del apartado 7.6 (dos espectros
de entrada separados 10 dB dentro de 1,5 dB) tampoco se comprueba en el
código.

## Véase también

- Referencia de la API: [`vibration.transfer_stiffness`](/phonometry/es/reference/api/vibration/transfer-stiffness/) y [`vibration.mechanical_mobility`](/phonometry/es/reference/api/vibration/mechanical-mobility/).
