Pagina 1 di 1

Matlab caratteristiche di fase e ampiezza filtri

Inviato: 7 apr 2015, 14:52
da frankj
Salve,
vorrei riprodurre alcuni risultati trovati su di un articolo ( non so se posso postarlo, comunque nel caso lo mando in PM) per poterli poi confrontare con una seria di altre strutture sempre dello stesso tipo ma che usano metodi di interpolazione differenti. In pratica si tratta di un filtro di Farrow ( filtro utile ad implementare ritardi frazionale grazie alla sue caratteristiche di “tunability”) con interpolazione Hermitiana. Supponendo che la sua funzione di trasferimento del filtro sia:
Immagine
ho che la struttura (filtro di farrow con interpolazione Hermitiana) è la seguente (dove D è il ritardo frazionale):
Immagine
in matlab l’ho implementato così (forse c’è un errore sul denominatore della funz di trasf…ma poco male tanto è solo per far capire il concetto):

Codice: Seleziona tutto

function y= hermite(x, epsilon)
% Farrow filter, coefficients:
f0 = [-1/2,3/2,-3/2,1/2]; % Vector of Hermite coefficients          [m=3]
f1 = [1,-5/2,2,-1/2]; % Vector of Hermite coefficients               [m=2]
f2 = ([-1/2,0,1/2]);  % Vector of Hermite coefficients         [m=1]
f3 = [0,1]; % Vector of Hermite coefficients                    [m=0]
 
c_3 = filter(f3,1,x)*epsilon;
c_2 = (filter(f2,1,x)+c_3)*epsilon;
c_1 = (filter(f1,1,x)+c_2)*epsilon;
y = (filter(f0,1,x)+c_1);
end

a questo punto vorrei fare una analisi della struttura come nel seguente script:

Codice: Seleziona tutto

% Lagrange fractional-delay filters per  N=1, N=3, N=5, N=7.
clear all, close all
Rf = 0.4; % Fractional delay
 
h1 = dfilt.farrowlinearfd(Rf);
 
fd = fdesign.fracdelay(Rf,'N',3);
h3 = design(fd,'lagrange','FilterStructure','farrowfd');
 
fd = fdesign.fracdelay(Rf,'N',5);
h5 = design(fd,'lagrange','FilterStructure','farrowfd');
 
fd = fdesign.fracdelay(Rf,'N',7);
h7 = design(fd,'lagrange','FilterStructure','farrowfd');
 
% [phi1,f] = phasedelay(h1,512,2);
% [phi3,f] = phasedelay(h3,512,2);
% [phi5,f] = phasedelay(h5,512,2);
% [phi7,f] = phasedelay(h7,512,2);

% [H1,f] = freqz(h1,512,2);
% [H3,f] = freqz(h3,512,2);
% [H5,f] = freqz(h5,512,2);
% [H7,f] = freqz(h7,512,2);
 
% figure (1)
% plot(f,phi1,'k',f,phi3,'k',f,phi5,'k',f,phi7,'k','LineWidth',1)
% xlabel('\omega/\pi'), ylabel('Phase delay (samples)'), grid
 
% nel caso in cui si vogliano vedere i coefficienti del filtro:
% fvtool(h1,h3,h5,h7,'Analysis','coefficients');
 
hfvt=fvtool(h1,h3,h5,h7,'Analysis','PhaseDelay','Color','white');
legend(hfvt, 'N=1', 'N=3','N=5','N=7')
 
% figure (2)
% plot(f,abs(H1),'k',f,abs(H3),'k',f,abs(H5),'k',f,abs(H7),'k','LineWidth',1)
% xlabel('\omega/\pi'), ylabel('Magnitude'), grid
% axis([0,1,0,1.1])
 
hfvt2=fvtool(h1,h3,h5,h7,'Color','white');
legend(hfvt2, 'N=1', 'N=3','N=5','N=7')

cioè utilizzando fvtool() o comunque phasedaley() + frequez(). Il problema è che mentre il secondo script genera i filtri come “oggetti” ( l’interpolazione di lagrange è supportata da matlab ma non quella hermitiana…almeno in base alle mie conoscenze..poi se esiste… io non so come usarla) la prima funzione è una struttura fatta da me e quindi non posso usare ( o almeno non so come fare) le funzione di analisi ( di fase e ampiezza dei filtri) utilizzate nel secondo script. Questa necessità è data dal fatto che vorrei confrontare l’interpolazione di Lagrange , B-spline e Hermitiana.
Se qualcuno può darmi una dritta mi farebbe un graaaaande piacere