Ir al contenido

Señales de prueba y herramientas de muestreo

Normas aplicables: IEC 60268Referencias: Bendat y Piersol 2010

Una medición es tan fiable como su estímulo y su contabilidad de la frecuencia de muestreo. Esta página cubre la caja de señales de phonometry.signals, en el orden en que la recorren los apartados: ráfagas tonales con la conmutación exacta que prescribe IEC 60268-1, remuestreo cuyo rechazo de alias es una especificación declarada y verificable en lugar de un valor por defecto de la biblioteca, retardo fraccionario que desplaza un registro cualquier fracción de muestra con exactitud de banda limitada, y los generadores de ruido de colores, cuya verificación espectral vive en la guía de análisis espectral.

Antes de los detalles, el retrato de familia: qué aspecto tiene cada estímulo en el tiempo y dónde se reparte su energía en frecuencia.

Cuadrícula con cinco miniaturas etiquetadas de señales de ensayo: ruido blanco con forma de onda irregular y densidad espectral plana de 0 dB por octava, igual potencia por hercio; ruido rosa con forma de onda más suave y densidad de menos 3 dB por octava, igual potencia por octava; una MLS binaria de periodo 2 elevado a m menos 1 muestras con espectro de rayas plano; un esquema tiempo-frecuencia donde el barrido lineal es una recta mientras el exponencial se pega a las frecuencias bajas y dedica igual tiempo a cada octava; y una ráfaga tonal IEC 60268-1 de periodos completos que empieza en un paso por cero, 25 periodos de 5 kHz durante 5 msCuadrícula con cinco miniaturas etiquetadas de señales de ensayo: ruido blanco con forma de onda irregular y densidad espectral plana de 0 dB por octava, igual potencia por hercio; ruido rosa con forma de onda más suave y densidad de menos 3 dB por octava, igual potencia por octava; una MLS binaria de periodo 2 elevado a m menos 1 muestras con espectro de rayas plano; un esquema tiempo-frecuencia donde el barrido lineal es una recta mientras el exponencial se pega a las frecuencias bajas y dedica igual tiempo a cada octava; y una ráfaga tonal IEC 60268-1 de periodos completos que empieza en un paso por cero, 25 periodos de 5 kHz durante 5 ms

Cinco estímulos, y qué los separa. El ruido excita todo a la vez y necesita promediado para vencer su propia aleatoriedad. Una MLS es determinista y periódica, así que una sola correlación cruzada circular entrega una respuesta al impulso en una única pasada. Un barrido concentra su energía en una frecuencia cada vez, que es lo que le compra a la vez su factor de cresta y la separación de la distorsión armónica hacia tiempos negativos. Una ráfaga conmutada sondea el comportamiento dinámico en lugar de la respuesta estacionaria.

De los cinco solo dos se tratan aquí, así que este es el sitio donde viven los otros tres: los generadores de ruido y su verificación espectral, en análisis espectral; la MLS y el barrido exponencial, como la pareja de adquisición de ISO 18233 en acústica de salas; el barrido conformado y la pareja de Golay, en medición de sistemas; y la ráfaga tonal, en el apartado siguiente.

La ráfaga tonal sinusoidal conmutada es el estímulo estándar del comportamiento dinámico: balística de sonómetros, medidores de cuasipico, potencia admisible de altavoces. IEC 60268-1:1985 (apartado A2.1) fija qué es una ráfaga tonal bien formada: «debería comenzar en el paso por cero del tono y constar de un número entero de periodos completos». tone_burst genera exactamente eso, como ráfaga tonal única o como el tren repetitivo del apartado A2.2 en el que cada ráfaga tonal ocupa un periodo de repetición completo:

from phonometry import tone_burst
# Una ráfaga tonal de 5 ms de tono de 5 kHz (25 periodos completos), como en la
# tabla AII.
single = tone_burst(48000, 5000, 25)
print(single.burst_samples) # 240 muestras = 5 ms a 48 kHz
# Apartado A2.2: ráfagas tonales de 5 ms a 10 ráfagas por segundo.
train = tone_burst(48000, 5000, 25, repetitions=4, repetition_rate=10)
print(train.period_samples, train.duty_cycle) # 4800, 0.05
train.plot(language="es") # forma de onda con la envolvente

El resultado lleva el registro, la envolvente rectangular de conmutación y la contabilidad exacta de muestras (burst_samples, onset_sample, period_samples, duty_cycle), de modo que un informe de ensayo puede declarar su estímulo numéricamente. Como la puerta abarca un número entero de periodos completos empezando en un paso por cero, la energía de la ráfaga tonal tiene la forma cerrada exacta , que es como se verifica el generador.

Ráfagas tonales IEC 60268-1: una ráfaga tonal única de 5 ms de tono de 5 kHz que comienza en un paso por cero con su envolvente rectangular de conmutación, y un tren repetitivo de cuatro ráfagas tonales a 10 ráfagas por segundo con un ciclo de trabajo del 5 por cientoRáfagas tonales IEC 60268-1: una ráfaga tonal única de 5 ms de tono de 5 kHz que comienza en un paso por cero con su envolvente rectangular de conmutación, y un tren repetitivo de cuatro ráfagas tonales a 10 ráfagas por segundo con un ciclo de trabajo del 5 por ciento

Todas las cifras de la imagen son exactas y no nominales, que es de lo que trata el apartado A2.1. La ráfaga son 240 muestras, 25 periodos completos de 5 kHz a 48 kHz, y la primera muestra de la puerta cae sobre un cero del tono, así que su energía es hasta el último dígito. En el tren de abajo el periodo son 4800 muestras y el ciclo de trabajo es 0,05 exacto: la ráfaga ocupa la vigésima parte de cada repetición, que es lo que hace el tren utilizable para las balísticas de un sonómetro, donde el tiempo apagado tiene que estar tan bien definido como el encendido.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from phonometry import tone_burst
fs = 48000.0
single = tone_burst(fs, 5000, 25, pre_silence=0.001, post_silence=0.001)
train = tone_burst(fs, 5000, 25, repetitions=4, repetition_rate=10)
fig, axes = plt.subplots(2, 1, figsize=(10, 6.4))
t_ms = 1e3 * np.arange(single.signal.size) / single.fs
axes[0].plot(t_ms, single.signal, lw=0.9)
axes[0].plot(t_ms, single.envelope, "r--", label="Envolvente de conmutación")
axes[0].plot(t_ms, -single.envelope, "r--")
axes[0].set_xlabel("Tiempo [ms]")
t_s = np.arange(train.signal.size) / train.fs
axes[1].plot(t_s, train.signal, lw=0.5)
axes[1].plot(t_s, train.envelope, "r--", label="Envolvente de conmutación")
axes[1].plot(t_s, -train.envelope, "r--")
axes[1].set_xlabel("Tiempo [s]")
for ax in axes:
ax.set_ylabel("Amplitud")
ax.legend(loc="upper right")
plt.tight_layout()
plt.show()

Estas son las ráfagas tonales que hay detrás de las respuestas de referencia de la balística Fast/Slow/Impulse (la tabla 4 de IEC 61672-1 usa ráfagas tonales de 4 kHz de 200, 50 y 10 ms) y de los ensayos dinámicos de cuasipico de la propia IEC 60268-1 (ráfagas tonales de 5 kHz de 1 a 200 ms, tabla AII).

Qué hace la conmutación en frecuencia, y qué cuesta en nivel el ciclo de trabajo. Multiplicar un tono por un rectángulo convoluciona su raya con la transformada de la puerta, un sinc cuyos primeros ceros caen a a cada lado de la portadora: ±200 Hz para una ráfaga de 5 ms, ±100 Hz para una de 10 ms. Así que es la duración de la ráfaga, y no la portadora, la que decide si el estímulo cabe dentro de un filtro de banda, y la razón de que una ráfaga corta a través de un filtro de fracción de octava muestre el establecimiento del propio filtro en lugar de la ráfaga. En nivel, el nivel continuo equivalente de un tren es el nivel de la ráfaga más : el tren del 5 % de arriba queda por tanto exactamente 13,0 dB por debajo del nivel de la propia ráfaga, que es la cantidad contra la que compara un ensayo de balística de detector. Las respuestas de referencia que alimentan esos números están en Ponderación temporal.

2. Remuestreo con especificación antialias declarada

Sección titulada «2. Remuestreo con especificación antialias declarada»

La conversión de frecuencia de muestreo esconde un filtro, y ese filtro decide cuánta energía con alias contamina el resultado. resample_signal remuestrea de forma polifásica racional (44,1 a 48 kHz es la razón 160/147) con un FIR paso bajo diseñado dentro de la función por el método de la ventana de Kaiser, a partir de dos números que controla quien llama:

  • stopband_attenuation_db (por defecto 120): el rechazo de alias, con la banda atenuada empezando exactamente en la menor de las dos frecuencias de Nyquist, donde se produce el plegado;
  • transition_width (por defecto 0,05): la fracción de esa frecuencia de Nyquist cedida a la banda de transición del filtro, de modo que la banda de paso termina en (1 - transition_width)·f_Nyq y es plana dentro de la misma cota de rizado de Kaiser .
from phonometry import noise_signal, resample_signal
x = noise_signal(44100, 5.0, color="pink", seed=1)
res = resample_signal(x, 44100, 48000) # 120 dB de rechazo de alias
print(res.up, res.down) # 160, 147
print(res.n_taps, res.passband_edge_hz) # FIR diseñado, 20947.5 Hz
res.plot() # el filtro antisolapamiento entregado frente a su especificación
Respuesta en magnitud del filtro antisolapamiento diseñado para un remuestreo polifásico de 44,1 a 48 kilohercios sobre un eje de frecuencia logarítmico: banda de paso plana hasta el borde discontinuo justo por debajo de 21 kilohercios, transición abrupta hasta el borde de la banda atenuada en 22,05 kilohercios, y un suelo de banda atenuada que se mantiene por debajo de la línea punteada de atenuación de diseño de menos 120 decibelios a lo largo de la banda rechazada sombreadaRespuesta en magnitud del filtro antisolapamiento diseñado para un remuestreo polifásico de 44,1 a 48 kilohercios sobre un eje de frecuencia logarítmico: banda de paso plana hasta el borde discontinuo justo por debajo de 21 kilohercios, transición abrupta hasta el borde de la banda atenuada en 22,05 kilohercios, y un suelo de banda atenuada que se mantiene por debajo de la línea punteada de atenuación de diseño de menos 120 decibelios a lo largo de la banda rechazada sombreada

El filtro antisolapamiento entregado por la conversión 44,1 → 48 kHz por defecto: la banda atenuada empieza exactamente en la frecuencia de Nyquist menor (donde se pliegan los alias) y se mantiene bajo la línea de diseño de −120 dB; la banda de paso termina un 5 % por debajo, plana dentro de la misma cota de rizado.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
from phonometry import noise_signal, resample_signal
x = noise_signal(44100, 5.0, color="pink", seed=1)
res = resample_signal(x, 44100, 48000) # 120 dB de rechazo de alias
# res es el ResampledSignalResult calculado en el ejemplo de arriba.
# Una línea: el filtro antisolapamiento entregado frente a su especificación:
res.plot(language="es")
plt.show()
# A mano, desde los coeficientes que lleva el resultado, reflejando lo que
# dibuja ResampledSignalResult.plot():
fs_up = res.original_fs * res.up
freqs, h = signal.freqz(res.filter_taps, worN=1 << 18, fs=fs_up)
mag_db = 20 * np.log10(np.maximum(np.abs(h), 1e-300))
view = (freqs > 0) & (freqs <= 4 * res.stopband_edge_hz)
fig, ax = plt.subplots()
ax.semilogx(freqs[view], mag_db[view], label="Filtro antisolapamiento |H(f)|")
ax.axvline(res.passband_edge_hz, color="g", linestyle="--",
label="Borde de la banda de paso")
ax.axvline(res.stopband_edge_hz, color="r", linestyle="--",
label="Borde de la banda atenuada (pliegue de alias)")
ax.axhline(-res.stopband_attenuation_db, color="k", linestyle=":",
label="Atenuación de diseño -120 dB")
ax.axvspan(res.stopband_edge_hz, 4 * res.stopband_edge_hz,
color="r", alpha=0.08)
ax.set(xlabel="Frecuencia [Hz]", ylabel="Magnitud [dB]")
ax.legend()
plt.show()

Los coeficientes diseñados viajan con el resultado (filter_taps), así que la especificación es comprobable: la batería de tests mide la respuesta en frecuencia del filtro devuelto y comprueba la desviación en banda de paso y la fuga en banda atenuada contra la propia cota de rizado del diseño (el diseño apunta internamente 1 dB más allá de lo pedido, de modo que el filtro entregado cumple los números declarados y no una aproximación de la fórmula de Kaiser). Un tono en banda de paso remuestreado con la especificación por defecto coincide con el tono analítico a la nueva frecuencia dentro de .

Varios estimadores remuestrean internamente a frecuencias fijas (la psicoacústica ECMA-418-2 a 48 kHz, STOI a 10 kHz); esta función es la contrapartida pública y documentada para preparar registros fuera de esas cadenas.

Tres cosas que conviene decidir antes de remuestrear siquiera. La especificación tiene un precio: la anchura de transición del 5 % por defecto cede el 5 % superior de la menor de las dos bandas de Nyquist, así que una conversión de 44,1 a 48 kHz solo es plana hasta unos 21 kHz; un registro cuyo contenido llegue a Nyquist necesita un transition_width más estrecho (y los coeficientes de más que vienen con él) en lugar de un truncamiento silencioso. El orden importa: remuestrear es una operación de filtrado, así que los niveles basados en valor eficaz sobreviven a ella y los basados en pico no; la interpolación de banda limitada puede colocar una muestra reconstruida por encima del pico original (el efecto de pico entre muestras), de modo que lc_peak y cualquier factor de cresta van a la frecuencia original, o detrás de un sobremuestreo de pico verdadero explícito. Y muchas veces la respuesta es no remuestrear: los filtros de fracción de octava de la biblioteca se diseñan solos a la frecuencia que se les dé, así que convertir a una frecuencia «estándar» antes de analizar no suele comprar nada y cuesta el borde de banda.

fractional_delay desplaza un registro cualquier número de muestras, incluidas fracciones de muestra, multiplicando el espectro por la rampa de fase : cada componente se retrasa exactamente D muestras. Dos convenciones de frontera cubren los dos casos de uso:

  • mode="linear" (por defecto) rellena el registro con ceros más allá del desplazamiento, de modo que las muestras que salen por un extremo caen en el relleno en lugar de dar la vuelta. Úsalo para transitorios y respuestas al impulso; es bit a bit idéntico al núcleo de alineación de align_impulse_responses. Un retardo entero se reduce a un desplazamiento exacto de muestras.
  • mode="circular" aplica la rampa sobre el propio registro y da la vuelta. Para registros periódicos es exacto: un tono centrado en un bin de la DFT retrasado D muestras es igual al tono retrasado analíticamente con precisión de máquina, y su fase cambia exactamente radianes.
import numpy as np
from phonometry import fractional_delay
y = fractional_delay(x, 0.37) # 0,37 muestras más tarde
z = fractional_delay(x, -2.5, mode="circular") # avance, con vuelta

Una sutileza que conviene conocer: un registro real de longitud par no puede llevar una componente del bin de Nyquist retrasada fraccionariamente (la FFT real inversa conserva solo su parte real). Toda señal muestreada correctamente está limitada en banda por debajo de Nyquist, así que en la práctica la operación es exacta; para casos sintéticos extremos, las longitudes impares evitan el bin por completo.

Los generadores deterministas de ruido de colores (noise_signal: blanco, rosa, rojo, azul y violeta, con pendiente exacta en ley de potencias y semillas reproducibles bit a bit) redondean la caja y están documentados, con su verificación espectral y sus pendientes medidas, en la guía de análisis espectral.

Las figuras de mérito de las ventanas cuantifican la ventana sobre la que descansa toda estimación espectral de la biblioteca; el generador de ráfagas tonales alimenta la balística y los ensayos de respuesta dinámica; y el remuestreador y el retardo fraccionario son la mitad de muestreo del trabajo de correlación y retardo, donde la alineación submuestral es la diferencia entre promediar respuestas al impulso y emborronarlas.

  • Cubierto

    El anexo A, apartado A2, de la IEC 60268-1:1985: la ráfaga tonal que «debería comenzar en el paso por cero del tono y constar de un número entero de periodos completos» (A2.1) y el tren repetitivo de ráfagas tonales de A2.2, implementados por tone_burst y comprobados a mano contra las duraciones de la tabla AII. El requisito antialias de la sección 10.2 de Bendat y Piersol, convertido en una especificación explícita y verificable por el rechazo en la banda atenuada y la anchura de transición de resample_signal.

  • No cubierto

    La IEC 60268-1:1985 es una norma general para equipos de sistemas de sonido; en esta página solo se implementan los apartados de ráfagas tonales del anexo A. Las partes de dispositivos no se cubren aquí, pero tampoco quedan sin tocar: los amplificadores (IEC 60268-3), los micrófonos (IEC 60268-4) y los altavoces (IEC 60268-5) tienen sus propias guías en Electroacústica, y el índice de transmisión del habla de la IEC 60268-16 tiene la guía del Índice de transmisión del habla; solo las partes de conectores están ausentes de la biblioteca por completo. fractional_delay y los generadores de ruido de colores de noise_signal son herramientas de DSP de propósito general sin norma que las gobierne; sus afirmaciones de exactitud son formas cerradas, no normativas.

  • Bendat, J. S. y Piersol, A. G. (2010). Random data: Analysis and measurement procedures (4.ª ed.). Wiley. https://doi.org/10.1002/9781118032428Sección 10.2 (preparación de datos: muestreo, aliasing y el requisito de filtrado antialias que el remuestreador declara explícitamente). ISBN 978-0-470-24877-5.
  • International Electrotechnical Commission. (1985). Sound system equipment — Part 1: General (IEC 60268-1:1985). Anexo A, apartado A2: ráfagas tonales que comienzan en el paso por cero del tono con un número entero de periodos completos (A2.1), trenes repetitivos de ráfagas tonales a una tasa de repetición dada (A2.2), y las duraciones de ráfaga tonal de la tabla AII contra las que se comprueban a mano los recuentos de muestras.