Matlab caratteristiche di fase e ampiezza filtri
Inviato: 7 apr 2015, 14:52
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:

ho che la struttura (filtro di farrow con interpolazione Hermitiana) è la seguente (dove D è il ritardo frazionale):

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):
a questo punto vorrei fare una analisi della struttura come nel seguente script:
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
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:

ho che la struttura (filtro di farrow con interpolazione Hermitiana) è la seguente (dove D è il ritardo frazionale):

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