python - low - Conversión de la frecuencia de muestreo/frecuencia de corte a pi-radianes/muestra en un sistema de filtro IIR muestreado en tiempo discreto
filtro butterworth python (2)
Si su tasa de muestreo es fs, la tasa de Nyquist es fs / 2. Esto representa la frecuencia representable más alta que puede tener sin aliasing. 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, debe ingresarlo como fc / (fs / 2).
Por ejemplo, tiene fs = 8000 por lo 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?
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 del 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
( de 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 de descenso de 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 una pendiente deseada, y calculo los valores de wp, ws
partir de eso?
(Esto podría ser más apropiado para math.stackexchange. No estoy seguro)
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 (plegado) 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
. Por lo tanto, la señal x[n] = cos[pi*n] = [1,-1,1,-1,...]
.
La versión muestreada de una frecuencia determinada, 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 Nyquist pi, eso es 2*fc/fs = fc/(fs/2)
.
Algunas fórmulas para vivir:
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
El DFT del componente par (una suma de cosenos) de una señal de valor real será real y simétrico, mientras que el DFT del componente impar (una suma de senos) será imaginario y antisimétrico. Por lo tanto, para señales de valor real tales como la respuesta de 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 debe especificar un filtro para el rango de 0 a pi, que se normaliza a [0,1].