Ir al contenido

Distorsión con barridos y utilidades de fase

Normas aplicables: 108th AES ConventionReferencias: Novak et al. 2015Müller y Massarani 2001Bendat y Piersol 2010

Un solo barrido sinusoidal exponencial caracteriza a la vez la respuesta lineal y todos los órdenes de distorsión armónica de un sistema débilmente no lineal. Tras la deconvolución, los productos de distorsión de orden se empaquetan en respuestas al impulso separadas que preceden a la respuesta lineal con el adelanto fijo (Farina 2000)

de modo que enventanar cada llegada produce las respuestas en frecuencia armónicas y, a partir de ellas, la distorsión armónica total en función de la frecuencia de excitación con un barrido en lugar de un recorrido tono a tono. Esta página cubre esa separación en phonometry.electroacoustics, con el barrido sincronizado de Novak, Lotton y Simon (2015), coherente en fase, como método por defecto, y las utilidades de fase que la acompañan en phonometry.signals: fase mínima desde , retardo de grupo y exceso de fase.

En un barrido exponencial la frecuencia instantánea crece como , así que en el momento en que la excitación pasa por , el producto de distorsión del armónico n aparece en : exactamente donde estará el propio barrido segundos después. Deconvolucionar la grabación contra el barrido comprime por tanto cada orden en su propia respuesta al impulso, antes de la lineal. swept_sine_distortion enventana cada llegada (con el alineado exacto de fracción de muestra), la transforma en y lee la distorsión de orden a la frecuencia de excitación de :

La cadena es exactamente el esquema siguiente: reproducir el barrido, grabar, convolucionar con el filtro inverso, y los armónicos caen por delante de la respuesta lineal con sus adelantos fijos.

Cadena de medición de distorsión con barrido sinusoidal: un barrido exponencial de 20 Hz a 6 kHz en T igual a 4 s excita el dispositivo débilmente no lineal, la grabación se deconvoluciona con el filtro inverso invertido en el tiempo con su pendiente de +6 dB por octava, y en el eje temporal resultante la respuesta al impulso lineal h1 queda en t igual a cero mientras las respuestas de los armónicos segundo, tercero y cuarto aparecen como prellegadas menores en sus propias ventanas discontinuas, adelantadas L por ln n, 0,49 s para h2 y 0,77 s para h3 con L igual a 0,70 sCadena de medición de distorsión con barrido sinusoidal: un barrido exponencial de 20 Hz a 6 kHz en T igual a 4 s excita el dispositivo débilmente no lineal, la grabación se deconvoluciona con el filtro inverso invertido en el tiempo con su pendiente de +6 dB por octava, y en el eje temporal resultante la respuesta al impulso lineal h1 queda en t igual a cero mientras las respuestas de los armónicos segundo, tercero y cuarto aparecen como prellegadas menores en sus propias ventanas discontinuas, adelantadas L por ln n, 0,49 s para h2 y 0,77 s para h3 con L igual a 0,70 s

Los adelantos los fija el barrido por sí solo — aquí s — y no el dispositivo, que es la razón de que las mismas ventanas sirvan para cualquier sistema débilmente no lineal y de que alargar el barrido sea lo que compra separación.

import numpy as np
from phonometry import swept_sine_distortion, synchronized_sweep_signal
fs, f1, f2, seconds = 48000, 20.0, 6000.0, 4.0
x = synchronized_sweep_signal(fs, f1, f2, seconds) # reproducir esto...
# ... grabar la respuesta del dispositivo en `y` (con su cola de caída) ...
res = swept_sine_distortion(y, fs, f1, f2, seconds, n_harmonics=3)
res.harmonic_responses # H1..H3 complejas sobre res.frequencies
res.thd, res.thd_frequencies
res.distortion_ratios # |Hn(n f)| / |H1(f)| por orden
res.plot() # magnitudes |Hn| + THD(f)

Una curva de THD(f) es una propiedad del dispositivo a un solo nivel de excitación, así que hay que publicarla con ese nivel y, si la medición es acústica, con el nivel de presión acústica que produjo en el micrófono. El mismo altavoz medido 6 dB más fuerte devuelve una curva varios decibelios más alta y con otra forma, porque los mecanismos que dominan cambian con la excursión. Elige el nivel entre dos paredes: lo bastante alto para que los armónicos destaquen sobre el fondo, porque la ganancia de proceso de la deconvolución ayuda mucho más a la respuesta lineal que a las prellegadas, y lo bastante bajo para que no recorte ni el dispositivo ni ningún conversor de la cadena, porque un registro recortado fabrica exactamente los armónicos de orden impar que se están midiendo, y en todas las ventanas. Ten en cuenta además que un barrido tiene un factor de cresta mucho más bajo que una ráfaga tonal, así que a igual amplitud de pico entrega más energía y exige más al dispositivo que un ensayo con tono al mismo nivel nominal.

Hay cuatro cosas que fijar antes de la primera toma:

import numpy as np
# `synchronized_sweep_signal` y `swept_sine_distortion` importados arriba.
x = synchronized_sweep_signal(fs, f1, f2, seconds, amplitude=0.5, fade=0.02)
# ... reproduce x, graba y, y sigue grabando hasta que la caída se apague ...
res = swept_sine_distortion(y, fs, f1, f2, seconds, n_harmonics=3,
amplitude=0.5, fade=0.02)
  • amplitude es la referencia contra la que se calculan el devuelto y todas las razones, así que tiene que ser el nivel realmente reproducido, y el mismo valor tiene que llegar a las dos llamadas: el análisis toma 1.0 por defecto, así que un barrido generado a 0.5 y analizado con el valor por defecto devuelve una ganancia 6 dB baja.
  • fade aplica un breve enventanado de medio Hann en los dos extremos. Vale 0 por defecto porque el análisis es exacto sobre el barrido sin fundido, pero un barrido sin fundido empieza y acaba en una discontinuidad a plena amplitud que suena como un chasquido a través de un amplificador y un altavoz reales y reparte energía por todo el eje temporal de los armónicos. El mismo valor hay que pasarlo al análisis, o la deconvolución queda desemparejada; 20 ms solo retocan los bordes extremos de la banda.
  • Recorte. Comprueba todas las etapas, no solo el conversor: cualquier elemento que recorte antes del que está bajo ensayo destruye el sentido de la medición.
  • La cola. Graba el barrido más toda su caída, o las prellegadas armónicas se enrollan por la deconvolución circular hasta el final de la respuesta lineal.

Hay dos modos de fallo silenciosos en vez de evidentes. El método supone que el sistema no cambia durante el barrido, así que un ventilador en marcha, una persona que se mueve, una bobina móvil que se calienta o una temperatura de sala que deriva descorrelacionan la parte final del barrido de la inicial y aparecen como un suelo de ruido levantado alrededor de las llegadas armónicas, no como un fallo evidente, que es la razón de que las mediciones largas se promedien en vez de alargarse indefinidamente. Y cualquier suceso impulsivo de la grabación lo reparte la deconvolución por todo el eje temporal y aterriza dentro de las ventanas armónicas, donde se lee como distorsión: un solo chasquido fuerte puede inventarse una THD de varios por ciento, así que repite la medición en vez de intentar recortarlo con una ventana. Por último, el suelo de ruido residual de la deconvolución es el suelo de la curva de THD(f) — una captura con 60 dB de relación señal-ruido no puede mostrar un armónico del 0,05 % por bien colocadas que estén las ventanas —, así que informa del suelo de ruido medido junto a la curva.

Dos bancos para una medición con barrido: el panel (a), una interfaz de audio que excita un dispositivo eléctrico bajo ensayo con un segundo canal de la interfaz cableado directamente de vuelta desde la salida como referencia de bucle que fija t igual a cero; el panel (b), un altavoz y un micrófono de medición, los dos a 1,20 m sobre un suelo duro y separados 1,00 m, con el camino reflejado de 2,60 m en trazo discontinuo y el tiempo libre de reflexiones resultante de 4,7 ms indicado; debajo de ambos, el eje temporal propio del barrido con la llegada lineal en t igual a cero, las prellegadas del segundo y el tercer armónico en menos 0,49 y menos 0,77 segundos, la ventana por orden de 8192 muestras y la separación de llegadas más corta L ln(3/2) igual a 0,28 sDos bancos para una medición con barrido: el panel (a), una interfaz de audio que excita un dispositivo eléctrico bajo ensayo con un segundo canal de la interfaz cableado directamente de vuelta desde la salida como referencia de bucle que fija t igual a cero; el panel (b), un altavoz y un micrófono de medición, los dos a 1,20 m sobre un suelo duro y separados 1,00 m, con el camino reflejado de 2,60 m en trazo discontinuo y el tiempo libre de reflexiones resultante de 4,7 ms indicado; debajo de ambos, el eje temporal propio del barrido con la llegada lineal en t igual a cero, las prellegadas del segundo y el tercer armónico en menos 0,49 y menos 0,77 segundos, la ventana por orden de 8192 muestras y la separación de llegadas más corta L ln(3/2) igual a 0,28 s Distorsión armónica total y razones del segundo y tercer armónico de un polinomio cúbico seguido de un paso bajo de 3 kHz, frente a la frecuencia de excitación: cada orden se asienta exactamente en su nivel de Chebyshev a baja frecuencia y cae donde su propio producto cruza el corte del filtroDistorsión armónica total y razones del segundo y tercer armónico de un polinomio cúbico seguido de un paso bajo de 3 kHz, frente a la frecuencia de excitación: cada orden se asienta exactamente en su nivel de Chebyshev a baja frecuencia y cae donde su propio producto cruza el corte del filtro

Las mesetas planas de baja frecuencia son los niveles de Chebyshev y del polinomio sin memoria, y cada orden se dobla hacia abajo donde su propio producto cruza el postfiltro de 3 kHz, de modo que los codos quedan en 1,5 kHz para y en 1 kHz para , sobre el eje de excitación. Ese es el mismo oráculo que fijan los tests de conformidad.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal as sp_signal
from phonometry import swept_sine_distortion, synchronized_sweep_signal
fs, f1, f2, seconds = 48000, 20.0, 6000.0, 4.0
a2, a3 = 0.12, 0.08
x = synchronized_sweep_signal(fs, f1, f2, seconds)
b, a = sp_signal.butter(2, 3000.0, fs=fs) # postfiltro de 3 kHz
y = sp_signal.lfilter(b, a, x + a2 * x**2 + a3 * x**3)
res = swept_sine_distortion(y, fs, f1, f2, seconds, n_harmonics=3)
h1 = 1.0 + 3.0 * a3 / 4.0 # ganancia de Chebyshev
fig, ax = plt.subplots(figsize=(10, 6))
ax.loglog(res.thd_frequencies, 100.0 * res.thd, label="THD(f) total")
ax.loglog(res.thd_frequencies, 100.0 * res.distortion_ratios[0],
ls="--", label="2º armónico d2(f)")
ax.loglog(res.thd_frequencies, 100.0 * res.distortion_ratios[1],
ls="--", label="3er armónico d3(f)")
ax.axhline(100.0 * (a2 / 2.0) / h1, ls=":",
label="Asíntota de Chebyshev (a2/2)/H1")
ax.axhline(100.0 * (a3 / 4.0) / h1, ls=":",
label="Asíntota de Chebyshev (a3/4)/H1")
ax.set_xlabel("Frecuencia de excitación [Hz]")
ax.set_ylabel("Distorsión respecto al fundamental [%]")
ax.legend()
plt.show()

El oráculo detrás de la implementación es el polinomio sin memoria: excitar con un barrido unitario debe devolver, por las identidades de Chebyshev, , (fase ), (fase ) y . Las suites de tests y de conformidad fijan los cuatro valores, y la misma THD medida tono a tono con phonometry.thd coincide al 0,1 %.

Lo que el método existe para producir, sin embargo, no son las razones escalares — un barrido de tonos por pasos también las da — sino el conjunto de funciones de transferencia armónicas. Cada es una respuesta en frecuencia completa sobre su propia banda :

Las magnitudes de las tres respuestas armónicas separadas de un polinomio cúbico seguido de un paso bajo de 3 kHz, cada una dibujada sobre su propia banda: H1 de 20 Hz a 6 kHz, H2 de 40 Hz a 12 kHz y H3 de 60 Hz a 18 kHz, cada una asentada en su nivel de Chebyshev punteado a baja frecuencia y cayendo en el mismo corte del postfiltro de 3 kHzLas magnitudes de las tres respuestas armónicas separadas de un polinomio cúbico seguido de un paso bajo de 3 kHz, cada una dibujada sobre su propia banda: H1 de 20 Hz a 6 kHz, H2 de 40 Hz a 12 kHz y H3 de 60 Hz a 18 kHz, cada una asentada en su nivel de Chebyshev punteado a baja frecuencia y cayendo en el mismo corte del postfiltro de 3 kHz

Cada orden es una respuesta, no un número, y aquí están representados frente a la frecuencia del propio armónico: los tres caen en los mismos 3 kHz, porque el postfiltro actúa sobre el producto y no sobre la excitación. Las líneas punteadas son los niveles de Chebyshev. res.plot() dibuja estas magnitudes junto con el panel de THD(f) de arriba.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal as sp_signal
# `swept_sine_distortion` y `synchronized_sweep_signal` importados arriba.
fs, f1, f2, seconds = 48000, 20.0, 6000.0, 4.0
a2, a3 = 0.12, 0.08
x = synchronized_sweep_signal(fs, f1, f2, seconds)
b, a = sp_signal.butter(2, 3000.0, fs=fs)
y = sp_signal.lfilter(b, a, x + a2 * x**2 + a3 * x**3)
res = swept_sine_distortion(y, fs, f1, f2, seconds, n_harmonics=3)
for k in range(3):
mag = np.abs(np.asarray(res.harmonic_responses[k]))
plt.semilogx(res.frequencies, 20 * np.log10(np.maximum(mag, 1e-9)))
plt.show()

Cómo se lee un dispositivo real. En un altavoz medido la curva tiene una forma que conviene reconocer: distorsión que sube con fuerza por debajo de la resonancia fundamental, donde la excursión crece a la vez que cae la respuesta; un pico local allí donde se está excitando con fuerza una resonancia; y un suelo de una fracción de por ciento por la banda media a excitación moderada. Separar los órdenes es lo que hace diagnóstica la curva: un segundo armónico dominante es asimetría — una bobina móvil descentrada en el entrehierro, una suspensión más rígida en un sentido que en el otro — mientras que un tercero dominante es limitación simétrica, la suspensión o el entrehierro magnético agotándose en los dos extremos, y las dos cosas piden arreglos distintos. Como orden de magnitud, por debajo de un 1 % en la banda media no tiene nada de particular en un radiador directo a niveles de conversación, un 10 % es la marca convencional del límite de excursión que define el extremo grave útil de un altavoz, y cualquier amplificador que llegue al 1 % por debajo del recorte está averiado. Recuerda que la abscisa es la frecuencia de excitación: un rasgo a 100 Hz en la traza de es energía radiada a 200 Hz, que es donde se oirá.

2. El barrido sincronizado (Novak et al. 2015)

Sección titulada «2. El barrido sincronizado (Novak et al. 2015)»

El enventanado separa las magnitudes armónicas con cualquier barrido exponencial, pero las fases de solo tienen sentido si retrasar el barrido equivale exactamente a generar su armónico n. Eso solo se cumple para

el barrido sincronizado: el redondeo hace que sea entero, así que el barrido arranca con fase cero y todas las copias armónicas quedan alineadas. synchronized_sweep_signal lo genera (la duración queda ligeramente cuantizada; cuando es entero el barrido también termina con fase cero), y swept_sine_distortion(..., method="synchronized"), el método por defecto, deconvoluciona con el espectro en forma cerrada del filtro inverso,

en lugar de con una FFT de la señal. Además de exacta, la deconvolución analítica extiende la banda útil de cada hasta (Novak et al., Fig. 6): el segundo armónico de un barrido de 6 kHz se mide hasta 12 kHz.

Dos notas prácticas del artículo vienen incorporadas: la media de la grabación se resta por defecto (remove_dc=True; de lo contrario, un offset de continua cuela en la respuesta al impulso una copia escalada del filtro inverso), y la parte no entera de cada llegada se elimina en el dominio de la frecuencia, de modo que las fases armónicas no arrastran sesgo sub-muestra residual.

3. Analizar grabaciones con el barrido exponencial (ESS) clásico (method="farina")

Sección titulada «3. Analizar grabaciones con el barrido exponencial (ESS) clásico (method="farina")»

Las grabaciones hechas con el barrido sinusoidal exponencial (ESS) simple de phonometry.sweep_signal (la excitación de ISO 18233 que usa impulse_response) se analizan con method="farina": el mismo enventanado sobre el filtro inverso invertido en el tiempo y compensado en amplitud de Farina (2000). Las magnitudes armónicas y la THD son correctas (el oráculo de Chebyshev pasa igual), pero el término de fase -1 del barrido rompe la equivalencia desplazamiento-armónico, así que las fases de dependen de la excitación y deben ignorarse; la banda de cada queda además limitada a por el filtro inverso.

from phonometry import sweep_signal, swept_sine_distortion
x = sweep_signal(fs, f1, f2, seconds) # el ESS de ISO 18233
res = swept_sine_distortion(y, fs, f1, f2, seconds, method="farina")
res.plot() # los mismos paneles |Hn| + THD(f) que el método sincronizado (necesita matplotlib)

El resultado es el mismo SweptSineDistortionResult dibujable que el del método sincronizado, así que los paneles |Hn| y THD(f) de la figura de la sección 1 se leen idénticos; entre los dos métodos solo cambian las fases de los armónicos (y el tope de banda de cada orden). Las dos diferencias se ven sobre una misma grabación:

La respuesta del segundo armónico de una misma grabación de un cúbico sin memoria, analizada dos veces: en el panel superior las magnitudes coinciden sobre el nivel de Chebyshev a2 entre 2, pero la curva de Farina se corta en seco en f2 igual a 6 kHz mientras la sincronizada continúa hasta 2 f2 igual a 12 kHz; en el panel inferior la fase sincronizada se mantiene en el valor verdadero de menos pi entre dos en todas las frecuencias mientras la fase de Farina se aparta por encima de aproximadamente 1 kHzLa respuesta del segundo armónico de una misma grabación de un cúbico sin memoria, analizada dos veces: en el panel superior las magnitudes coinciden sobre el nivel de Chebyshev a2 entre 2, pero la curva de Farina se corta en seco en f2 igual a 6 kHz mientras la sincronizada continúa hasta 2 f2 igual a 12 kHz; en el panel inferior la fase sincronizada se mantiene en el valor verdadero de menos pi entre dos en todas las frecuencias mientras la fase de Farina se aparta por encima de aproximadamente 1 kHz

La misma grabación, las mismas magnitudes, dos diferencias. La deconvolución sincronizada mide hasta ; el filtro inverso de Farina lo detiene en . Y en un dispositivo cuya fase verdadera de es exactamente en todas las frecuencias (el cúbico sin memoria del oráculo), solo la fase sincronizada la reproduce, que es la razón de que method="farina" devuelva fases que hay que descartar en vez de leer.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
# `synchronized_sweep_signal` y `swept_sine_distortion` importados arriba.
x = synchronized_sweep_signal(48000, 20.0, 6000.0, 4.0)
y = x + 0.12 * x**2 + 0.08 * x**3 # el oráculo sin memoria
actual = len(x) / 48000 # el generador cuantiza T
for method in ("synchronized", "farina"):
res = swept_sine_distortion(y, 48000, 20.0, 6000.0, actual,
n_harmonics=3, method=method)
plt.semilogx(res.frequencies,
np.unwrap(np.angle(np.asarray(res.harmonic_responses[1]))))
plt.show()

Antes de grabar nada, tres números tienen que casar: la duración del barrido , el número de órdenes armónicos y la frecuencia superior . Las reglas de abajo rigen para los dos métodos.

  • La ventana frente a la separación entre llegadas. El par de llegadas más próximo dista segundos, así que la ventana por orden (ir_length, por defecto la mayor potencia de dos que cabe, con tope en 8192 muestras) no debe excederlo. Alarga el barrido o baja n_harmonics en un sistema reverberante cuya cola necesite una ventana más larga.
  • El techo de Nyquist. Mantén por debajo de : los productos de distorsión por encima se pliegan en cualquier grabación real y quedan contados entonces en la frecuencia equivocada.
  • La referencia de amplitud. El análisis queda referido a la amplitude de la excitación, así que es la ganancia lineal y la THD queda referida al nivel exactamente como se excitó.

Hecho para el barrido que usa esta página: Hz, kHz y s dan s, así que la separación entre y es s y la ventana por defecto de 8192 muestras (0,17 s a 48 kHz) cabe dentro con holgura. Con y kHz, el techo kHz queda cómodamente por debajo de la frecuencia de Nyquist de 24 kHz.

5. Utilidades de fase: fase mínima, retardo de grupo, exceso de fase

Sección titulada «5. Utilidades de fase: fase mínima, retardo de grupo, exceso de fase»

En un sistema causal, estable y de fase mínima, la log-magnitud y la fase de la respuesta en frecuencia forman un par de transformadas de Hilbert (Bendat y Piersol, Sec. 13.1.4): la fase queda totalmente determinada por . Las utilidades de phonometry.signals calculan esa reconstrucción con el cepstrum real y descomponen cualquier respuesta medida en su parte invertible y su parte paso todo:

import numpy as np
from phonometry import (
excess_phase, group_delay, minimum_phase, phase_decomposition,
)
H = np.fft.rfft(ir) # respuesta unilateral, DC..Nyquist
h_min = minimum_phase(np.abs(H)) # la fase solo desde la magnitud
tau_g = group_delay(H, fs) # -(1/2pi) dphi/df, en segundos
phi_x = excess_phase(H) # unwrap(arg H) - phi_min
res = phase_decomposition(H, fs) # todo sobre un mismo eje
res.excess_group_delay # la parte paso todo, en s
res.plot() # magnitud, fases, retardos de grupo
Tres paneles apilados de la descomposición fase mínima / paso todo de un ecualizador de campana de +6 dB medido a través de una latencia de 2,5 ms: la joroba de magnitud en 1 kHz, la fase medida cayendo con la frecuencia mientras la fase mínima se mantiene pequeña y el exceso de fase lleva la rampa lineal del retardo, y los retardos de grupo donde el retardo de grupo de exceso lee 2,5 ms planosTres paneles apilados de la descomposición fase mínima / paso todo de un ecualizador de campana de +6 dB medido a través de una latencia de 2,5 ms: la joroba de magnitud en 1 kHz, la fase medida cayendo con la frecuencia mientras la fase mínima se mantiene pequeña y el exceso de fase lleva la rampa lineal del retardo, y los retardos de grupo donde el retardo de grupo de exceso lee 2,5 ms planos

Un ecualizador de campana de +6 dB medido a través de una latencia de procesado de 2,5 ms: la parte de fase mínima lleva solo la pequeña ondulación de fase que un ecualizador podría invertir, el exceso de fase es la rampa pura del retardo, y el retardo de grupo de exceso lee la latencia directamente como una línea plana de 2,5 ms.

En una medición acústica esa parte plana no es latencia, es distancia. El tiempo de vuelo de altavoz a micrófono es de unos 2,9 ms por metro, así que una respuesta medida a 1 m lleva un exceso de retardo de grupo de 2,9 ms que no tiene nada que ver con la electrónica, y quien lo lea como latencia de procesado intentará compensar un retardo que no existe. Quítalo primero — recorta la respuesta al impulso hasta su llegada, o resta la distancia conocida —, porque nada más del exceso de fase se puede interpretar hasta que se haya ido. Lo que queda tras quitarlo es la parte que importa: un residuo paso todo que ningún ecualizador puede invertir, producido por un comportamiento genuinamente de fase no mínima, como una reflexión fuerte que llega después del sonido directo, o un cruce cuyos centros acústicos no están alineados. Esa es la pregunta de diseño que de verdad se le hace a phase_decomposition en corrección de altavoces y de salas: una respuesta que es de fase mínima una vez quitado el retardo se puede corregir en magnitud y fase a la vez con un solo filtro; una que no lo es, no.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal as sp_signal
from phonometry import phase_decomposition
fs = 48000.0
delay = int(0.0025 * fs) # una latencia de procesado de 2,5 ms
gain_a = 10.0 ** (6.0 / 40.0) # EQ de campana +6 dB a 1 kHz, Q = 1
w0 = 2.0 * np.pi * 1000.0 / fs
alpha = np.sin(w0) / 2.0
b = np.array([1 + alpha * gain_a, -2 * np.cos(w0), 1 - alpha * gain_a])
a = np.array([1 + alpha / gain_a, -2 * np.cos(w0), 1 - alpha / gain_a])
imp = np.zeros(16384)
imp[delay] = 1.0
ir = sp_signal.lfilter(b / a[0], a / a[0], imp)
res = phase_decomposition(np.fft.rfft(ir), fs)
res.plot(language="es") # |H|, las tres fases y los retardos de grupo
plt.show()

La descomposición separa lo que un ecualizador puede invertir (, fase mínima, causal y causalmente invertible) de lo que nunca podrá (, el exceso paso todo: latencia más ceros de fase no mínima como las reflexiones). El exceso de fase es para una respuesta de fase mínima y exactamente para una latencia pura ; su retardo de grupo lee la latencia en segundos.

Contrato numérico, fijado por los tests: sobre un biquad estrictamente de fase mínima muestreado en una malla densa, la fase reconstruida coincide con la real a mejor de rad; el retardo de grupo de un paso todo de primer orden coincide con la forma cerrada a muestras; el exceso de retardo de grupo de un biquad retardado devuelve el retardo a muestras. Las precauciones están documentadas con la API: la respuesta debe muestrearse uniformemente de DC a Nyquist inclusive (la disposición rfft) y con densidad suficiente para que la respuesta al impulso subyacente quepa en el registro implícito; los ceros de magnitud (bordes de un paso banda, fondos de notch) se acotan y no son representables por un sistema de fase mínima; el factor oversample (interpolación trigonométrica de la magnitud antes del cepstrum) mitiga el aliasing cepstral que los ceros casi sobre el círculo causan en mallas gruesas.

  • impulse_response recupera la RI lineal de la misma grabación de barrido y simplemente descarta los productos de distorsión a tiempos negativos; swept_sine_distortion es la herramienta que los lee.
  • thd / harmonic_analysis miden la distorsión de un tono estacionario a una frecuencia; el separador por barrido devuelve las mismas razones como función continua de la frecuencia, con una sola medición. La rapidez es la menor de las razones para preferirlo. Deconvolucionar un barrido de duración concentra toda la excitación en un solo impulso, de modo que la relación señal-ruido del resultado supera a la de la grabación en bruto en aproximadamente del producto tiempo-ancho de banda, que es como un barrido mide un dispositivo silencioso en una sala en la que un tono por pasos no podría trabajar. Y la separación es en el tiempo, no en frecuencia: no se aplica ningún filtro de muesca ni hay que declarar armónico ningún bin, que es lo que mantiene con sentido la THD(f) allí donde los armónicos propios de un dispositivo caen fuera de su banda de paso. La contrapartida es que una cola reverberante que dure más que la separación contamina el orden vecino, que es justo lo que las reglas de dimensionado de la sección 4 existen para evitar.
  • Las utilidades de fase operan sobre cualquier respuesta unilateral compleja: una rfft de una RI medida, o la response de una estimación con transfer_function sobre una malla uniforme. Solo minimum_phase acepta además un array de magnitud a secas, p. ej. una magnitud objetivo de diseño para ecualización.
  • Cubierto

    La deconvolución de barrido exponencial de Farina (preprint AES 5093, 2000) y el barrido sincronizado coherente en fase de Novak, Lotton y Simon (2015): la separación armónica, el espectro en forma cerrada del filtro inverso y la corrección de sesgo sub-muestra, implementadas por swept_sine_distortion y synchronized_sweep_signal. Las condiciones de adquisición de las que depende el resultado: el nivel de excitación y su referencia amplitude, el fade que tiene que llegar a las dos llamadas, los requisitos de recorte y de cola, los modos de fallo por variación en el tiempo y por ruido impulsivo, y las reglas de dimensionado que relacionan , y . Las utilidades de fase minimum_phase, group_delay, excess_phase y phase_decomposition implementan la relación de transformada de Hilbert de la sección 13.1.4 de Bendat y Piersol mediante el cepstrum real.

  • No cubierto

    La distorsión de intermodulación y la intermodulación dinámica (IEC 60268-3, apartados 14.12.7-10) se miden a partir de tonos estacionarios en la página de electroacústica, no con un barrido; esta página separa solo los órdenes armónicos. La monografía de medición con barridos de Müller y Massarani se cita como contexto de práctica (fundidos, técnica del filtro inverso), no como una fórmula concreta implementada. Con method="farina", las fases armónicas de se devuelven pero deben ignorarse: el barrido exponencial simple rompe la equivalencia desplazamiento-armónico de la que depende el método sincronizado. Aquí tampoco se comprueba ninguna de las condiciones de adquisición de la sección 1.1: las funciones toman los arrays que se les dan, así que el nivel de excitación, la ausencia de recorte y la longitud de la cola quedan a cargo de quien opera, que además tiene que informar de ellos.

  • Bendat, J. S. y Piersol, A. G. (2010). Random data: Analysis and measurement procedures (4.ª ed.). Wiley. https://doi.org/10.1002/9781118032428Sección 13.1.4: la relación de transformada de Hilbert entre log-magnitud y fase detrás de la reconstrucción de fase mínima. ISBN 978-0-470-24877-5.
  • Farina, A. (2000). Simultaneous measurement of impulse response and distortion with a swept-sine technique (108th AES Convention, Paris, preprint 5093). La deconvolución del barrido exponencial y el empaquetado L·ln(n) de cada orden de distorsión por delante de la respuesta al impulso lineal.
  • Müller, S. y Massarani, P. (2001). Transfer-function measurement with sweeps. Journal of the Audio Engineering Society, 49(6), 443-471. La monografía de medición con barridos detrás de las notas de práctica: filtros inversos, fundidos y el rechazo de la distorsión en la respuesta al impulso lineal.
  • Novak, A., Lotton, P. y Simon, L. (2015). Synchronized swept-sine: Theory, application and implementation. Journal of the Audio Engineering Society, 63(10), 786-798. https://doi.org/10.17743/jaes.2015.0071La condición de sincronización que convierte las fases armónicas en propiedades del sistema, el espectro en forma cerrada del filtro inverso usado en la deconvolución y la separación con precisión sub-muestra.