Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Diseño de filtro de modelado de pulsos FIR gaussiano

Este ejemplo muestra cómo diseñar un filtro FIR de forma de pulso gaussiano y los parámetros que influyen en este diseño. El diseño del filtro de forma de pulso gaussiano FIR se realiza truncando una versión muestreada de la respuesta de impulso de tiempo continuo del filtro gaussiano que es dada por:

<math display="block">
<mrow>
<mi>h</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mfrac>
<mrow>
<msqrt>
<mrow>
<mi>π</mi>
</mrow>
</msqrt>
</mrow>
<mrow>
<mi>a</mi>
</mrow>
</mfrac>
<msup>
<mrow>
<mi>e</mi>
</mrow>
<mrow>
<mo>-</mo>
<mfrac>
<mrow>
<msup>
<mrow>
<mi>π</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<msup>
<mrow>
<mi>t</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
</mrow>
<mrow>
<msup>
<mrow>
<mi>a</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
</msup>
</mrow>
</math>

El parámetro 'a' está relacionado con el producto de tiempo de símbolo de ancho de banda de 3 dB (B*Ts) del filtro gaussiano según lo indicado por:

<math display="block">
<mrow>
<mi>a</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mi>B</mi>
<msub>
<mrow>
<mi>T</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
</mrow>
</mfrac>
<msqrt>
<mrow>
<mfrac>
<mrow>
<mi mathvariant="normal">log</mi>
<mn>2</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
</mrow>
</msqrt>
</mrow>
</math>

Hay dos errores de aproximación en este diseño: un error de truncamiento y un error de muestreo. El error de truncamiento se debe a una aproximación de tiempo finito (FIR) de la respuesta de impulso teóricamente infinita del filtro gaussiano ideal. El error de muestreo (aliasing) se debe al hecho de que una respuesta de frecuencia gaussiana no está realmente limitada por banda en un sentido estricto (es decir, la energía de la señal gaussiana más allá de una determinada frecuencia no es exactamente cero). Esto se puede observar desde la función de transferencia del filtro gaussiano de tiempo continuo, que se indica a continuación:

<math display="block">
<mrow>
<mi>H</mi>
<mo stretchy="false">(</mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msup>
<mrow>
<mi>e</mi>
</mrow>
<mrow>
<mo>-</mo>
<msup>
<mrow>
<mi>a</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<msup>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
</mrow>
</msup>
</mrow>
</math>

A medida que f aumenta, la respuesta de frecuencia tiende a cero, pero nunca es exactamente cero, lo que significa que no se puede muestrear sin que se produzca algún alias.

Filtro gaussiano de tiempo continuo

Para diseñar un filtro gaussiano de tiempo continuo, definamos el tiempo del símbolo (Ts) para que sea 1 microsegundo y el número de símbolos entre el inicio de la respuesta de impulso y su final (intervalo de filtro) para que sea 6. A partir de las ecuaciones anteriores, podemos ver que la respuesta de impulso y la respuesta de frecuencia del filtro gaussiano dependen del parámetro 'a' que está relacionado con el producto de tiempo de símbolo de ancho de banda de 3 dB. Para estudiar el efecto de este parámetro en el diseño del filtro FIR gaussiano, definiremos varios valores de 'a' en términos de Ts y calcularemos los anchos de banda correspondientes. A continuación, trazaremos la respuesta de impulso para cada 'a' y la respuesta de magnitud para cada ancho de banda.

Ts   = 1e-6; % Symbol time (sec) span = 6;    % Filter span in symbols  a = Ts*[.5, .75, 1, 2]; B = sqrt(log(2)/2)./(a);  t = linspace(-span*Ts/2,span*Ts/2,1000)'; hg = zeros(length(t),length(a)); for k = 1:length(a)   hg(:,k) = sqrt(pi)/a(k)*exp(-(pi*t/a(k)).^2); end  plot(t/Ts,hg) title({'Impulse response of a continuous-time Gaussian filter';...   'for various bandwidths'}); xlabel('Normalized time (t/Ts)') ylabel('Amplitude') legend(sprintf('a = %g*Ts',a(1)/Ts),sprintf('a = %g*Ts',a(2)/Ts),...   sprintf('a = %g*Ts',a(3)/Ts),sprintf('a = %g*Ts',a(4)/Ts)) grid on;

Tenga en cuenta que las respuestas de impulso se normalizan a la hora del símbolo.

Respuesta de frecuencia para el filtro gaussiano de tiempo continuo

Calcularemos y trazaremos la respuesta de frecuencia para filtros gaussianos de tiempo continuo con diferentes anchos de banda. En el gráfico siguiente, el límite de 3 dB se indica mediante los círculos rojos ('o') en la curva de respuesta de magnitud. Observe que el ancho de banda 3-dB está entre el DC y el B.

f = linspace(0,32e6,10000)'; Hideal = zeros(length(f),length(a)); for k = 1:length(a)   Hideal(:,k) = exp(-a(k)^2*f.^2); end  plot(f,20*log10(Hideal)) titleStr = {'Ideal magnitude response for a continuous-time ';...   'Gaussian filter for various bandwidths'}; title(titleStr); legend(sprintf('B = %g',B(1)),sprintf('B = %g',B(2)),...   sprintf('B = %g',B(3)),sprintf('B = %g',B(4))) hold on for k = 1:length(a)   plot(B,20*log10(exp(-a.^2.*B.^2)),'ro','HandleVisibility','off') end  axis([0 5*max(B) -50 5]) xlabel('Frequency (Hz)') ylabel('Magnitude (dB)') grid on;

Aproximación FIR del filtro gaussiano

Diseñaremos el filtro FIR Gaussiano utilizando la función.gaussdesign Las entradas de esta función son el producto de tiempo de símbolo de ancho de banda de 3 dB, el número de períodos de símbolos entre el inicio y el final de la respuesta de impulso de filtro, es decir, el intervalo de filtro en los símbolos y el factor de sobremuestreo (es decir, el número de muestras por símbolo).

El factor de sobremuestreo (OVSF) determina la frecuencia de muestreo y la longitud del filtro y, por lo tanto, desempeña un papel importante en el diseño del filtro FIR gaussiano. Los errores de aproximación en el diseño se pueden reducir con una elección adecuada de factor de sobremuestreo. Ilustramos esto comparando los filtros FIR gaussianos diseñados con dos factores de sobremuestreo diferentes.

En primer lugar, consideraremos un factor de sobremuestreo de 16 para diseñar el filtro gaussiano discreto.

ovsf = 16; % Oversampling factor (samples/symbol) h = zeros(97,4); iz = zeros(97,4); for k = 1:length(a)   BT = B(k)*Ts;   h(:,k) = gaussdesign(BT,span,ovsf);   [iz(:,k),t] = impz(h(:,k)); end figure('Color','white') t = (t-t(end)/2)/Ts; stem(t,iz) title({'Impulse response of the Gaussian FIR filter for ';...   'various bandwidths, OVSF=16'}); xlabel('Normalized time (t/Ts)') ylabel('Amplitude') legend(sprintf('a = %g*Ts',a(1)/Ts),sprintf('a = %g*Ts',a(2)/Ts),...   sprintf('a = %g*Ts',a(3)/Ts),sprintf('a = %g*Ts',a(4)/Ts)) grid on;

Respuesta de frecuencia para el filtro gaussiano FIR (factor de sobremuestreo 16)

Calcularemos la respuesta de frecuencia para el filtro FIR gaussiano con un factor de sobremuestreo de 16 y lo compararemos con la respuesta de frecuencia ideal (es decir, la respuesta de frecuencia de un filtro gaussiano de tiempo continuo).

Fs = ovsf/Ts; hfvt = fvtool(h(:,1),1,h(:,2),1,h(:,3),1,h(:,4),1,...   'FrequencyRange', 'Specify freq. vector', ...   'FrequencyVector',f,'Fs',Fs,'Color','white'); titleStr = {['Ideal mag. responses (dashed lines) and corresponding ', ...   'FIR approximations (solid lines)'] ;' for various values of B, OVSF=16'}; title(titleStr) legend(hfvt, sprintf('B = %g',B(1)),sprintf('B = %g',B(2)),...   sprintf('B = %g',B(3)),sprintf('B = %g',B(4)), ...   'Location','Best') hold on; plot(f*Ts,20*log10(Hideal),'--') axis([0 32 -350 5])

Observe que los dos primeros filtros FIR presentan errores de alias y los dos últimos filtros FIR presentan errores de truncamiento. El alias se produce cuando la frecuencia de muestreo no es mayor que la frecuencia Nyquist. En el caso de los dos primeros filtros, el ancho de banda es lo suficientemente grande como para que el factor de sobremuestreo no separe las réplicas espectrales lo suficiente como para evitar el alias. Sin embargo, la cantidad de alias no es muy significativa.

Por otro lado, los dos últimos filtros FIR muestran la limitación de aproximación FIR antes de que pueda ocurrir cualquier alias. Las respuestas de magnitud de estos dos filtros llegan a un piso antes de que puedan superponerse con las réplicas espectrales.

Importancia del factor de sobremuestreo

Los errores de alias y truncamiento varían según el factor de sobremuestreo. Si se reduce el factor de sobremuestreo, estos errores serán más graves, ya que esto reduce la frecuencia de muestreo (con lo que se acercan las réplicas) y también reduce las longitudes del filtro (aumentando el error en la aproximación FIR).

Por ejemplo, si seleccionamos un factor de sobremuestreo de 4, veremos que todos los filtros FIR presentan errores de alias ya que la frecuencia de muestreo no es lo suficientemente grande como para evitar la superposición de las réplicas espectrales.

ovsf = 4; % Oversampling factor (samples/symbol) h = zeros(25,4); iz = zeros(25,4); for k = 1:length(a)   BT = B(k)*Ts;   h(:,k) = gaussdesign(BT,span,ovsf);   [iz(:,k),t] = impz(h(:,k)); end figure('Color','white') t = (t-t(end)/2)/Ts; stem(t,iz) title({'Impulse response of the Gaussian FIR filter'; 'for various bandwidths, OVSF=4'}); xlabel('Normalized time (t/Ts)') ylabel('Amplitude') legend(sprintf('a = %g*Ts',a(1)/Ts),sprintf('a = %g*Ts',a(2)/Ts),...   sprintf('a = %g*Ts',a(3)/Ts),sprintf('a = %g*Ts',a(4)/Ts)) grid on;

Respuesta de frecuencia para el filtro gaussiano FIR (factor de sobremuestreo n.o 4)

Trazaremos y estudiaremos la respuesta de frecuencia para el filtro FIR gaussiano diseñado con factor de sobremuestreo de 4. Un factor de sobremuestreo más pequeño significa una frecuencia de muestreo más pequeña. Como resultado, esta frecuencia de muestreo no es suficiente para evitar la superposición espectral y todos los filtros de aproximación FIR exhiben alias.

Fs = ovsf/Ts; hfvt = fvtool(h(:,1),1,h(:,2),1,h(:,3),1,h(:,4),1,...   'FrequencyRange', 'Specify freq. vector', ...   'FrequencyVector',f,'Fs',Fs,'Color','white'); titleStr = {['Ideal mag. responses (dashed lines) and corresponding ',...   'FIR approximations (solid lines)'] ;' for various values of B, OVSF=4'}; title(titleStr) legend(hfvt, sprintf('B = %g',B(1)),sprintf('B = %g',B(2)),...   sprintf('B = %g',B(3)),sprintf('B = %g',B(4)), ...   'Location','Best') hold on; plot(f*Ts,20*log10(Hideal),'--') axis([0 32 -350 5])