Conversión de frecuencia de muestreo / frecuencia de corte a radianes pi / muestra en un sistema de filtro IIR de tiempo discreto muestreado

Estoy trabajando en hacer un trabajo de filtro digital usando Python y Numpy / Scipy.

Estoy usando scipy.signal.iirdesign para generar mis coeficientes de filtro, pero requiere los coeficientes de banda de paso de filtro en un formato con el que no estoy familiarizado

wp, ws : float Passband and stopband edge frequencies, normalized from 0 to 1 (1 corresponds to pi radians / sample). For example: Lowpass: wp = 0.2, ws = 0.3 Highpass: wp = 0.3, ws = 0.2 

( desde aquí )

No estoy familiarizado con los filtros digitales (vengo de un fondo de diseño de hardware). En un contexto analógico, determinaría la pendiente deseada y el punto descendente 3db, y calcularía los valores de los componentes a partir de eso.

En este contexto, ¿cómo tomo una frecuencia de muestreo conocida, una frecuencia de esquina deseada y un rolloff deseado, y calculo los valores de wp, ws partir de eso?

(Esto podría ser más apropiado para math.stackexchange. No estoy seguro)

Si su tasa de muestreo es fs, la tasa de Nyquist es fs / 2. Esto representa la mayor frecuencia representable que puede tener sin alias. También es equivalente al valor normalizado de 1 al que hace referencia la documentación. Por lo tanto, si está diseñando un filtro de paso bajo con una frecuencia de esquina de fc, lo ingresará como fc / (fs / 2).

Por ejemplo, tienes fs = 8000 así que fs / 2 = 4000. Desea un filtro de paso bajo con una frecuencia de esquina de 3100 y una frecuencia de banda de parada de 3300. Los valores resultantes serían wp = fc / (fs / 2) = 3100/4000. La frecuencia de la banda de parada sería 3300/4000.

¿Tener sentido?

Tome la función x(t) = cos(2*pi*fa*t) . Si estamos muestreando a la frecuencia fs, la función muestreada es x(n*ts) = x(n/fs) = cos(2*pi*n*fa/fs) . La frecuencia máxima antes del aliasing (plegamiento) es la frecuencia de Nyquist fa = fs / 2, que se normaliza a (fs/2)/fs = 1/2 . La frecuencia angular normalizada es 2*pi*1/2 rad/sample = pi rad/sample . Así, la señal x[n] = cos[pi*n] = [1,-1,1,-1,...] .

La versión muestreada de una frecuencia dada, como una frecuencia de esquina 2*pi*fc rad/s sería 2*pi*fc/fs rad/sample . Como una fracción de la frecuencia de Nyquist pi, eso es 2*fc/fs = fc/(fs/2) .

Algunas fórmulas para vivir por:

 exp[j*w*n] = cos[w*n] + j*sin[w*n] x_even[n] = 0.5*x[n] + 0.5*x[-n] cos[w*n] = 0.5*exp[j*w*n] + 0.5*exp[-j*w*n] # cos is even x_odd[n] = 0.5*x[n] - 0.5*x[-n] j*sin[w*n] = 0.5*exp[j*w*n] - 0.5*exp[-j*w*n] # sin is odd 

La DFT del componente par (una sum de cosenos) de una señal de valor real será real y simétrica, mientras que la DFT del componente impar (una sum de senos) será imaginaria y anti-simétrica. Por lo tanto, para señales de valor real, como la respuesta al impulso de un filtro típico, el espectro de magnitud es simétrico, mientras que el espectro de fase es antisimétrico. Por lo tanto, solo tiene que especificar un filtro para el rango 0 a pi, que se normaliza a [0,1].