Conversione da samplerate / frequenza di taglio di pi-radianti / campione in un tempo discreto campionata sistema di filtri IIR
-
11-10-2019 - |
Domanda
sto lavorando su facendo un lavoro filtro digitale utilizzando Python e Numpy / SciPy.
sto usando scipy.signal.iirdesign per generare i miei coefficienti di filtro, ma richiede il filtro passa banda coefficienti in un formato non ho familiarità con
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
( da qui )
Non ho dimestichezza con filtri digitali (sto provenienti da un disegno di fondo hardware). In un contesto analogico, avrei determinare la pendenza desiderata e la 3dB basso punto, e calcolare i valori dei componenti da questo.
In questo contesto, come faccio a prendere una frequenza di campionamento noto, una frequenza di taglio desiderata, e un'attenuazione desiderato e calcolare i valori wp, ws
da questo?
(Questo potrebbe essere più appropriato per math.stackexchange. Io non sono sicuro)
Soluzione
Se la frequenza di campionamento è fs, il tasso di Nyquist è fs / 2. Questo rappresenta la frequenza rappresentabile più alto si può avere senza aliasing. E 'anche equivalente al valore normalizzato di 1 cui dalla documentazione. Pertanto, se si progetta un filtro passa-basso con una frequenza di taglio fc, devi inserire come fc / (fs / 2).
Per esempio, avete fs = 8000 così fs / 2 = 4000. Si desidera un filtro passa-basso con una frequenza di taglio di 3100 e una frequenza di banda di arresto del 3300. I valori risultanti sarebbero wp = fc / (fs / 2) = 3100/4000. La frequenza stopband sarebbe 3300/4000.
ha senso?
Altri suggerimenti
Prendere la funzione x(t) = cos(2*pi*fa*t)
. Se stiamo campionamento a frequenza fs, la funzione di campionato è x(n*ts) = x(n/fs) = cos(2*pi*n*fa/fs)
. La frequenza massima prima aliasing (piegatura) è la frequenza di Nyquist fa = fs / 2, che normalizza a (fs/2)/fs = 1/2
. La frequenza angolare normalizzata è 2*pi*1/2 rad/sample = pi rad/sample
. Quindi il segnale x[n] = cos[pi*n] = [1,-1,1,-1,...]
.
La versione campionata di una data frequenza, ad esempio un 2*pi*fc rad/s
frequenza d'angolo sarebbe 2*pi*fc/fs rad/sample
. Come una frazione del pi greco frequenza di Nyquist, che è 2*fc/fs = fc/(fs/2)
.
A poche formule per vivere:
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, anche (una somma di coseni) di un segnale a valori reali sarà reale e simmetrica, mentre la DFT del componente dispari (una somma di seni) sarà immaginaria e anti-simmetrica. Così per segnali a valori reali, come la risposta all'impulso di un tipico filtro, lo spettro di ampiezza è simmetrica mentre lo spettro di fase è antisimmetrica. Così basta specificare un filtro per il campo da 0 a pi greco, che è normalizzato a [0,1].