Quando si decima un segnale a banda stretta con un filtro a cascata integratore-pettine (CIC) , quale filtro FIR è più adatto a compensare la risposta della frequenza CIC?
Quando si decima un segnale a banda stretta con un filtro a cascata integratore-pettine (CIC) , quale filtro FIR è più adatto a compensare la risposta della frequenza CIC?
Risposte:
Non esiste una risposta unica alla tua domanda: come per qualsiasi problema di progettazione del filtro, dipende dalle tue esigenze. Come descritto abbastanza bene sulla pagina di Wikipedia , i filtri CIC (cascaded-integrator-comb) consistono in un numero di coppie di stadi integrator e comb (da cui il nome). Ogni stadio integratore-pettine ha una risposta all'impulso aggregata che è equivalente a un filtro boxcar (cioè uno con una risposta in frequenza rettangolare). La risposta in frequenza (magnitudo) di un vagone box ha una forma che ricorda una funzione sinc, quindi la struttura CIC complessiva avrà una risposta magnitudo che assomiglia a una funzione sinc portata a una potenza , dove N è il numero di stadi integratore-pettine.
Tuttavia, non ci sono molte manopole da modificare in base a requisiti specifici dell'applicazione. Puoi modificare il rapporto di decimazione / interpolazione della struttura CIC, il ritardo del pettine e il numero di stadi, ma sei ancora bloccato con la risposta in frequenza sincera, che non è particolarmente ideale, poiché non è piatta attraverso lobo principale e presenta sidelobes relativamente alti. Quindi, è tipico che un CIC sia seguito da un altro filtro che "pulisce" la risposta complessiva.
Il problema: quello che ti serve da qualsiasi filtro di compensazione che inserisci dopo il CIC verrà definito dalla tua applicazione. Ciò che è veramente importante è la risposta dell'intera cascata, che vinceresti in base alle esigenze della tua applicazione. Non esiste un filtro specifico "più adatto".
C'era una domanda simile, https://dsp.stackexchange.com/a/1551/306 , e il seguente è un sottoinsieme della risposta dell'altro post.
In generale, per compensare un filtro CIC è possibile utilizzare l'inverso della risposta dei filtri CIC per generare il filtro di compensazione. Il CIC ha una risposta di 2
Dove D è il ritardo di differenziazione, M è la velocità di decimazione e N è l'ordine del filtro (numero di filtri in cascata). L'inverso può essere specificato come
Una volta ottenuta la risposta in frequenza del filtro di compensazione, possiamo semplicemente scegliere la lunghezza del filtro FIR che desideriamo. La lunghezza della FIR è specifica dell'applicazione. Ovviamente più è lungo il filtro FIR, migliore è la compensazione.
Di seguito sono riportati i grafici di questa compensazione diretta.
Di seguito è riportato il codice Python per creare le risposte e i grafici della frequenza.
import numpy as np from numpy import sin, abs, pi import pylab
D = 1; M = 7; N = 3
Hfunc = lambda w : abs( (sin((w*M)/2)) / (sin((w*D)/2.)) )**N
HfuncC = lambda w : abs( (sin((w*D)/2.)) / (sin((w*M)/2.)) )**N
w = np.arange(1024) * pi/1024
G = (M*D)**N
H = np.array(map(Hfunc, w))
Hc = np.array(map(HfuncC, w))
# only use the inverse (compensation) roughly to the first null.
Hc[int(1024*pi/M/2):] = 1e-8
plot(w, 20*log10(H/G))
plot(w, 20*log10(Hc*G))
grid('on')
1 Altera, "Comprensione dei filtri di compensazione CIC"
2 R. Lyons, "Comprensione dell'elaborazione del segnale digitale", 2a edizione, Prentice Hall, Upper Saddle River, New Jersey, 2004
Gli ISOP (polinomi del secondo ordine interpolati) sono spesso usati per compensare il droop della banda passante CIC.
La risposta Matlab di questo filtro può essere mostrata usando:
alpha = 0.01 ;
b = [1, alpha, -alpha] ;
h = mfilt.firsrc(1,1,b)
freqz( b )
Scegliere l'alfa per le tue esigenze è la parte difficile. Simulazioni di forza bruta preforme peggiori, ripetute da 0 a 0,5 in incrementi di 0,001, trovando l'alfa che risulta nella migliore compensazione di caduta. Definire la migliore compensazione di caduta come errore minimo ai margini della banda passante.
Per efficienza, questo filtro viene normalmente posizionato alla velocità dati inferiore, prima del CIC per l'interpolazione e dopo il CIC per la decimazione.