Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Filtro digitale prima prova

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 digitale prima prova

Messaggioda Foto Utentesimo85 » 18 mar 2013, 10:31

dimaios ha scritto:la lunghezza della sequenza non dipende dal numero di campioni in ingresso.


Eh, tu pensa che lo stavo per scrivere, dato che in metropolitana questa mattina leggevo questa sezione da cui:

"The number of samples used to represent the impulse response can be arbitrarily large".

Ora ne sono convinto 2 volte. Thanks. :-)

dimaios ha scritto:Prima di lanciare la simulazione in C ti conviene vedere lo spettro del filtro per avere un'idea dell'attenuazione e fare una previsione su cosa aspettarti in uscita ( magari utilizza octave ).


OK, oggi pomeriggio ci metto mano. Se non mi sarà chiaro qualcosa chiedo.

:-)

Buon proseguimento di giornata!
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

5
voti

[22] Re: Filtro digitale prima prova

Messaggioda Foto UtenteDirtyDeeds » 18 mar 2013, 12:00

simo85 ha scritto:"The number of samples used to represent the impulse response can be arbitrarily large".

Ora ne sono convinto 2 volte.


Cerca di avere sempre presente l'idea che sta dietro a questo tipo di progetto di un filtro FIR: un filtro passa basso ideale con frequenza di taglio W = f_c/f_s < 1/2 ha risposta in frequenza

H(f) = \begin{cases}
1 & |f| \le W \\
0  & W < |f| \le 1/2
\end{cases}

Poiché questa risposta in frequenza non è realizzabile, bisogna approssimarla. Un metodo di approssimazione, ma non l'unico, è quello che dà origine a un filtro FIR con coefficienti

h[n] = \begin{cases} 2W &n=0 \\
\dfrac{\sin(2\pi Wn)}{\pi n}  &|n|\le N \\
0 &n > N
\end{cases}

Questo metodo di approssimazione è basato sul fatto che con i coefficienti dati sopra si ottiene un filtro che, tra tutti i possibili filtri FIR con lunghezza della risposta all'impulso pari a N, dà la migliore approssimazione della risposta ideale nel senso dei minimi quadrati. Questo fatto deriva da una proprietà delle serie di Fourier e i coefficienti del filtro sono proprio i coefficienti dello sviluppo in serie di Fourier della risposta del filtro per -1/2\le f\le 1/2.

Questo non significa, però, che quel tipo di approssimazione sia la migliore possibile dal punto di vista pratico: per esempio, un grosso difetto di questa approssimazione è che, a causa del fenomeno di Gibbs, l'ondulazione fuori banda della risposta è piuttosto elevata. Per esempio, per ridurre l'ondulazione, si può aumentare la banda di transizione per mezzo di una finestratura della risposta ideale (v. qui per un elenco di finestre).
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[23] Re: Filtro digitale prima prova

Messaggioda Foto Utentesimo85 » 18 mar 2013, 18:13

Ciao, buon pomeriggio.

Ringrazio ancora per i precedenti messaggi.

Tornato a casa da stamatttina, come prima cosa ho provveduto a correggere il codice e relativo output del messaggio [19], il valore di f_c non era quello detto e avevo fatto alcuni errori.

Dunque, è la primissima volta che uso Octave a dire il vero, e per il momento ho provato a verificare i coefficienti della risposta d'impulso, per i seguenti dati:

f_c = 1\,\text{kHz} e f_s = 10\,\text{kHz}

\omega_c = 2\pi \frac{fc}{fs}

\begin{displaymath} h[n] = \begin{cases} \frac{\omega_c}{\pi}&x=0 \\ \frac{\sin(\omega_c\pi x)}{x\pi}&x \neq 0 \end{cases} \end{displaymath}

Codice: Seleziona tutto
octave:2> w = (2*pi*1e3)/10e3
w =  0.62832
octave:3> x=linspace(-16, 16);
octave:4> plot (x, sin(w*pi*x)./(x*pi))
octave:5>


ecco il grafico.

sinc.png
sinc.png (7.16 KiB) Osservato 2186 volte


Forse questo:
dimaios ha scritto:y(n) = \frac{x(n) + x(n-1)}{2} = 0.5 \cdot x(n) + 0.5 \cdot x(n-1)

Questo e' un filtro FIR ( infatti la risposta all'impulso e' finita ).


Mi ha confuso leggermente le idee, perché non usa i coefficienti o sbaglio?
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

7
voti

[24] Re: Filtro digitale prima prova

Messaggioda Foto Utentedimaios » 18 mar 2013, 18:56

Foto Utentesimo85, provo a specificarlo meglio con il passaggio alla z-Trasformata.

y(n) = \frac{x(n) + x(n-1)}{2} = 0.5 \cdot x(n) + 0.5 \cdot x(n-1)

Utilizzando la z-Trasformata diventa
Y(z) =  0.5 \cdot X(z) + 0.5 \cdot z^{-1} \cdot X(z) =\left ( 0.5 + 0.5 z^{-1} \right ) X(z)

Da cui :
G(z) = \frac{Y(z)}{X(z)} = 0.5 + 0.5 z^{-1} = b_{0} + b_{1}  z^{-1}


Siccome parliamo di un filtro FIR ti ricordo che per definizione di risposta impulsiva, utilizzando la convoluzione si ottiene h(n):

h(n) = \sum_{i=0}^{N} b_i \delta(n-i) = b_{n}

Che utilizzando la z-Trasformata restituisce :

G(z) = Z\{h(n)\} = \sum_{n=-\infty}^{\infty} h(n) \cdot z^{-n}  = \sum_{n=0}^{N}b_n \cdot z^{-n}

Da cui vedi la relazione 1:1 tra i coefficienti della risposta impulsiva e quello della relativa trasformata Z.
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

0
voti

[25] Re: Filtro digitale prima prova

Messaggioda Foto Utentesimo85 » 18 mar 2013, 19:12

OK adesso è un po' più chiaro! :)

Ora proverò a scrivere l'algoritmo, facendo riferimento a T-Filter, ed anche al libro.

Come mi hai suggerito cercherò anche di ampliare la lunghezza di h, sperando di graficare tutto con Gnu Octave e Plot, ed appena posso, per completezza, posto i risultati.

Succcessivamente mi dedicherò al libro che mi avevi suggerito tempo fa!

Grazie!
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

5
voti

[26] Re: Filtro digitale prima prova

Messaggioda Foto Utentedimaios » 18 mar 2013, 19:15

Di nulla figurati. Se hai bisogno siamo qui ...... virtualmente! ;-)
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

3
voti

[27] Re: Filtro digitale prima prova

Messaggioda Foto UtenteDirtyDeeds » 18 mar 2013, 19:16

simo85 ha scritto:h[n] = \begin{cases} \frac{\omega_c}{\pi}&x=0 \\ \frac{\sin(\omega_c\pi x)}{x\pi}&x \neq 0 \end{cases}


Qui sopra c'è un errore (anzi due): se definisci

\omega_c = 2\pi \frac{fc}{fs}

nell'argomento del seno c'è un \pi di troppo. Poi, se la successione si chiama h[n], non usare x come indice ;-) Ti consiglio di usare l'espressione che ho scritto in [22].

simo85 ha scritto:Mi ha confuso leggermente le idee, perché non usa i coefficienti o sbaglio?


Oltre a quanto già scritto da Foto Utentedimaios, puoi vederlo così: l'uscita di un filtro può essere scritta come convoluzione:

y[n] = \sum_{k = -\infty}^\infty h[k]x[n-k]

Ora confronta questa espressione generale con

y[n] = \frac{x[n] + x[n-1]}{2} = 0.5 x[n] + 0.5 x[n-1]

le due coincidono se gli unici termini non nulli nella sommatoria sono quelli per k=0 e k=1, il cui coefficiente è 0.5. Quindi quel filtro ha risposta all'impulso

h[n] = \begin{cases}
0.5 &n=0, 1 \\
0 & \text{altrimenti}
\end{cases}
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[28] Re: Filtro digitale prima prova

Messaggioda Foto Utentesimo85 » 18 mar 2013, 19:34

DirtyDeeds ha scritto:Qui sopra c'è un errore (anzi due): se definisci
[...]
Ti consiglio di usare l'espressione che ho scritto in [22].


OK :oops:

Mi metto al lavoro con Octave prima della realizzazione in C. :ok:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[29] Re: Filtro digitale prima prova

Messaggioda Foto Utentesimo85 » 18 mar 2013, 19:49

Ecco, avevo fatto anche un po' di pasticci.. :roll:

Per completezza allego la curva secondo la formula di Foto UtenteDirtyDeeds.

Codice: Seleziona tutto
octave:1> x = linspace(-16, 16);
octave:2> w = 2*pi*1e3/10e3
w =  0.62832
octave:3> plot (x, sin(w*2*pi*x)./(x*pi))


sinc2.png
sinc2.png (10.31 KiB) Osservato 2155 volte


Ed i coefficienti con il programma C di 19 che ora correggo nuovamente.

Codice: Seleziona tutto
h[00]   0.0066063251
h[01]   0.0271358007
h[02]   -0.0526370219
h[03]   0.0494560120
h[04]   -0.0066293693
h[05]   -0.0701895727
h[06]   0.1590165742
h[07]   -0.2297229240
h[08]   1.2566370614
h[09]   -0.2297229240
h[10]   0.1590165742
h[11]   -0.0701895727
h[12]   -0.0066293693
h[13]   0.0494560120
h[14]   -0.0526370219
h[15]   0.0271358007


A presto!
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[30] Re: Filtro digitale prima prova

Messaggioda Foto Utentesimo85 » 20 mar 2013, 19:04

Buon pomeriggio, rieccomi.

Sono arrivato al capitolo 16 che alla sezione 2 riporta:

M = \frac{4}{BW}

Restando con le nomenclature anteriori, BW = W

W = \frac{f_c}{f_s}

mentre f_c deve essere compresa tra

0 < f_c \leq (0.5 \times f_s)

e fin qui tutto OK.

Tornando indietro alla sezione 1, riporta il calcolo della risposta di impulso (sostituisco i con n anche perché sennò si presentano problemi di formattazione con LaTex):

h[n] = \left (\frac{\sin(2 \pi f_c n)}{n \pi} \right )

(dove f_c \leq 0.5)che nel programma diventerà

h[n] = \left (\frac{\sin(2 \pi W (n - M / 2))}{(n - M / 2)} \right )

Successivamente riporta le equazioni 16 - 1 e 16 - 2 della finestra window.

(Eq 16 - 1) Hamming window.

w[n] = 0.54 - 0.46 \cos\left ( \frac{2\pi n}{M} \right )

(Eq 16 - 2) Blackman Window.

w[n] = 0.42 - 0.5 \cos \left (\frac {2\pi n}{M} \right ) + 0.08 \cos\left (\frac{4\pi n}{M} \right )

Nel programma per il passa basso, scritto in Basic alla sezione 4 Table 16 - 1, ad ogni iterazione del primo ciclo la risposta all'impulso viene moltiplicata per la finestra (in questo caso la Hamming Window) quando n \neq 0

h[n] = \left (\frac{\sin(2 \pi f_c (n - M / 2))}{(n - M / 2)} \right ) \cdot \left [0.54 - 0.46 \cos\left ( \frac{2\pi i}{M} \right ) \right ]

Ho stampato quindi i coefficienti con la finestra di Hamming (come esempio), con f_s = 10\,\text{kHz} ed f_c = 1\,\text{kHz}.

Codice: Seleziona tutto
W = 0.1000   M = 40

h[00]   -0.000000
h[01]   -0.000069
h[02]   -0.000486
h[03]   -0.001204
h[04]   -0.001477
h[05]   -0.000000
h[06]   0.004257
h[07]   0.010680
h[08]   0.015912
h[09]   0.014198
h[10]   0.000000
h[11]   -0.027569
h[12]   -0.060605
h[13]   -0.081515
h[14]   -0.067514
h[15]   -0.000000
h[16]   0.124791
h[17]   0.289288
h[18]   0.456626
h[19]   0.581865
h[20]   0.200000
h[21]   0.581865
h[22]   0.456626
h[23]   0.289288
h[24]   0.124791
h[25]   -0.000000
h[26]   -0.067514
h[27]   -0.081515
h[28]   -0.060605
h[29]   -0.027569
h[30]   0.000000
h[31]   0.014198
h[32]   0.015912
h[33]   0.010680
h[34]   0.004257
h[35]   -0.000000
h[36]   -0.001477
h[37]   -0.001204
h[38]   -0.000486
h[39]   -0.000069



[EDIT]
Ho seguito le indicazioni del messaggio 22, h[n] = 2W quando n = 0.
[/EDIT]

A seguire i grafici con Octave
Codice: Seleziona tutto
octave:1> fc = 1e3
fc =  1000
octave:2> fs = 10e3
fs =  10000
octave:3> W = fc/fs
W =  0.10000
octave:4> M = 4/W
M =  40
octave:5> n = linspace(-M/2, M/2);
octave:6> plot (n, sin(2*pi*W*n)./(n))


1.jpg
1.jpg (24.63 KiB) Osservato 2129 volte


Codice: Seleziona tutto
plot (n, sin(2*pi*W*n)./(n) * 0.54 - 0.46 * cos(2*pi*n)./M)

2.jpg
2.jpg (17.81 KiB) Osservato 2129 volte


Se è tutto OK sotto la vostra supervisione, vado avanti e cerceró di completare l'implementazione del filtro con Octave e con il codice C.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

PrecedenteProssimo

Torna a Elaborazione numerica ed analogica dei segnali

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti