Domanda per chi usa o ha usato le librerie DSP per i micro.
Suppongo che per i flitri IIR e IFR i fattori vengano passati alle funzioni mediante codifica Q1.15 (così mi è sembrato di capire leggendo la scarsa documentazione della ST) anche perché mi pare sia più o meno uno standard per i DSP.
La domanda è: anche nel caso dei campioni si usa (di solito) questa codifica normalizzando i segnali da -1 a +1 ?
Domanda da praticone su filtri passa basso FIR a MM.
Moderatori:
carloc,
g.schgor,
BrunoValente,
IsidoroKZ
0
voti
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
2
voti
Lo scalamento è preferibile anche se non obbligatorio in tutti i contesti.
In passato invece quando si lavorava in virgola fissa era assolutamente un must.
In passato invece quando si lavorava in virgola fissa era assolutamente un must.
Ingegneria : alternativa intelligente alla droga.
-

dimaios
30,2k 7 10 12 - G.Master EY

- Messaggi: 3381
- Iscritto il: 24 ago 2010, 14:12
- Località: Behind the scenes
0
voti
Le librerie DSP per l' STM32 accettano come parametri degli short integer e quindi è praticamente scontato che siano codificati Q1.15 anche perché l' esecuzione dura troppo poco.
A rigor di logica anche i campioni dovrebbero esserlo perché vengono moltiplicati per i fattori e quindi, per non mischiare carciofini sott' olio con marmitte catalitiche anche loro devono avere la stessa codifica.
Almeno penso, visto che più o meno tutto il mondo dei micro usa matematica a virgola fissa.
A rigor di logica anche i campioni dovrebbero esserlo perché vengono moltiplicati per i fattori e quindi, per non mischiare carciofini sott' olio con marmitte catalitiche anche loro devono avere la stessa codifica.
Almeno penso, visto che più o meno tutto il mondo dei micro usa matematica a virgola fissa.

"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
2
voti
Attenzione! L' STM34F4 è un floating point ovvero un Cortex M4 che prevede una Single precision floating point unit IEEE 754 compliant.
La libreria gestisce il calcolo in emulazione intera se non trova l'FPU sul micro altrimenti lo sfrutta aumentando notevolmente le performance.
Guarda questo per un confronto. Nel medesimo sito trovi molti spunti interessanti ed informazioni utili.
Posseggo una STM32F4-DISCOVERY sulla quale sto tentando di installare FreeRTOS e devo dire che come velocità di elaborazione è decisamente sorprendente.
La libreria gestisce il calcolo in emulazione intera se non trova l'FPU sul micro altrimenti lo sfrutta aumentando notevolmente le performance.
Guarda questo per un confronto. Nel medesimo sito trovi molti spunti interessanti ed informazioni utili.
Posseggo una STM32F4-DISCOVERY sulla quale sto tentando di installare FreeRTOS e devo dire che come velocità di elaborazione è decisamente sorprendente.
Ingegneria : alternativa intelligente alla droga.
-

dimaios
30,2k 7 10 12 - G.Master EY

- Messaggi: 3381
- Iscritto il: 24 ago 2010, 14:12
- Località: Behind the scenes
0
voti
Hotrovato i sorgenti della libreria del STM32F1xx che riporto qui.
Ehm ... mi sembra fin troppo facile come funzione, mi sarei aspettato qualcosa di più ...tosto.
Quello che non riesco a capire è la codifica dei coefficienti. Così, a naso, mi sembra una Q15 o qualcosa del genere anche perché coefficienti interi con short int non ce li vedo in un filtro IIR. Non penso che uno dei coefficienti possa valere, chessò, 5798 per esempio.
Qualcuno saprebbe spiegarmi, se ha tempo e voglia, come interpretare e capire come sono codificati e come vengono trattati i coefficienti?
- Codice: Seleziona tutto
/* for block FIR module */
typedef struct {
uint16_t *h;
uint32_t nh;
} COEFS;
/* IIR filter in C */
void iir_biquad_stm32(uint16_t *y, uint16_t *x, int16_t *IIRCoeff, uint16_t ny);
/**
* @brief Canonique Form of 8th order IIR filter, factorized in
* 4 biquads sections in series.
* @param y: Output array .
* @param x: Input array
* @param IIRCoeff: IIR Filter Coefficients, an array of 20 shorts
* @param ny: the number of output samples
* @retval : None
*/
void iir_biquad_stm32(uint16_t *y, uint16_t *x, int16_t *IIRCoeff, uint16_t ny)
{
uint32_t i;
uint32_t w1_2 = 0, w1_1 = 0, w1;
uint32_t w2_2 = 0, w2_1 = 0, w2;
uint32_t w3_2 = 0, w3_1 = 0, w3;
uint32_t w4_2 = 0, w4_1 = 0, w4;
/** Canonic form **/
/* 1st section */
for (i=0; i<ny-2; i++)
{
w1 = x[2+i] - IIRCoeff[0]*w1_1 - IIRCoeff[1]*w1_2;
y[2+i] = (IIRCoeff[2]*w1 + IIRCoeff[3]*w1_1 + IIRCoeff[4]*w1_2);
w1_2 = w1_1;
w1_1 = w1;
}
/* 2nd section */
for (i=0; i<ny-2; i++)
{
w2 = y[2+i] - IIRCoeff[5]*w2_1 - IIRCoeff[6]*w2_2;
y[2+i] = (IIRCoeff[7]*w2 + IIRCoeff[8]*w2_1 + IIRCoeff[9]*w2_2);
w2_2 = w2_1;
w2_1 = w2;
}
/* 3rd section */
for (i=0; i<ny-2; i++)
{
w3 = y[2+i] - IIRCoeff[10]*w3_1 - IIRCoeff[11]*w3_2;
y[2+i] = (IIRCoeff[12]*w3 + IIRCoeff[13]*w3_1 + IIRCoeff[14]*w3_2);
w3_2 = w3_1;
w3_1 = w3;
}
/* 4th section */
for (i=0; i<ny-2; i++)
{
w4 = y[2+i] - IIRCoeff[15]*w4_1 - IIRCoeff[16]*w4_2;
y[2+i] = (IIRCoeff[17]*w4 + IIRCoeff[18]*w4_1 + IIRCoeff[19]*w4_2);
w4_2 = w4_1;
w4_1 = w4;
}
}
Ehm ... mi sembra fin troppo facile come funzione, mi sarei aspettato qualcosa di più ...tosto.
Quello che non riesco a capire è la codifica dei coefficienti. Così, a naso, mi sembra una Q15 o qualcosa del genere anche perché coefficienti interi con short int non ce li vedo in un filtro IIR. Non penso che uno dei coefficienti possa valere, chessò, 5798 per esempio.
Qualcuno saprebbe spiegarmi, se ha tempo e voglia, come interpretare e capire come sono codificati e come vengono trattati i coefficienti?

"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
2
voti
TardoFreak ha scritto:Non penso che uno dei coefficienti possa valere, chessò, 5798 per esempio.
Why not?
Quel filtro fa delle operazioni su interi, la scalatura è "a carico tuo".
It's a sin to write
instead of
(Anonimo).
...'cos you know that
ain't
, right?
You won't get a sexy tan if you write
in lieu of
.
Take a log for a fireplace, but don't take
for
arithm.
instead of
(Anonimo)....'cos you know that
ain't
, right?You won't get a sexy tan if you write
in lieu of
.Take a log for a fireplace, but don't take
for
arithm.-

DirtyDeeds
55,9k 7 11 13 - G.Master EY

- Messaggi: 7012
- Iscritto il: 13 apr 2010, 16:13
- Località: Somewhere in nowhere
0
voti
Capito.
- Trasformo il coefficiente in formato Q15 moltiplicandolo per 2^15. Questo in fase di setup del filtro, non durante l' esecuzione).
- Dentro il filtro moltiplico il fattore (16 bit) per il campione (16 bit) ottenendo un risultato a 32 bit
- Divido il risultato per 2^15 (shift a destra di 15 posizioni)
- Aggiorno
- Vivo felice.
- Trasformo il coefficiente in formato Q15 moltiplicandolo per 2^15. Questo in fase di setup del filtro, non durante l' esecuzione).
- Dentro il filtro moltiplico il fattore (16 bit) per il campione (16 bit) ottenendo un risultato a 32 bit
- Divido il risultato per 2^15 (shift a destra di 15 posizioni)
- Aggiorno
- Vivo felice.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
Chi c’è in linea
Visitano il forum: Nessuno e 167 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)