Ir al contenido
Esta documentación describe la versión 4.0.0, todavía sin publicar. La versión actual en PyPI es la 3.3.0 y no incluye todo lo que se describe aquí.

Verificación de clase de filtros (IEC 61260-1)

Normas aplicables: IEC 61260ANSI S1.11

Un banco de filtros solo se convierte en instrumento de medida cuando sus bandas se han demostrado frente a una especificación. IEC 61260-1:2014 escribe esa especificación como una máscara de aceptación: un corredor de atenuación relativa alrededor de cada frecuencia central, estrecho en la banda de paso y convertido en una exigencia de atenuación mínima lejos de la banda, con un corredor por cada clase de prestaciones. Un banco «es clase 1» cuando todas sus bandas se mantienen dentro del corredor de clase 1 en todas las frecuencias normalizadas, y el margen en decibelios dice por cuánto.

Esta página es la mitad de verificación del tema del filtrado en octavas: la máscara de 2014 y el veredicto por banda, los dos requisitos que la Parte 2 de la serie calcula a partir de la misma respuesta (el ancho de banda efectivo y la suma de las salidas adyacentes) y el ensayo de barrido del funcionamiento invariante en el tiempo, la clase 0 más estricta que mantienen vivas las máscaras retiradas de IEC 61260:1995 y ANSI S1.11-2004, una lectura de lo que aporta de verdad una clase en una medición (error en la banda de paso, fuga en la banda atenuada, balance de incertidumbre), los ensayos periódicos que un laboratorio le hace a un instrumento y cómo se califican sus resultados, y la ficha acreditada de una página que convierte el veredicto en documento. La mitad de diseño, las matemáticas de banda y la referencia de parámetros, es Bancos de filtros, y las cinco arquitecturas con sus respuestas comparadas son la Galería de arquitecturas de filtro; la misma maquinaria aplicada a las ponderaciones frecuenciales es la sección 6 de Ponderación frecuencial.

1. Verificar la clase frente a IEC 61260-1:2014

Sección titulada «1. Verificar la clase frente a IEC 61260-1:2014»

verify_filter_class comprueba cada banda de un banco contra los límites de aceptación de IEC 61260-1:2014 (Tabla 1, con el mapeo de los puntos de quiebre a cada fracción de octava y la interpolación logarítmica de la norma) y, para la edición de 2014, contra el ancho de banda efectivo y la suma de las salidas tal como los calcula IEC 61260-2:2016 (apartado 1b). Informa de la clase por banda con sus márgenes en dB:

from phonometry import filters
bank = filters.OctaveFilterBank(fs=48000, fraction=3, order=6)
result = filters.verify_filter_class(bank)
print(result.overall_class) # 1
print(result.range_limited) # True: sus bandas altas llegan a Nyquist
print(result.requirements)
# ('relative_attenuation', 'effective_bandwidth', 'summation')
band = result.bands[0]
print(band["freq"], band["class"], band["checked_to_omega"])
# 12.589254117941678 1 17.984790220172403
print(band["margin_class1_db"], band["bandwidth_margin_class1_db"])
# 0.39999999999978114 0.3512657809681092
Cadena de cálculo para calificar un filtro de banda frente a la Tabla 1 de IEC 61260-1. Arriba, cuatro cajas encadenadas: la banda diseñada, un tercio de octava a 1000 Hz de orden 6; su atenuación relativa, la atenuación en cada frecuencia normalizada menos la del centro de banda; la máscara de la Tabla 1, con sus puntos de quiebre de octava llevados a tercio de octava y los límites rectos en lg Ω entre ellos; y el margen y la clase. Debajo, dos paneles comparten un eje de frecuencia estirado punto de quiebre a punto de quiebre. El panel de la banda de paso va de Ω = 1 al borde de banda en 1,122 y contiene el corredor de clase 1, un suelo en −0,4 dB bajo un techo que sube de +0,4 dB a +5,3 dB, con el corredor más ancho de clase 2 en discontinua a su alrededor; la banda se queda plana en 0 dB y sube a 3 dB en el borde. El panel de la banda atenuada va del borde a 5,392, donde solo rige un mínimo, que sube de 1,2 dB pasando por 16,6, 40,5 y 60 dB hasta 70 dB para la clase 1, y la banda sube muy por encima. Bajo las columnas, cada punto de quiebre de octava, desde G elevado a un octavo hasta G elevado a la cuarta, va emparejado con su valor en tercio de octava, y una fila da el margen de clase 1 en cada uno: +0,40 dB en los tres primeros, recuadrados como margen de la banda, luego +0,49, +2,29 y +1,81 dB, y de 26 a 92 dB en la banda atenuada. Una nota añade la clase 0 de la edición de 1995, ±0,15 dB en el centro de banda y 75 dB desde G elevado a la cuarta. Una caja verde da el veredicto, clase 1 con márgenes de +0,40 dB y +0,60 dB, un banco que toma la clase de su peor banda, y range_limited avisando de una banda recorrida solo hasta su propio Nyquist. A la derecha, una caja continua que sale de la caja de atenuación relativa recoge lo que el verificador también calcula sobre el diseño, los ensayos de IEC 61260-2 que no necesitan espécimen: al menos 24 sinusoides por ancho de banda en Ω = G elevado a i entre bS (Fórmula 1), la desviación del ancho de banda efectivo del 5.12 por la Fórmula (2) dentro de ±0,4 dB o ±0,6 dB, la suma de salidas del 5.16 por la Fórmula (3) entre +0,8 dB y −1,8 dB en clase 1, y el barrido del 5.14 por el propio banco. Debajo, una columna discontinua, fuera de la comprobación, recoge lo que un laboratorio le hace a un instrumento: IEC 61260-2 sobre un espécimen, al menos tres presentados y al menos uno ensayado por completo, 1 dB bajo el techo del rango lineal, de 20 °C a 26 °C y humedad relativa del 35 % al 65 %; y los ensayos periódicos de IEC 61260-3, cada filtro en su centro de banda o un barrido, tres filtros, bajo, medio y alto, en hasta 15 frecuencias, cuyos resultados califica verify_filter_periodic, con la incertidumbre dentro del Anexo B, de 0,20 a 0,50 dB. Las Fórmulas 9 y 11 van recuadradas al pieCadena de cálculo para calificar un filtro de banda frente a la Tabla 1 de IEC 61260-1. Arriba, cuatro cajas encadenadas: la banda diseñada, un tercio de octava a 1000 Hz de orden 6; su atenuación relativa, la atenuación en cada frecuencia normalizada menos la del centro de banda; la máscara de la Tabla 1, con sus puntos de quiebre de octava llevados a tercio de octava y los límites rectos en lg Ω entre ellos; y el margen y la clase. Debajo, dos paneles comparten un eje de frecuencia estirado punto de quiebre a punto de quiebre. El panel de la banda de paso va de Ω = 1 al borde de banda en 1,122 y contiene el corredor de clase 1, un suelo en −0,4 dB bajo un techo que sube de +0,4 dB a +5,3 dB, con el corredor más ancho de clase 2 en discontinua a su alrededor; la banda se queda plana en 0 dB y sube a 3 dB en el borde. El panel de la banda atenuada va del borde a 5,392, donde solo rige un mínimo, que sube de 1,2 dB pasando por 16,6, 40,5 y 60 dB hasta 70 dB para la clase 1, y la banda sube muy por encima. Bajo las columnas, cada punto de quiebre de octava, desde G elevado a un octavo hasta G elevado a la cuarta, va emparejado con su valor en tercio de octava, y una fila da el margen de clase 1 en cada uno: +0,40 dB en los tres primeros, recuadrados como margen de la banda, luego +0,49, +2,29 y +1,81 dB, y de 26 a 92 dB en la banda atenuada. Una nota añade la clase 0 de la edición de 1995, ±0,15 dB en el centro de banda y 75 dB desde G elevado a la cuarta. Una caja verde da el veredicto, clase 1 con márgenes de +0,40 dB y +0,60 dB, un banco que toma la clase de su peor banda, y range_limited avisando de una banda recorrida solo hasta su propio Nyquist. A la derecha, una caja continua que sale de la caja de atenuación relativa recoge lo que el verificador también calcula sobre el diseño, los ensayos de IEC 61260-2 que no necesitan espécimen: al menos 24 sinusoides por ancho de banda en Ω = G elevado a i entre bS (Fórmula 1), la desviación del ancho de banda efectivo del 5.12 por la Fórmula (2) dentro de ±0,4 dB o ±0,6 dB, la suma de salidas del 5.16 por la Fórmula (3) entre +0,8 dB y −1,8 dB en clase 1, y el barrido del 5.14 por el propio banco. Debajo, una columna discontinua, fuera de la comprobación, recoge lo que un laboratorio le hace a un instrumento: IEC 61260-2 sobre un espécimen, al menos tres presentados y al menos uno ensayado por completo, 1 dB bajo el techo del rango lineal, de 20 °C a 26 °C y humedad relativa del 35 % al 65 %; y los ensayos periódicos de IEC 61260-3, cada filtro en su centro de banda o un barrido, tres filtros, bajo, medio y alto, en hasta 15 frecuencias, cuyos resultados califica verify_filter_periodic, con la incertidumbre dentro del Anexo B, de 0,20 a 0,50 dB. Las Fórmulas 9 y 11 van recuadradas al pie

La banda de 1 kHz de un banco como el de arriba, a lo largo de la comprobación: su atenuación relativa en cada punto de quiebre de la Tabla 1, llevado a tercio de octava, frente a los límites de clase 1 y clase 2, y el menor margen decide la clase. El banco por defecto la recorre hasta el final de la máscara: a 48 kHz su frecuencia de Nyquist es 24 veces su frecuencia central, y una banda diezmada conserva la suya en al menos dieciséis veces su borde superior. La caja de la derecha es lo que el apartado 1b calcula además sobre el diseño, los ensayos de IEC 61260-2 que no necesitan espécimen; la columna discontinua de debajo es lo que un laboratorio le hace a un instrumento, y el apartado 3b califica los resultados de ensayo periódico que devuelve.

Hasta dónde de la máscara llega realmente el veredicto. checked_to_omega es la frecuencia normalizada más alta a la que se evaluó esa banda: la frecuencia de Nyquist de procesado de la propia banda, que en un banco multitasa es la de Nyquist de su frecuencia diezmada. El banco diezma una banda solo hasta donde esa frecuencia de Nyquist sigue siendo al menos dieciséis veces su borde superior de banda (el apartado 1b explica por qué), así que cada banda diezmada del banco de arriba se evalúa hasta o más, por encima del final de la máscara de la Tabla 1 (al menos 70 dB para la clase 1 desde , la fila de octava llevada a tercio de octava). Las bandas que se quedan cortas son las que se filtran a la frecuencia completa en lo alto del banco: desde 5 kHz, la frecuencia de Nyquist de 24 kHz queda por debajo de , y la banda de 20 kHz solo se evalúa hasta . Ahí el requisito de banda atenuada lejana no queda demostrado sobre el filtro de banda en absoluto. Se da por satisfecho porque una señal muestreada no lleva energía por encima de su frecuencia de Nyquist: el filtro antialiasing de la cadena de captura la eliminó antes de que la banda llegara a verla. range_limited es el indicador de que se ha usado ese argumento, y aquí vale True.

Conviene decirlo tal cual en un informe: el veredicto acredita la máscara hasta checked_to_omega, y el resto es un argumento sobre la cadena de captura. El indicador solo se desactiva cuando la frecuencia de Nyquist de cada banda queda más allá del final de la máscara. El banco de tercios de octava del apartado 1b, de 125 Hz a 4 kHz a 48 kHz, no está limitado en rango; el banco de octavas del mismo rango sí, porque sus bandas de 2 kHz y 4 kHz, filtradas a la frecuencia completa, solo se evalúan hasta y 6, por debajo del donde termina la máscara de octava. Cuando un documento exija la máscara completa sobre cada filtro de banda, baja el techo del banco o sube fs: diseñar el banco con design=filters.FilterDesign(resample=False) no cambia nada aquí, porque las bandas que se quedan cortas ya corren a la frecuencia completa.

Qué mide el margen. Es el mínimo, sobre todas las frecuencias normalizadas en las que se evaluó la banda, de la distancia al límite más próximo de esa clase: positivo cuando la respuesta se queda dentro del corredor en todas partes, y negativo por exactamente la peor violación cuando no. La class que se informa es la clase más estricta para la que ese margen y los márgenes del apartado 1b no son negativos.

Conviene saber qué restricción manda antes de intentar mejorar el número. Un Butterworth de planitud máxima es plano en el centro de banda, donde el corredor de clase 1 es de ±0,4 dB, así que su margen satura en +0,400 dB en cuanto la banda atenuada deja de ser el factor limitante: medido sobre un banco de tercios de octava a 48 kHz, el orden 2 falla de plano (clase None, peor margen de clase 1 de −27,03 dB) y los órdenes 4, 6, 8 y 10 mantienen todos exactamente +0,400 dB en la Tabla 1 (el orden 4 pierde luego la clase 1 en la suma del apartado 1b, y los órdenes 6 a 10 son clase 1 en todo). Subir el orden ayuda, por tanto, solo mientras el margen es negativo por un motivo de banda atenuada; una vez que un diseño cumple, el margen queda acotado por la semianchura del corredor de banda de paso y ningún orden lo moverá. Un margen de +0,400 dB no es un resultado mediocre que haya que mejorar: es lo mejor que puede informar un diseño conforme frente a esta máscara.

La propia máscara de aceptación de la Tabla 1 también es pública: class_limits(fraction, filter_class, omega) devuelve los límites mínimo/máximo de atenuación relativa en frecuencias normalizadas , los mismos límites que usan el verificador y la figura de abajo.

Respuesta Butterworth serpenteando entre las regiones prohibidas de la máscara de clase 1 de IEC 61260-1Respuesta Butterworth serpenteando entre las regiones prohibidas de la máscara de clase 1 de IEC 61260-1

La respuesta del Butterworth de orden 6 (azul) serpentea entre las regiones prohibidas: debe atenuar al menos la máscara roja fuera de la banda y no más que la morada dentro de ella.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import sosfreqz
from phonometry import filters
fs = 48000
bank = filters.OctaveFilterBank(fs, fraction=1, order=6, limits=[800, 1200])
idx = int(np.argmin(np.abs(np.array(bank.freq) - 1000)))
fm, fsd = bank.freq[idx], fs / bank.factor[idx]
w, h = sosfreqz(bank.sos[idx], worN=2**15, fs=fsd)
att = -20 * np.log10(np.abs(h) + 1e-12)
delta_a = att - np.interp(fm, w, att) # atenuación relativa
grid = np.logspace(np.log10(0.05), np.log10(8), 2000)
lo1, hi1 = filters.class_limits(1.0, 1, grid) # atenuación mín/máx de clase 1
fig, ax = plt.subplots(figsize=(9, 5.5))
ax.fill_between(grid, -10, lo1, alpha=0.15, color="tab:red",
label="Prohibido: atenuación insuficiente")
finite = np.isfinite(hi1)
ax.fill_between(grid[finite], hi1[finite], 90, alpha=0.15, color="tab:purple",
label="Prohibido: atenuación excesiva")
ax.plot(w / fm, delta_a, label="Butterworth de orden 6")
ax.set(xscale="log", xlim=(0.08, 8), ylim=(-6, 90),
xlabel="Frecuencia normalizada f / fm",
ylabel="Atenuación relativa [dB]")
ax.legend()
plt.show()

Con parámetros por defecto (orden 6), Butterworth cumple la máscara de clase 1 de la Tabla 1, y también lo hace Chebyshev II: su valor por defecto de attenuation es ahora 72 dB, superando el límite de clase 1 de 70 dB en la banda atenuada lejana (scipy fija el suelo de rizado constante de cheby2 en exactamente attenuation, así que cualquier valor cumple; el valor por defecto de 72 dB mantiene el mismo margen de banda de paso de +0,400 dB que Butterworth). Chebyshev I, elíptico y Bessel no cumplen los límites de clase con orden 6: el rizado de banda de paso (cheby1/ellip) y la caída lenta (bessel) violan la máscara. La clase 1 es el veredicto más estricto que puede devolver esta edición; la clase 0, más estricta todavía, que el banco por defecto también supera, pertenece a la máscara retirada de 1995 y es el apartado 2. Que un banco entero sea clase 1 depende además de los dos requisitos del apartado 1b, y los bancos de octavas y de tercios de octava por defecto también cumplen ahí la clase 1.

1b. Ancho de banda efectivo y suma de las salidas (IEC 61260-2)

Sección titulada «1b. Ancho de banda efectivo y suma de las salidas (IEC 61260-2)»

La Tabla 1 juzga una banda frecuencia a frecuencia. IEC 61260-1:2014 añade dos requisitos que juzgan una banda, y un juego de bandas, como un todo, e IEC 61260-2:2016 dice cómo los calcula un laboratorio de ensayo de tipo a partir de la misma atenuación relativa. Ninguno necesita más que la respuesta diseñada, así que para la edición de 2014 verify_filter_class califica los dos, y la class de una banda es la clase más estricta que cumple en los tres.

Ancho de banda efectivo (5.12). Ante un sonido de banda ancha, un analizador de bandas informa de la potencia que deja pasar su banda, así que lo que cuenta es su anchura en potencia. El ancho de banda efectivo normalizado es la Fórmula (13) de IEC 61260-1,

y su desviación respecto al ancho de banda de una banda ideal, , es , dentro de ±0,4 dB para la clase 1 y ±0,6 dB para la clase 2 (5.12.2). Una banda con dB lee el ruido rosa 0,05 dB alto. El verificador evalúa la integral como recomienda el 7.2.3.2 de IEC 61260-2: la regla del trapecio de su Fórmula (2) sobre las frecuencias de ensayo de su Fórmula (1),

con de al menos 24 frecuencias por ancho de banda (points_per_bandwidth, 24 por defecto), llevada hasta el punto de quiebre más externo de la Tabla 1, donde una banda de clase 1 está al menos 70 dB por debajo.

Suma de las señales de salida (5.16). Un tono entre dos frecuencias centrales tiene que salir del juego con su potencia, repartida entre las bandas que lo ven, sin perderla ni añadirla. La Fórmula (3) de IEC 61260-2 suma en energía la atenuación relativa de la banda y de sus dos vecinas en las frecuencias de ensayo de dentro de la banda ():

y el resultado tiene que quedar entre −1,8 dB y +0,8 dB para la clase 1, y entre −3,8 dB y +1,8 dB para la clase 2. Las dos bandas de los extremos, con vecina a un solo lado, quedan fuera (7.2.4.4), así que el requisito solo se califica en un banco de tres bandas o más, y result.requirements dice si se calificó. La Fórmula (3) impresa y el texto de 7.2.4.3 y de 5.16 toman la diferencia en sentidos opuestos, lo que con unos límites tan asimétricos no es el mismo ensayo; el verificador aplica los límites a la fórmula tal como está impresa, como indica el 7.2.4.5, y el registro de erratas recoge el conflicto.

from phonometry import filters
third = filters.verify_filter_class(
filters.OctaveFilterBank(48000, fraction=3, order=6, limits=[125, 4000]))
print(third.overall_class) # 1
octave = filters.verify_filter_class(
filters.OctaveFilterBank(48000, fraction=1, order=6, limits=[125, 4000]))
print(octave.requirement_class("relative_attenuation")) # 1
print(octave.requirement_class("effective_bandwidth")) # 1
print(octave.requirement_class("summation")) # 1
print(round(octave.binding_margin_db("summation", 1), 2)) # 0.64
print(octave.overall_class) # 1
Dos paneles con la salida sumada de las bandas adyacentes frente a la frecuencia normalizada, del borde inferior al superior de la banda, con los límites de clase 1 en discontinua en +0,8 dB y −1,8 dB y los de clase 2 en línea de puntos en +1,8 dB y −3,8 dB. A la izquierda, el banco de octavas diezmado de 125 Hz a 4 kHz: cada banda interior suma prácticamente 0 dB en el centro de la banda y sube en un abultamiento estrecho justo dentro de cada borde, hasta unos +0,13 dB junto al borde inferior y hasta entre +0,14 dB y +0,16 dB junto al superior, antes de volver a 0 dB en los propios bordes; la banda de 1995 Hz, dibujada más gruesa como banda determinante, llega a +0,16 dB, muy dentro de la clase 1. A la derecha, el banco de tercios de octava en el mismo rango dibuja la misma forma entre 0,00 dB y +0,16 dB, con su banda de 3162 Hz como determinante, dentro de la clase 1Dos paneles con la salida sumada de las bandas adyacentes frente a la frecuencia normalizada, del borde inferior al superior de la banda, con los límites de clase 1 en discontinua en +0,8 dB y −1,8 dB y los de clase 2 en línea de puntos en +1,8 dB y −3,8 dB. A la izquierda, el banco de octavas diezmado de 125 Hz a 4 kHz: cada banda interior suma prácticamente 0 dB en el centro de la banda y sube en un abultamiento estrecho justo dentro de cada borde, hasta unos +0,13 dB junto al borde inferior y hasta entre +0,14 dB y +0,16 dB junto al superior, antes de volver a 0 dB en los propios bordes; la banda de 1995 Hz, dibujada más gruesa como banda determinante, llega a +0,16 dB, muy dentro de la clase 1. A la derecha, el banco de tercios de octava en el mismo rango dibuja la misma forma entre 0,00 dB y +0,16 dB, con su banda de 3162 Hz como determinante, dentro de la clase 1

La Fórmula (3) de IEC 61260-2 en cada banda interior de los dos bancos por defecto, dibujada por result.plot(requirement="summation"). Los dos bancos devuelven la potencia de un tono con menos de 0,16 dB de diferencia: la suma se queda a unas centésimas de decibelio de 0 dB en el centro de cada banda y sube poco más de una décima de decibelio justo dentro de sus bordes, donde dos bandas vecinas se reparten el tono.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
from phonometry import filters
octave = filters.verify_filter_class(
filters.OctaveFilterBank(48000, fraction=1, order=6, limits=[125, 4000]))
third = filters.verify_filter_class(
filters.OctaveFilterBank(48000, fraction=3, order=6, limits=[125, 4000]))
fig, (ax_oct, ax_third) = plt.subplots(1, 2, figsize=(13, 6.2), sharey=True)
octave.plot(ax=ax_oct, requirement="summation", language="es")
third.plot(ax=ax_third, requirement="summation", language="es")
ax_oct.set_title("Banco de octava, diezmado: clase 1 en §5.16")
ax_third.set_title("Banco de tercio de octava: clase 1 en §5.16")
ax_third.set_ylabel("")
plt.show()

Por qué el banco diezma una banda solo hasta dieciséis veces su borde superior. La suma es el requisito que un diseño multitasa pone en riesgo. Cerca de su propia frecuencia de Nyquist, la transformada bilineal dobla una banda: justo dentro de su borde superior de banda atenúa menos que la misma banda diseñada lejos de Nyquist, y por encima de ese borde cae con más pendiente. Justo por debajo de un borde superior de banda, la banda y su vecina de arriba dejan pasar entonces más que la potencia del tono; justo por encima de un borde inferior de banda, la vecina de abajo ya ha caído y se pierde potencia. Un banco de octavas (Butterworth, orden 6, 48 kHz) diezmado hasta que la frecuencia de Nyquist de procesado de cada banda es solo 1,25 veces su borde superior de banda suma sus salidas adyacentes de −1,16 dB a +0,94 dB respecto a la entrada: más allá de los +0,8 dB de la clase 1, un banco de clase 2. El doblez se reduce con el cuadrado de esa razón: mueve la suma de una banda de octava 0,074 dB con una razón de cuatro, 0,018 dB con ocho y 0,005 dB con dieciséis, y la de una banda de tercio de octava 0,002 dB con dieciséis. Por eso el banco deja de diezmar una banda mientras su frecuencia de Nyquist de procesado sigue siendo al menos dieciséis veces su borde superior de banda, y sus bancos diezmados suman lo mismo que los mismos bancos diseñados a la frecuencia completa (design=filters.FilterDesign(resample=False)): clase 1 en todos los requisitos a 44,1, 48 y 96 kHz. En todo su rango por defecto a 48 kHz, el banco de octavas suma de −0,06 dB a +0,69 dB, diezmado o no, con el máximo en la banda de 8 kHz, vecina de la de 16 kHz, que corre a la frecuencia completa cerca de la frecuencia de Nyquist de 24 kHz: clase 1 con 0,11 dB de margen. El banco de tercios de octava suma de −0,25 dB a +0,76 dB, ambos en su banda de 16 kHz, un margen de 0,04 dB, y el banco de octavas Chebyshev II diezmado de −0,08 dB a +0,64 dB. Nada de esto es un artefacto de calificar funciones de transferencia: tonos pasados por el propio banco, con sus filtros de diezmado, leen las sumas de la Fórmula (3) con una diferencia de menos de 0,01 dB.

1c. Funcionamiento invariante en el tiempo (5.14)

Sección titulada «1c. Funcionamiento invariante en el tiempo (5.14)»

Un banco multitasa no filtra un tono igual caiga donde caiga respecto al diezmado, y una función de transferencia no puede mostrarlo. El apartado 5.14 de IEC 61260-1:2014 lo ensaya en cambio sobre el filtro en marcha: una sinusoide de amplitud constante cuya frecuencia sube una década en 2 s a 5 s, y la salida promediada en el tiempo de cada banda tiene que quedar dentro de ±0,4 dB (clase 1) o ±0,6 dB (clase 2) del nivel de la Fórmula (17),

la salida de una banda ideal del mismo ancho de banda. swept_band_level es esa fórmula (107,97 dB en el ejemplo que desarrolla el Anexo B de IEC 61260-2 y -3), y swept_level_uncertainty su incertidumbre típica a partir de las incertidumbres del barrido (Anexo A). verify_time_invariance ejecuta sobre un banco el ensayo del 7.4 de IEC 61260-2: el barrido de las Fórmulas (A.3) y (A.4) pasa por cada banda exactamente como OctaveFilterBank.filter procesa una señal, diezmado polifásico incluido, a 2 s y a 5 s por década.

from phonometry import filters
bank = filters.OctaveFilterBank(48000, fraction=3, order=6, limits=[25, 10000])
swept = filters.verify_time_invariance(bank)
print(swept.overall_class) # 1
print(round(swept.worst_deviation_db, 3)) # 0.056
print(swept.seconds_per_decade) # (2.0, 5.0)
print(round(filters.swept_band_level(
127.0, fraction=3, sweep_duration_s=30, averaging_time_s=30,
start_frequency_hz=0.01, end_frequency_hz=1e6), 2)) # 107.97
La desviación de la salida barrida de cada banda respecto al nivel de la Fórmula (17), para el banco de tercios de octava de 25 Hz a 10 kHz, a 2 s y a 5 s por década, entre los límites de clase 1 en discontinua en ±0,4 dB y los de clase 2 en línea de puntos en ±0,6 dB. Todas las bandas a las dos velocidades quedan en unos +0,05 dB, las dos velocidades superpuestas, así que el banco es clase 1La desviación de la salida barrida de cada banda respecto al nivel de la Fórmula (17), para el banco de tercios de octava de 25 Hz a 10 kHz, a 2 s y a 5 s por década, entre los límites de clase 1 en discontinua en ±0,4 dB y los de clase 2 en línea de puntos en ±0,6 dB. Todas las bandas a las dos velocidades quedan en unos +0,05 dB, las dos velocidades superpuestas, así que el banco es clase 1

Todas las bandas del banco de tercios de octava diezmado leen unos +0,05 dB a las dos velocidades de barrido. Es su desviación del ancho de banda efectivo del apartado 1b, que es lo que el Anexo G de IEC 61260-1 dice que tiene que leer una banda que se comporta como su función de transferencia (G.2.8); un diezmado que replegara energía dentro de una banda leería más, y las dos velocidades se separarían.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
from phonometry import filters
bank = filters.OctaveFilterBank(48000, fraction=3, order=6, limits=[25, 10000])
filters.verify_time_invariance(bank).plot(language="es")
plt.show()

2. Clase 0 (IEC 61260:1995 / ANSI S1.11-2004)

Sección titulada «2. Clase 0 (IEC 61260:1995 / ANSI S1.11-2004)»

La clase de prestaciones más estricta, la clase 0, la definió la edición anterior IEC 61260:1995 y su gemela estadounidense ANSI S1.11-2004 (ambas retiradas/sustituidas pero aún referenciadas para instrumentos de laboratorio); IEC 61260-1:2014 la eliminó. Sus máscaras de clase 1/2 difieren ligeramente de la edición de 2014, así que se selecciona con un conmutador edition en lugar de mezclarse con la máscara de 2014:

from phonometry import filters
fs = 48000
bank = filters.OctaveFilterBank(fs, fraction=1, order=6, limits=[800, 1200])
result = filters.verify_filter_class(bank, edition="1995") # clases 0, 1, 2
print(result.overall_class) # 0 (el Butterworth por defecto la supera)
print(result.bands[0]["margin_class0_db"])
Corredores de aceptación anidados en la banda de paso para las clases 0, 1 y 2 de IEC 61260:1995 con la respuesta Butterworth de orden 6 dentro del corredor de clase 0 más estrechoCorredores de aceptación anidados en la banda de paso para las clases 0, 1 y 2 de IEC 61260:1995 con la respuesta Butterworth de orden 6 dentro del corredor de clase 0 más estrecho

El corredor de clase 0 (±0,15 dB en el centro de banda) es el más estrecho; la clase 1 (±0,3 dB) y la clase 2 (±0,5 dB) son progresivamente más anchas. El Butterworth de orden 6 serpentea dentro de la clase 0 en toda la banda de paso.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import sosfreqz
from phonometry import filters
fs = 48000
bank = filters.OctaveFilterBank(fs, fraction=1, order=6, limits=[800, 1200])
idx = int(np.argmin(np.abs(np.array(bank.freq) - 1000)))
fm, fsd = bank.freq[idx], fs / bank.factor[idx]
w, h = sosfreqz(bank.sos[idx], worN=2**15, fs=fsd)
att = -20 * np.log10(np.abs(h) + 1e-12)
delta_a = att - np.interp(fm, w, att)
# Solo banda de paso: fuera de los bordes el límite máximo es +inf.
g = 10 ** (3 / 10)
grid = np.linspace(g ** -0.5, g ** 0.5, 1500)
pb = (w / fm >= g ** -0.5) & (w / fm <= g ** 0.5)
fig, ax = plt.subplots(figsize=(9, 5.5))
for cls in (2, 1, 0): # corredores anidados, clase 0 el más estrecho
lo, hi = filters.class_limits(1.0, cls, grid, edition="1995")
ax.plot(grid, hi, label=f"Corredor de clase {cls}")
ax.plot(grid, lo, color=ax.lines[-1].get_color())
ax.plot(w[pb] / fm, delta_a[pb], "k", lw=2, label="Butterworth de orden 6")
ax.set(xscale="log", xlim=(g ** -0.5, g ** 0.5), ylim=(-0.7, 6),
xlabel="Frecuencia normalizada f / fm",
ylabel="Atenuación relativa [dB]")
ax.legend()
plt.show()

Las máscaras son cotas de error en el peor caso de una medición, no valoraciones abstractas:

  • En la banda de paso el corredor acota cuánto puede desviarse la lectura del contenido dentro de banda: un banco de clase 1 lee un tono de centro de banda a ±0,4 dB de su nivel verdadero y uno de clase 2 a ±0,6 dB (Tabla 1 de IEC 61260-1:2014; las máscaras de la Tabla 1 de IEC 61260:1995, más estrictas, permitían ±0,3 dB para la clase 1, ±0,5 dB para la clase 2 y ±0,15 dB para la clase 0). Hacia los bordes el corredor se ensancha, lo que es la admisión honesta de que un tono situado exactamente en un borde es genuinamente ambiguo entre dos bandas (ambas lo leen unos 3 dB por debajo).

  • En la banda atenuada la máscara de atenuación mínima acota la fuga del resto del espectro: lejos de la banda, la clase 1 exige al menos 70 dB de atenuación relativa (la razón por la que el valor por defecto de cheby2 es 72 dB). En términos de energía, un tono fuera de banda tiene que ser unos 70 dB más fuerte que el contenido propio de la banda para duplicar su lectura de energía (+3 dB). La consecuencia práctica: al medir bandas muy por debajo de un tono dominante, la lectura toca fondo en la falda de fuga unos 70 dB por debajo, y una arquitectura más abrupta (o mayor orden) es la única forma de empujar ese suelo más abajo.

    Niveles en tercios de octava de un tono de 1 kHz a 100 dB SPL sobre un fondo de ruido rosa cuyos niveles de banda rondan los 22 dB, analizados con bancos de orden 6 y de orden 10. La banda de 1 kHz lee 100 dB, las bandas vecinas caen bruscamente y por debajo de unos 500 Hz los niveles medidos se aplanan sobre una falda situada entre 65 y 70 dB por debajo del tono, muy por encima del nivel de fondo real dibujado con línea de puntos; por encima de unos 8 kHz la falda ya ha caído por debajo del ruido y los niveles medidos se juntan con él. El banco de orden 10 baja la falda de forma visible en el lado agudo del tonoNiveles en tercios de octava de un tono de 1 kHz a 100 dB SPL sobre un fondo de ruido rosa cuyos niveles de banda rondan los 22 dB, analizados con bancos de orden 6 y de orden 10. La banda de 1 kHz lee 100 dB, las bandas vecinas caen bruscamente y por debajo de unos 500 Hz los niveles medidos se aplanan sobre una falda situada entre 65 y 70 dB por debajo del tono, muy por encima del nivel de fondo real dibujado con línea de puntos; por encima de unos 8 kHz la falda ya ha caído por debajo del ruido y los niveles medidos se juntan con él. El banco de orden 10 baja la falda de forma visible en el lado agudo del tono

    Cómo se ve la última frase convertida en medida. Toda banda cuyo nivel se apoya en la falda está informando del rechazo del filtro al tono de 1 kHz, no del sonido presente en esa banda: la línea de puntos es lo que hay realmente. La comprobación no tiene ningún misterio en cuanto la buscas: sube el orden y las bandas que están midiendo el filtro se mueven, mientras que las bandas que están midiendo el sonido no.

  • Para el balance de incertidumbre, la clase es la contribución del filtro a la incertidumbre de la medición: un banco de clase 1 añade hasta unas décimas de dB a un nivel de banda, comparable a los demás términos de tolerancia de un sonómetro de clase 1, y por eso las cadenas con calidad de instrumento especifican la clase de cada etapa en lugar de una única cifra global.

¿Qué arquitectura alcanza qué clase? Bajo la edición de 2014, cuyas únicas clases son la 1 y la 2, los bancos Butterworth de orden 6 de octavas y de tercios de octava por defecto de la biblioteca cumplen la clase 1 en todos los requisitos, con un margen de +0,400 dB en la Tabla 1 (el techo, y el apartado 1 explica por qué) y la suma del apartado 1b también dentro de la clase 1. Frente a la máscara más estricta de 1995 / ANSI S1.11-2004 (edition="1995") ese mismo valor por defecto alcanza la clase 0; la configuración que verifica la batería de conformidad a esa clase es el banco de bandas de octava a 48 kHz, así que vuelve a ejecutar verify_filter_class(bank, edition="1995") por tu cuenta antes de escribir clase 0 en un documento para cualquier otra fracción o frecuencia de muestreo. Escribir «clase 0 según IEC 61260-1:2014» es una afirmación contra una clase que esa edición no define.

La tabla indica la mejor clase que alcanza cada arquitectura con orden 6 y fs 48 kHz bajo la máscara de 1995; las arquitecturas distintas de Butterworth se quedan por debajo porque cambian la máscara IEC por otra propiedad por construcción:

ArquitecturaMejor clase (orden 6, fs 48 kHz, edition="1995")Por qué
butter (por defecto)0Banda de paso máximamente plana, caída monótona; encaja en la máscara
cheby21Banda de paso plana pero la relación de la máscara limita en clase 1
cheby1—El rizado de banda de paso viola el límite de planitud
ellip—Rizado en banda de paso y atenuada
bessel—Retardo de grupo plano a costa de una caída lenta

Bajo la edición de 2014 esa misma columna se lee 1, 1 y sin clase para las otras tres: cheby2 se junta con Butterworth en lo más alto porque ya no existe la clase 0 para separarlos. Es el banco de una sola banda de la figura de abajo; un banco de varias bandas añade la suma del apartado 1b, y los bancos de octavas Butterworth y Chebyshev II diezmados también cumplen en ella la clase 1.

Cuatro paneles, cada uno con la banda de octava de 1 kHz de un banco de orden 6 dibujada sobre el corredor de aceptación de IEC 61260-1, con las muestras fuera de tolerancia marcadas en rojo. Butterworth enhebra limpiamente el corredor de clase 1 e informa overall_class 1. Chebyshev I se sale del corredor en dos rachas cortas justo por dentro de cada borde de banda, donde está su rizado de banda de paso, e informa None. El elíptico hace lo mismo en los dos bordes e informa None. Bessel se sale del corredor a lo largo de toda la falda inferior porque cae demasiado despacio, e informa NoneCuatro paneles, cada uno con la banda de octava de 1 kHz de un banco de orden 6 dibujada sobre el corredor de aceptación de IEC 61260-1, con las muestras fuera de tolerancia marcadas en rojo. Butterworth enhebra limpiamente el corredor de clase 1 e informa overall_class 1. Chebyshev I se sale del corredor en dos rachas cortas justo por dentro de cada borde de banda, donde está su rizado de banda de paso, e informa None. El elíptico hace lo mismo en los dos bordes e informa None. Bessel se sale del corredor a lo largo de toda la falda inferior porque cae demasiado despacio, e informa None

Los veredictos de la tabla, dibujados. Chebyshev I y el elíptico asoman por encima del límite justo por dentro de los bordes de banda, donde vive su rizado; Bessel se sale a lo largo de la falda, porque nunca cae lo bastante rápido. Las muestras en rojo son las que verify_filter_class anotó en contra del diseño, y esto es exactamente lo que dibuja verify_filter_class(bank).plot() para un banco tuyo. Ojo a un detalle: la gráfica sombrea el corredor de la clase a la que más se acercó cada diseño, así que los tres paneles que fallan muestran el corredor de clase 2.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
# `filters` es el import de los fragmentos anteriores.
fs = 48000
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
for ax, ftype in zip(axes.ravel(), ("butter", "cheby1", "ellip", "bessel")):
bank = filters.OctaveFilterBank(
fs, fraction=1, order=6, limits=[800, 1200],
design=filters.FilterDesign(filter_type=ftype))
result = filters.verify_filter_class(bank)
result.plot(ax=ax, language="es")
ax.set_title(f"{ftype}: overall_class = {result.overall_class}")
plt.tight_layout()
plt.show()

Así que el valor por defecto sensato es el habitual (Butterworth de orden 6), mientras que las arquitecturas alternativas son opciones deliberadas cuyo propósito (caída más abrupta, fase lineal) va en contra de la máscara de clase. Fuera de estos ajustes (fraction muy alto o bandas cercanas a Nyquist), vuelve a ejecutar verify_filter_class para confirmar la clase que necesitas.

verify_filter_class responde a una pregunta sobre un diseño: si esta función de transferencia cabe en la máscara. Un laboratorio responde a otra pregunta distinta, sobre un equipo en una fecha, y los dos veredictos no son intercambiables.

El recorrido completo de la Tabla 1 pertenece al ensayo de tipo (IEC 61260-2:2016), que un modelo de juego de filtros supera una sola vez, sobre especímenes, en un clima declarado y tras los ensayos de inmunidad. Lo que en él es aritmética sobre una respuesta, el ancho de banda efectivo, la suma y el ensayo de barrido, son los apartados 1b y 1c; el resto necesita el equipo. Lo que recibe de verdad un instrumento en servicio es el ensayo periódico de IEC 61260-3:2016, y es más estrecho a propósito: se mide la atenuación relativa en la frecuencia central exacta de cada filtro del juego, por la entrada eléctrica y en el rango de nivel de referencia, o bien, si los filtros son invariantes en el tiempo, la desviación del ancho de banda efectivo obtenida con un único barrido exponencial sobre todo el juego; la atenuación relativa de tres filtros escogidos, uno bajo, uno medio y uno alto, en las frecuencias normalizadas del apartado 13 ( de a , hasta donde alcance el rango de frecuencias del juego); el rango lineal de funcionamiento con su control de rango de nivel y su comportamiento ante sobrecarga; y el límite inferior de ese rango, todo bajo condiciones ambientales declaradas y con equipos de ensayo trazables. Por eso un certificado lleva una fecha, una temperatura y una lista de números de serie, y por eso no dice nada de las partes de la máscara que no recorrió.

Lo que sí se hereda merece constar en un informe: el veredicto de clase de esta página lo heredan todas las medidas hechas con los filtros de la biblioteca, y una cadena de hardware añade un veredicto propio. Nombra los dos. El régimen equivalente para los sonómetros (los ensayos periódicos de IEC 61672-3, y la IEC 60942 para el calibrador) está en Calibración y dBFS.

Calificar un ensayo periódico. Los ensayos los hace el laboratorio; el veredicto sobre lo que midió es aritmética, y lo hace verify_filter_periodic. Cada resultado entra con la incertidumbre expandida del laboratorio, y cada uno se juzga con la regla de conformidad del IEC TC 29 (metrology.verify_conformance): la desviación dentro de sus límites de aceptación y la incertidumbre dentro del máximo que el Anexo B de IEC 61260-1:2014 permite para ese ensayo. Apartado por apartado:

ApartadoQué midió el laboratorioLímites de aceptación máxima (Anexo B)
10.2atenuación relativa de cada filtro en su frecuencia central exacta±0,4 dB clase 1, ±0,6 dB clase 20,20 dB, o 0,30 dB pasada una de 2 dB
10.3o, filtros invariantes en el tiempo, con un único barrido±0,4 dB clase 1, ±0,6 dB clase 20,20 dB
11.7linealidad de nivel en el rango de referencia±0,5 dB clase 1, ±0,6 dB clase 2 hasta 40 dB por debajo del límite superior; ±0,7 dB y ±0,9 dB más allá0,20 dB hasta 40 dB, 0,35 dB más allá
11.9linealidad de nivel en cada otro rango, 30 dB por debajo de su límite superiorcomo 11.7como 11.7
13atenuación relativa de tres filtros en hasta 15 Tabla 1 de IEC 61260-30,20, 0,30 o 0,50 dB según llegue a 2 dB, a 40 dB o más

Las quince frecuencias del apartado 13 salen de las Fórmulas (1) y (2) de IEC 61260-3 para cualquier designador de ancho de banda, periodic_test_frequencies(b), y su Tabla 1 es PERIODIC_TEST_ATTENUATION_LIMITS_DB, con las filas de banda atenuada sin máximo. Un laboratorio deja fuera las frecuencias que caen fuera del rango del juego (13.4) escribiendo NaN en su lugar.

from phonometry import filters
omega = filters.periodic_test_frequencies(3)
print(round(float(omega[8]), 5)) # 1.02667, Tabla C.1
print(filters.PERIODIC_TEST_ATTENUATION_LIMITS_DB[1][7]) # (70.0, inf)
row = [76.0, 63.0, 45.0, 20.0, 0.8, 0.3, 0.1, 0.0, 0.1, 0.2, 0.7, 19.0, 44.0, 63.0, 77.0]
row_u = [0.4, 0.4, 0.4, 0.25, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.25, 0.4, 0.4, 0.4]
record = filters.FilterPeriodicMeasurements(
midband_attenuations_db=[0.12, -0.05, 0.08, 0.02, -0.1, 0.15],
midband_uncertainties_db=[0.15] * 6,
linearity_deviations_db=[0.0, 0.1, 0.2, -0.3, 0.4],
linearity_levels_below_upper_db=[0.0, 10.0, 20.0, 45.0, 55.0],
linearity_uncertainties_db=[0.12, 0.12, 0.25, 0.2, 0.3],
relative_attenuations_db=[row, [x + 0.2 for x in row], row],
relative_attenuation_uncertainties_db=[row_u, row_u, row_u],
)
verdict = filters.verify_filter_periodic(1, record, fraction=3)
print(verdict.passes) # False
print(verdict.unusable) # (('11.7', '20 dB below the upper boundary'),)
print(verdict.failed) # ()

Todas las desviaciones de ese registro están dentro de sus límites, y el veredicto sigue sin ser un aprobado: una lectura de linealidad se tomó con 0,25 dB de incertidumbre expandida donde el Anexo B admite 0,20 dB, y el 5.3 de IEC 61260-3 prohíbe usarla. verdict.statement lo dice con las palabras de la norma, y en cuanto todos los resultados son utilizables pasa a ser la declaración que prescribe el Capítulo 14: la 14 k) cuando la aprobación de modelo es pública (pattern_approval_public=True), la 14 l) si no, con la salvedad del 1.5 de que de los ensayos periódicos solos no se sigue ninguna conclusión general sobre IEC 61260-1.

Un aprobado también exige que los ensayos cubran lo que la norma les pide: el 11.3 y el 13.1 miden tres filtros, y el 13.4 mide cada uno en todas las frecuencias de ensayo por encima de 0,5 veces la frecuencia central más baja del juego y por debajo de 1,5 veces la más alta. Con las frecuencias centrales del juego (set_midband_frequencies_hz), de los tres filtros ensayados (tested_midband_frequencies_hz) y del filtro de cada resultado de linealidad (linearity_midband_frequencies_hz), el veredicto los cuenta, y verdict.incomplete enumera cada carencia, incluido un NaN donde el 13.4 pide una medida; retiene el aprobado igual que un apartado sin medir. Un registro sin ellas no se puede comprobar en cobertura: verdict.coverage_checked es False, y una declaración de aprobado termina diciendo que la cobertura no se comprobó. Una atenuación de centro de banda del 10.2 toma su máximo del Anexo B de lo que se midió, como hace el apartado 13: un filtro que se ha desviado más de 2 dB en su frecuencia central admite 0,30 dB, y por eso no supera el ensayo en lugar de quedar no utilizable.

El margen de cada resultado de un ensayo periódico de clase 1 a su límite de aceptación más próximo, agrupado por apartado: seis resultados de centro de banda del 10.2 entre 0,25 dB y 0,38 dB, cinco resultados de linealidad de nivel del 11.7 y cuarenta y cinco atenuaciones relativas del apartado 13, en una escala lineal hasta 1 dB y logarítmica por encima. Todos los resultados quedan por encima de la línea roja de aceptación en cero con su incertidumbre expandida dibujada como barra, y todos son rombos verdes salvo un resultado del 11.7 dibujado como círculo naranja hueco, no utilizable según el 5.3 porque su incertidumbre supera el máximo del Anexo B. El título dice no superadosEl margen de cada resultado de un ensayo periódico de clase 1 a su límite de aceptación más próximo, agrupado por apartado: seis resultados de centro de banda del 10.2 entre 0,25 dB y 0,38 dB, cinco resultados de linealidad de nivel del 11.7 y cuarenta y cinco atenuaciones relativas del apartado 13, en una escala lineal hasta 1 dB y logarítmica por encima. Todos los resultados quedan por encima de la línea roja de aceptación en cero con su incertidumbre expandida dibujada como barra, y todos son rombos verdes salvo un resultado del 11.7 dibujado como círculo naranja hueco, no utilizable según el 5.3 porque su incertidumbre supera el máximo del Anexo B. El título dice no superados

verdict.plot(): el margen de cada resultado a su límite más próximo con su incertidumbre expandida, apartado por apartado. El círculo hueco es el único resultado que el 5.3 deja inutilizable, y él solo frena el veredicto.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
# `verdict` es el resultado del fragmento anterior.
verdict.plot(language="es")
plt.show()

Lo que el calificador periódico deja al informe del laboratorio: el ruido propio del Capítulo 12, para el que el Anexo B no fija incertidumbre máxima, la indicación de sobrecarga de 11.5 y 11.8, y las observaciones de los Capítulos 4 y 6 a 8 (inspección previa, condiciones ambientales, el manual) no se califican; anótalas junto al veredicto.

verify_filter_class(bank) devuelve un objeto de resultado que expone .plot() y .report(), de modo que el veredicto del ensayo de tipo puede renderizarse como una ficha acreditada de una página. La ficha lista la clase alcanzada por cada banda y su margen vinculante sobre todos los requisitos calificados, tabula los requisitos de los apartados 1 y 1b con la clase, el margen vinculante y el intervalo de cada uno, superpone la atenuación relativa medida de la banda de peor margen sobre el corredor de la clase y encuadra el resultado global de conformidad. Pasa un required_class en el ReportMetadata para añadir una fila de veredicto CUMPLE/NO CUMPLE (un banco «cumple la clase N» cuando su clase alcanzada es al menos igual de estricta, es decir, un índice de clase N o inferior). La ficha se genera en inglés por defecto; pasa language="es" para una ficha en español (cadenas fijas traducidas y coma como separador decimal), p. ej. result.report("iec61260_es.pdf", language="es").

El ejemplo es el banco de octavas diezmado de 125 Hz a 4 kHz, la configuración que el apartado 1b muestra como clase 1 en todos los requisitos:

from phonometry import ReportMetadata, filters
bank = filters.OctaveFilterBank(fs=48000, fraction=1, order=6, limits=[125, 4000])
result = filters.verify_filter_class(bank) # overall_class == 1
result.plot(language="es") # la banda de peor margen sobre su corredor de clase
result.report(
"iec61260.pdf",
metadata=ReportMetadata(
specimen="Banco de filtros de octava (1/1)",
measurement_standard="IEC 61260-1:2014",
required_class=1, # se exige clase 1 (o más estricta)
),
) # -> Class 1 - COMPLIES, PASS

La ficha de ejemplo se regenera con make reports y se mantiene renderizada en el repositorio; pulsa la vista previa para abrir el PDF.

Informe de ejemplo de conformidad de clase de filtro IEC 61260-1 (PDF)

Ficha de conformidad de clase de filtro de una página: una cabecera de metadatos, una tabla de clasificación por bandas con la clase alcanzada y el margen vinculante de cada banda de octava, la atenuación relativa medida de la banda de peor margen superpuesta sobre el corredor de aceptación verde de clase 1 con los tres requisitos calificados debajo, el resultado encuadrado Class 1 - COMPLIES y un veredicto CUMPLE frente a la clase 1 exigida.

Descargar el informe (PDF)

Ficha de conformidad de clase de filtro (FilterComplianceResult.report), clase alcanzada con el margen vinculante en dB, la atenuación relativa medida sobre el corredor de la Tabla 1 y la clase de cada requisito de IEC 61260-1:2014 calificado.

Pasar edition="1995" verifica contra la máscara más antigua de IEC 61260:1995 / ANSI S1.11-2004, que conserva la clase 0 más estricta que la edición de 2014 eliminó, de modo que un banco de orden 6 puede certificarse a clase 0:

bank = filters.OctaveFilterBank(fs=48000, fraction=1, order=6, limits=[250, 4000])
result = filters.verify_filter_class(bank, edition="1995") # overall_class == 0
result.plot(language="es") # el corredor de clase 0 de la edición de 1995
result.report("iec61260_1995.pdf",
metadata=ReportMetadata(measurement_standard="IEC 61260:1995",
required_class=0)) # -> Class 0 - COMPLIES
Informe de ejemplo de conformidad de clase 0 IEC 61260:1995 (PDF)

Ficha de conformidad de clase de filtro de una página bajo la edición de 1995: una tabla de clasificación por bandas con cada banda de octava alcanzando la clase 0, la atenuación relativa medida superpuesta sobre el corredor de aceptación verde de clase 0, el resultado encuadrado Class 0 - COMPLIES (margin +0.15 dB) y un veredicto CUMPLE frente a la clase 0 exigida.

Descargar el informe (PDF)

La clase 0 la conserva la edición IEC 61260:1995 / ANSI S1.11-2004 (edition='1995'); la edición de 2014 solo mantiene las clases 1 y 2.
  • Cubierto

    Los límites de aceptación de clase 1 y clase 2 de la Tabla 1 de IEC 61260-1:2014 (con el mapeo de los puntos de quiebre a cada fracción de octava y la interpolación logarítmica de la norma), comprobados banda a banda por verify_filter_class y publicados como máscara por class_limits; la desviación del ancho de banda efectivo (5.12) y la suma de las señales de salida (5.16), calificadas por la misma llamada tal como las calcula IEC 61260-2:2016 (Fórmulas (1) a (3)); el ensayo de barrido del funcionamiento invariante en el tiempo (5.14, 7.4 de IEC 61260-2) ejecutado sobre el banco por verify_time_invariance, con la Fórmula (17) y su incertidumbre del Anexo A; la máscara de clase 0 de la edición retirada IEC 61260:1995 / ANSI S1.11-2004, accesible con edition="1995"; la calificación apartado por apartado de los resultados de ensayo periódico IEC 61260-3:2016 de un laboratorio con verify_filter_periodic, con sus frecuencias de ensayo, su Tabla 1 y la declaración del Capítulo 14; y la ficha acreditada de una página de verify_filter_class().report(), con su veredicto opcional CUMPLE/NO CUMPLE frente a required_class, en inglés y en español.

  • No cubierto

    Los propios ensayos sobre un filtro físico: los especímenes y los ensayos de clima, inmunidad, sobrecarga y linealidad de IEC 61260-2 y las mediciones de IEC 61260-3 los hace un laboratorio, y verify_filter_periodic califica los números que devuelve sin producirlos. De ellos, el ruido propio del Capítulo 12 de IEC 61260-3 y las indicaciones de sobrecarga de 11.5 y 11.8 no se califican. Un veredicto con edition="1995" es solo su máscara de la Tabla 1: el ancho de banda efectivo y los demás requisitos de esa edición no se califican. Cerca de Nyquist la transformada bilineal deforma el eje de frecuencia y el banco no lo corrige, así que la máscara de banda atenuada más allá del Nyquist de procesado se informa como range_limited en lugar de verificarse: mantén el borde de banda superior holgadamente por debajo de Nyquist o sube fs.

¿Qué arquitectura de filtro cumple la clase 1 de IEC 61260-1 con los ajustes por defecto?

Sección titulada «¿Qué arquitectura de filtro cumple la clase 1 de IEC 61260-1 con los ajustes por defecto?»

Con el orden 6 por defecto, Butterworth cumple la clase 1 de los límites de aceptación de la Tabla 1 de IEC 61260-1:2014, y también Chebyshev II: su attenuation por defecto de 72 dB supera el límite de clase 1 de 70 dB en la banda atenuada lejana. Chebyshev I, elíptico y Bessel no la cumplen: el rizado de banda de paso (cheby1, ellip) y la caída lenta (bessel) violan la máscara. verify_filter_class informa de la clase alcanzada por banda, en la Tabla 1 y también en los requisitos de ancho de banda efectivo y de suma.

¿Es clase 1 el banco de octavas por defecto según IEC 61260-1:2014?

Sección titulada «¿Es clase 1 el banco de octavas por defecto según IEC 61260-1:2014?»

Sí, en todos los requisitos que se le califican: la máscara de la Tabla 1, el ancho de banda efectivo (5.12) y la suma de las señales de salida (5.16). El banco Butterworth de octavas diezmado suma las salidas adyacentes entre −0,06 dB y +0,69 dB respecto a la entrada en su rango por defecto a 48 kHz, dentro de los −1,8 dB y +0,8 dB de la clase 1 con 0,11 dB de margen, igual que el mismo banco diseñado a la frecuencia completa con FilterDesign(resample=False): el banco diezma una banda solo hasta donde su frecuencia de Nyquist de procesado sigue siendo al menos dieciséis veces su borde superior de banda, y ahí el diezmado mueve la suma como mucho 0,005 dB. El banco de tercios de octava también es clase 1 en todos los requisitos, con 0,04 dB de margen en la suma.

¿Qué es la clase 0 y qué norma la define?

Sección titulada «¿Qué es la clase 0 y qué norma la define?»

La clase 0 es la clase de prestaciones más estricta, definida por IEC 61260:1995 y su gemela estadounidense ANSI S1.11-2004 y eliminada por IEC 61260-1:2014. Su corredor de banda de paso admite solo ±0,15 dB en el centro de banda, frente a ±0,3 dB para la clase 1 en las máscaras de 1995. Sigue accesible con edition="1995", y el banco Butterworth de orden 6 por defecto cumple la clase 0 en la configuración que verifica el informe de conformidad, el banco de bandas de octava a 48 kHz. Bajo IEC 61260-1:2014 ese mismo banco es clase 1, en la máscara de la Tabla 1 y en el ancho de banda efectivo y la suma del 5.12 y el 5.16: la edición de 2014 no define ninguna clase 0, así que una afirmación de clase 0 tiene que citar la máscara de 1995 / ANSI S1.11-2004 frente a la que se midió.

  • American National Standards Institute. (2004). Specification for octave-band and fractional-octave-band analog and digital filters (ANSI S1.11-2004). Acoustical Society of America. Sus límites de clase de la Tabla 1 son idénticos a los de IEC 61260:1995 y respaldan la misma máscara de clase 0.
  • International Electrotechnical Commission. (1995). Electroacoustics — Octave-band and fractional-octave-band filters (IEC 61260:1995). La primera edición retirada cuya Tabla 1 aporta la máscara de clase 0 más estricta que ofrece edition='1995'.
  • International Electrotechnical Commission. (2014). Electroacoustics — Octave-band and fractional-octave-band filters — Part 1: Specifications (IEC 61260-1:2014). Los límites de aceptación de clase 1 y clase 2 de la Tabla 1 verificados aquí, con el mapeo de los puntos de quiebre a cada fracción de octava y la interpolación logarítmica de la norma.
  • International Electrotechnical Commission. (2016). Electroacoustics — Octave-band and fractional-octave-band filters — Part 2: Pattern-evaluation tests (IEC 61260-2:2016). El régimen de ensayo de tipo que un modelo de juego de filtros supera una sola vez. Sus Fórmulas (1) a (3), las frecuencias de ensayo, el ancho de banda efectivo por trapecios y la suma de las salidas adyacentes, son como verify_filter_class califica los apartados 5.12 y 5.16 de la Parte 1; su ensayo de barrido de 7.4, con los Anexos A y B, es verify_time_invariance, swept_band_level y swept_level_uncertainty. Los especímenes y los ensayos de clima, inmunidad y linealidad necesitan un equipo físico.
  • International Electrotechnical Commission. (2016). Electroacoustics — Octave-band and fractional-octave-band filters — Part 3: Periodic tests (IEC 61260-3:2016). Los ensayos periódicos que recibe un analizador en servicio: atenuación relativa en el centro de banda de todos los filtros o, si son invariantes en el tiempo, desviación del ancho de banda efectivo con un barrido sobre todo el juego; atenuación relativa de tres filtros escogidos en las frecuencias del apartado 13; rango lineal de funcionamiento y su límite inferior, bajo condiciones ambientales declaradas. verify_filter_periodic califica frente a ellos los resultados de un laboratorio, con las Fórmulas (1) y (2) de periodic_test_frequencies y la Tabla 1 de PERIODIC_TEST_ATTENUATION_LIMITS_DB.