Conversione da samplerate / frequenza di taglio di pi-radianti / campione in un tempo discreto campionata sistema di filtri IIR

StackOverflow https://stackoverflow.com/questions/4697235

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)

È stato utile?

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].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top