Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Filtro passa basso su segnale campionato

teoria dei segnali, elaborazione, trasformate Z, Fourier, segnali caratterizzati da processi e variabli aleatorie, stimatori, DSP

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

0
voti

[21] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteSandroCalligaro » 14 gen 2018, 1:10

Foto UtenteEcoTan, per fare un filtro "taglia-basso", che alcuni in giro per il mondo chiamano passa-alto ;-) , potrebbero bastarti due righe di codice.

La gestione intelligente (o comoda) dei numeri a virgola fissa è una questione annosa, che sembra banale, ma non lo è.
Se vuoi farti un'idea, potresti provare a leggerti la documentazione di Texas Instruments sul formato IQ o sulla IQmath.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

0
voti

[22] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteEcoTan » 14 gen 2018, 9:39

SandroCalligaro ha scritto:potrebbero bastarti due righe di codice

No. In presenza di un ingresso costante mi occorre che l'uscita sia capace di arrivare, in un tempo finito, a zero esatto. (Ovviamente ciò si potrebbe anche forzare con vari trucchi.)

P.S. Può anche darsi che io mi sia fissato inutilmente con questa storia dello zero esatto, e che uno o due digit residui non farebbero praticamente nessun danno. Comunque possiamo considerarlo come un esercizio teorico: trovare un algoritmo per un filtro taglia-basso che, se l'ingresso rimane costante, dia una uscita che venga attratta verso lo zero anzichè verso altri valori spuri.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5426
Iscritto il: 29 gen 2014, 8:54

0
voti

[23] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteEcoTan » 14 gen 2018, 9:48

SandroCalligaro ha scritto: la documentazione di Texas Instruments sul formato IQ o sulla IQmath.

E' quello che Microchip chiama fractional? In effetti non ci ho mai capito molto.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5426
Iscritto il: 29 gen 2014, 8:54

0
voti

[24] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteSandroCalligaro » 14 gen 2018, 18:21

Credo di sì.

Si tratta di fissare una convenzione la virgola è fissata ad un certo punto del numero binario, ad esempio su un integer a 32 bit, Q24 corrisponde ad avere i 24 bit meno significativi che rappresentano frazioni di 1, da 2^{-1} a 2^{-24}.
La risoluzione sarà quindi 2^{-24}, e si potranno rappresentare numeri da quasi -129 fino a quasi 128
(= 127 + 2^{-1} + 2^{-2} +...).

Si definiscono poi in modo opportuno degli operatori (ad esempio tramite macro) per le operazioni e funzioni matematiche più comuni (conversione da e verso float, somma, sottrazione, moltiplicazione, divisione, seno, coseno, ecc), che tengono conto degli shift da applicare prima e dopo l'operazione su interi.
In questo modo, lavorare con interi a virgola fissa diventa quasi come lavorare con float, a patto di avere coscienza di ciò che si sta facendo, in particolare a patto di aver definito bene la scala su cui lavorare.

Nei sistemi che hanno a che fare con grandezze reali (cioè misure o comandi di attuazione), come quelli di controllo, conviene definire dei valori base, che corrispondono ad un valore 1 nella rappresentazione interna all'algoritmo, scegliendoli normalmente pari ai valori nominali (o di fondo scala) delle varie grandezze.
In questo modo si possono evitare alcune scalature (se ad esempio 1 corrisponde al max valore convertito dall'ADC), oppure ci si assicura che nessun valore realistico (anche se magari superiore al nominale) causi overflow.

Non è niente di trascendentale, ma per contro una soluzione di calcolo fai-da-te (del tipo questo dividendo lo shifto di 4, poi so che sarà 16 volte il valore vero, ecc) può portare facilmente ad errori grossolani.
Occorrerebbe l'esempio giusto, per spiegarsi meglio.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

1
voti

[25] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteIsidoroKZ » 14 gen 2018, 20:06

EcoTan ha scritto:No. In presenza di un ingresso costante mi occorre che l'uscita sia capace di arrivare, in un tempo finito, a zero esatto.


Filtro FIR in cui la somma dei coefficienti e` zero.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[26] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteEcoTan » 14 gen 2018, 20:15

Mi basta un filtro del primo ordine, perché lo scopo è soltanto quello di tagliare la componente continua (senza lasciarne alcun residuo).
Con l'occasione ho fatto una scoperta: shiftare >>9 e dividere per 512 in linguaggio C non è esattamente la stessa cosa, se il dividendo è compreso fra -1 e -511 la divisione fornisce zero mentre lo shift fornisce -1 (sbaglio?).
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5426
Iscritto il: 29 gen 2014, 8:54

0
voti

[27] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteIsidoroKZ » 14 gen 2018, 20:18

I FIR non hanno ordine, inteso come numero equivalente di poli, hanno "tappi" (taps). Puoi avere una risposta passa alto del primo ordine e zero in uscita con ingresso costante.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[28] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteSandroCalligaro » 14 gen 2018, 21:05

IsidoroKZ ha scritto:I FIR non hanno ordine
Non chiameresti "ordine" anche il grado del polinomio in z?
Certamente questo non corrisponde direttamente al numero di poli nella risponsta in frequenza.

EcoTan ha scritto:Con l'occasione ho fatto una scoperta: shiftare >>9 e dividere per 512 in linguaggio C non è esattamente la stessa cosa, se il dividendo è compreso fra -1 e -511 la divisione fornisce zero mentre lo shift fornisce -1 (sbaglio?).
Dipende da come vengono riempiti i bit più a sx, cioè se con zeri o con copie del primo bit originario.
Qui dicono che è un comportamento "implementation-defined" (pag. 99 del PDF).
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

0
voti

[29] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteEcoTan » 14 gen 2018, 21:30

Col compilatore XC16 lite free di Microchip, su variabili int o long int mi pare che i risultati siano quelli che ho indicato. Che io sappia, il linguaggio non dà modo di specificare se lo shift si intende signed o unsigned, almeno io non ho specificato nulla. Poi la differenza fra / e \ ..
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5426
Iscritto il: 29 gen 2014, 8:54

0
voti

[30] Re: Filtro passa basso su segnale campionato

Messaggioda Foto UtenteSandroCalligaro » 14 gen 2018, 21:43

Ho simulato un esempio di filtro IIR che approssima un passa-alto del primo ordine.
A me pare che si riesca ad ottenere quello che chiedi, con due righe di codice, ma non avendolo scritto in C (l'ho simulato in Simulink con numeri a 16 bit, perché mi andava più comodo) non posso dire di averlo provato realmente.

Faccio un esempio per dati in ingresso ed uscita in formato 16-bit.
Pare che l'XC16 abbia la possibilità di specificare una moltiplicazione 16x16 bit -> 32 bit con __builtin_mulss (non si aggiunge nessun calcolo in più rispetto a 16x16 -> 16 bit).

Codice: Seleziona tutto
x_LPF += (int16) __builtin_mulss((x-x_LPF),c);
x_HPF = 1 - x_LPF;

c, x e le sue versioni filtrate sono interi a 16 bit, che rappresentano numeri frazionari con 14 bit dopo la virgola, cioè ad esempio il vero valore x_float diventa round(x_float * 2^14).

Il coefficiente c_float non deve essere troppo piccolo, cioè il polo del filtro non può essere troppo in basso rispetto alla frequenza di campionamento.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

PrecedenteProssimo

Torna a Elaborazione numerica ed analogica dei segnali

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti