Newsgroup: it.hobby.elettronica.digitale
Titolo: Filtrino general purpose

Ciao,
sono alla ricerca di un semplice filtro FIR o IIR, che mi permetta di 
smussare un po' i segnali analogici e rimuovere spike, un leggero passa 
basso per intenderci.
Finora ho usato con successo questo IIR:
y = yo - ((yo - x) >> n);
yo = y;
Che però presenta due problemi: non linearità (si perdono 2^n valori 
alle estremità) e isteresi.
A parte questi due inconvenienti ha risolto egregiamente molti problemi 
che mi si sono presentati.
Ora però vorrei migliorarlo e avere un filtro passa-basso generico che 
sia ugualmente semplice e poco costoso ma che non abbia i due problemi 
citati.
Potete consigliarmi qualcosa? :)
Grazie come sempre,
Marco / iw2nzm

 i due problemi citati.
Ti do una risposta un pò criptica ma che risolve
egregiamente il problema: usa lo stesso filtro ma
applicagli un noise shaping in modo da eliminare
l'errore.
A.D.

 l'errore.
Uhm... io conosco il noise shaping in applicazioni audio o similari dove 
viene introdotto a valle del dithering per modellare lo spettro di 
rumore e renderlo efficare "all'orecchio" (mascherando ad esempio rumori 
correlati al segnale).
Non arrivo però a vedere come in questo caso possa eliminare l'errore di 
non linearità e dare quindi una risposta fedele (compatibilmente con la 
risoluzione dell'ADC) del segnale in ingresso.
Ciao!
Marco / iw2nzm

 dell'ADC) del segnale in ingresso.
Allora, vediamo se riesco a spiegarlo decentemente...
In pratica il noise shaping si basa sul fatto di accumulare
l'errore di quantizzazione e sottrarlo al segnale, in questo
modo in qualche modo se ne limitano gli effetti nella
banda di interesse.
Nel caso del tuo filtrino, i problemi sorgono dalla
precisione finita con cui rappresenti i segnali, ed in
particolare sono introdotti dall'operazione di shift, che
taglia del tutto alcuni bit invece di eseguire una vera e
propria divisione. Quindi per risolvere il problema ti
basta accumulare i bit che tagli e sommare il risultato
(opportunamente riscalato) all'uscita del filtro.
A volte a questa tecnica si aggiunge anche qualche
bit di rumore in modo da ottenere un vero e proprio
dithering.
Fammi sapere se funziona... :-)
A.D.

 (opportunamente riscalato) all'uscita del filtro.
Ah ok, forse ho capito. In pratica mi stai dicendo in maniera corretta 
quello che già ho fatto una volta a spanne. Cioè avevo appunto sommato e 
riscalato l'uscita del filtro per sistemare le cose. L'avevo fatto con 
un modulo Rabbit e non ci sono stati problemi. Ma impiegandolo spesso su 
microcontrollori a 8 bit tipo PIC o AVR sarei punto e a capo perché a 
fronte di un filtro semplice che fa solo operazioni di somma e shift 
avrei a valle un moltiplicatore che necessariamente deve lavorare in 
virgola mobile (a meno di ottimizzazioni che magari si possono fare 
passando con gli interi lunghi e altri shift).
Dici che comunque rimane la via più semplice?
Grazie per le risposte!
Marco / iw2nzm

 basso per intenderci.
Ciao Marco,
ecco quello che faccio io di solito:
definisco un accumulatore (occhio all'overflow!), e poi con 2 sole righe 
di codice costruisco il seguente filtro:
acc = acc + in - out;
out = acc / K;
K è determinata dal prodotto tra il sample rate e la costante di tempo 
RC del filtro.
Nel tuo caso basterebbe: out = acc >> 1;
Spero ti sia di aiuto :)
--
seb

 Nel tuo caso basterebbe: out = acc >> 1;
Interessante!
Su questo pc non scilab installato ma ho voluto verificare al volo, 
perdonate il metodo grezzo:
http://tinypic.com/view.php?pic=7xv7a4j&s=1
In verde il gradino di ingresso, in rosso il mio filtro, in blu il tuo.
In entrambi i casi lo shift è stato di 2.
Direi che la tua soluzione risolve egregiamente il problema della non 
linearità con il ragionevolissimo piccolo compromesso di avere un 
accumulatore capace di accettare valori K volte maggiori del massimo 
segnale di ingresso.
Grazie!
Marco / iw2nzm
ps. Io di solito per simulare questi filtri semplici lo faccio a manina 
in scilab (per chi non lo conoscesse è un analogo free di matlab). Che 
voi sappiate esistono programmini dedicati alla simulazione di filtri 
SEMPLICI per analizzare al volo anche frequenza di taglio, pendenza ecc?
Ho trovato solo cose esagerate e comunque per 'progettare' un filtro, 
non per analizzarlo partendo dall'equazione alle differenze.

 per sistemare le cose.
No, non intendevo questo: per fare quello che dicevo bastano
somme e shift.
In pratica quando fai lo shift nel filtro perdi dei bit. Invece di
eliminarli del tutto, prima di shiftare li salvi, accumulandoli in
un'altra variabile. Ad esempio, prima di calcolare:
y=...w>>4...
calcoli
acc=acc+w&0x0F;
e all'espressione originale aggiungi una parte di acc, tipo:
y=...w>>4... + acc>>4;
in questo modo in pratica tieni conto degli errori che vai
facendo nei vari troncamenti, e quando questi raggiungono
un certo livello (16 in questo caso) ottieni una correzione
del valore d'uscita. Questo risolve proprio la non linearità
di cui parlavi.
Ovviamente l'algoritmo va implementato con un pò di più
cura e di precisione rispetto a come l'ho presentato io... :-)
A.D.

 cura e di precisione rispetto a come l'ho presentato io... :-)
mmm (interiezione, non il nostro amico :) ) ora è più chiaro. Farò 
qualche simulazione per capirlo meglio!
Grazie,
Marco / iw2nzm

 mmm (interiezione, non il nostro amico :) ) ora č piů chiaro.
Lo scrivo meglio usando un'espressione simile alla tua:
acc=acc+(y-x)&0x0F;
y=y-((y-x+acc)>>4);
Si possono comunque pensare forme piů raffinate.
A.D.