Main Content

Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Modulación de banda lateral única a través de la transformación Hilbert

Este ejemplo muestra cómo utilizar la transformación discreta de Hilbert para implementar la modulación de banda lateral única.

Hilbert Transform encuentra aplicaciones en moduladores y demoduladores, procesamiento de voz, imágenes médicas, mediciones de dirección de llegada (DOA), esencialmente en cualquier lugar en el que el procesamiento de señales complejas (cuadraturas) simplifica el diseño.

Introducción

La modulación de banda lateral única (SSB) es una forma eficiente de modulación de amplitud (AM) que utiliza la mitad del ancho de banda utilizado por AM. Esta técnica es más popular en aplicaciones como telefonía, radio HAM y comunicaciones HF, es decir, comunicaciones basadas en voz. Este ejemplo muestra cómo implementar la modulación SSB usando un transformador de Hilbert.

Para motivar la necesidad de utilizar un transformador Hilbert en la modulación SSB, es útil primero revisar rápidamente la modulación de doble banda lateral.

Modulación de banda lateral doble

Una forma simple de AM es la modulación de banda lateral doble (DSB), que normalmente consiste en dos copias de frecuencia cambiada de una señal modulada a cada lado de una frecuencia portadora. Más precisamente, esto se conoce como un Portador Suprimido del OSD, y se define como

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mi>m</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">cos</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mrow>
</math>

donde m[n] se conoce generalmente como la señal del mensaje y fo es la frecuencia portadora. Como se muestra en la ecuación anterior, la modulación DSB consiste en multiplicar la señal de mensaje m[n] por la portadora cos(2*pi*fo*n/fs), por lo tanto, podemos utilizar el teorema de modulación de las transformaciones de Fourier para calcular la transformación de f[n]

<math display="block">
<mrow>
<mi>F</mi>
<mo stretchy="false">(</mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mfrac>
<mrow>
<mn>1</mn>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
<mo stretchy="false">[</mo>
<mi>M</mi>
<mo stretchy="false">(</mo>
<mi>f</mi>
<mo>-</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mi>M</mi>
<mo stretchy="false">(</mo>
<mi>f</mi>
<mo>+</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
</mrow>
</math>

donde M(f) es la Transformación De cuatro veces discreta (DTFT) de m[n]. Si la señal del mensaje es lowpass con el ancho de banda W, después F(f) es una señal del paso de banda con el doble del ancho de banda. Veamos un ejemplo de señal DSB y su espectro.

% Define and plot a message signal which contains three tones at 500, 600, % and 700 Hz with varying amplitudes. Fs = 10e3; t = 0:1/Fs:.1-1/Fs; m = sin(2*pi*500*t) + .5*sin(2*pi*600*t) + 2*sin(2*pi*700*t); plot(t,m);   % Plot annotations. grid xlabel('Time') ylabel('Amplitude') title('Message Signal m[n]')

A continuación calculamos y trazamos el espectro de potencia de la señal del mensaje.

periodogram(m, [], 4096, Fs, 'power', 'centered');  % Let's zoom into the area of interest. ylim([-75,12]);

El espectro de potencia de doble cara muestra claramente los tres tonos cerca de CC. Si nos acercamos más podremos leer la potencia de cada componente.

xlim([0.1 1]); ylim([-18 2]);

La potencia para el tono de 500 Hz es aproximadamente -6 dB, para el tono de 600 Hz es -12 dB, y para el tono de 700 Hz es 0 dB, que corresponde a las amplitudes de tono de la señal de mensaje de 1, 0,5 y 2, respectivamente.

Usando esta señal de mensaje m[n], vamos a multiplicarla por una portadora para crear una señal DSB, y mirar su espectro.

fo = 3.5e3; % Carrier frequency in Hz f = m.*cos(2*pi*fo*t); idx = 100; plot(t(1:idx),f(1:idx),t(1:idx),m(1:idx),'r:');   % View a portion. grid  % Plot annotations. xlabel('Time') ylabel('Amplitude') title('Message Signal and Message Signal Modulated') legend('Modulated Message Signal','Message Signal m[n]')  hgcf = gcf; hgcf.Color = 'white';

La línea sólida azul es la señal de mensaje modulada, y la línea de puntos roja es la señal de mensaje de variación lenta. El espectro de potencia de nuestra señal modulada es entonces

periodogram(f, [], 4096, Fs, 'power', 'centered');  % Let's zoom into the area of interest.  ylim([-75,0]);

hgcf = gcf; hgcf.Color = 'white';

Podemos ver que la señal del mensaje (tres tonos), se ha desplazado a la frecuencia central fo. Además, la potencia de cada componente se ha reducido a un cuarto, debido a que las amplitudes se han reducido a la mitad, como indica el DTFT del m[n] modulado. Vamos a hacer zoom para leer los nuevos valores de potencia

ylim([-20,0]);

Nuestros componentes de frecuencia positiva están ahora en -6, -18 y -12 dB.

Ahora que hemos definido la modulación DSB, echemos un vistazo a la modulación de banda lateral única.

Modulación de banda lateral única

La modulación de banda lateral única (SSB) es similar a la modulación DSB, pero en lugar de utilizar todo el espectro utiliza un filtro para seleccionar la banda lateral inferior o superior. La selección de la banda lateral inferior o superior da como resultado la modulación de banda lateral inferior (LSB) o banda lateral superior (USB), respectivamente. Hay dos enfoques para eliminar una de las bandas laterales, uno es el método de filtro y el otro es el método de eliminación gradual. El proceso de filtrado selectivo de la banda lateral superior o inferior es difícil debido a los filtros estrictos requeridos, especialmente si hay contenido de señal cerca de DC. En este ejemplo se muestra cómo utilizar el método de eliminación gradual, que utiliza un transformador Hilbert para implementar la modulación SSB.

La modulación SSB requiere el desplazamiento de la señal de mensaje a otra frecuencia central sin crear pares de componentes de frecuencia X(f-fo) y X(f+fo) como en el caso de la modulación DSB, es decir, evitando la necesidad de filtrar la banda lateral superior o inferior. Esto se puede hacer mediante el uso de un transformador Hilbert.

Primero revisemos la definición y las propiedades de la transformación Hilbert ideal antes de discutir su uso en la modulación SSB. Esto ayudará a motivar su uso en la modulación SSB.

Ideal Hilbert Transform

La transformación Hilbert discreta es un proceso por el cual las frecuencias negativas de una señal son avanzadas en fase 90 grados y las frecuencias positivas se retrasan en fase 90 grados. Cambiar los resultados de la transformación Hilbert (+j) y añadirla a la señal original crea una señal compleja como veremos a continuación.

Si mi[n] es la transformación Hilbert del Sr.[n], entonces:

<math display="block">
<mrow>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>c</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>r</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>+</mo>
<mi>j</mi>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>i</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
</mrow>
</math>

es una señal compleja conocida como la señal analítica. El siguiente diagrama muestra la generación de una señal analítica por medio de la transformación Hilbert ideal.

Una característica importante de la señal analítica es que su contenido espectral se encuentra en el intervalo Nyquist positivo. Esto se debe a que si cambiamos la parte imaginaria de nuestra señal analítica (compleja) por 90 grados (+j) y la añadimos a la parte real, las frecuencias negativas se cancelarán mientras que las frecuencias positivas se añadirán. Esto da como resultado una señal sin frecuencias negativas. Además, la magnitud del componente de frecuencia en la señal compleja es el doble de la magnitud del componente de frecuencia en la señal real. Esto es similar a un espectro unilateral, que contiene la potencia total de la señal en las frecuencias positivas.

A continuación presentamos un cambio espectral. El cambiador espectral desplaza (traduce) el contenido espectral de una señal modulando la señal analítica formada a partir de la señal cuyo espectro queremos cambiar. Este concepto se puede utilizar para la modulación SSB como se muestra más adelante.

Cambio espectral

Usando la señal de mensaje m[n] definida anteriormente crearemos una señal analítica empleando la Transformación Hilbert, que luego será modulada a la frecuencia central deseada. El esquema se muestra en el diagrama siguiente.

El uso de este método de cambio espectral asegurará que la potencia de nuestra señal se desplace a la frecuencia de interés mientras se mantiene una señal de valor real al final.

Como indicamos anteriormente, la señal analítica se compone de la señal original de valor real más la transformación Hilbert de esa señal real. Ejecutar la señal real por la función hilbert en el cuadro de herramientas de procesamiento de señales™ producirá una señal analítica.

Nota: La función hilbert produce la señal analítica completa (compleja), no sólo la parte imaginaria.

mc = hilbert(m);

También podemos calcular y trazar el contenido espectral de la señal analítica construida a partir de nuestra señal de mensaje m[n].

periodogram(mc, [], 4096, Fs, 'power', 'centered'); hgcf.Color = 'white';  % Let's zoom in. ylim([-75,6]);

Como se muestra en la gráfica de espectro, nuestra señal analítica es compleja y sólo contiene componentes de frecuencia positiva. Además, si medimos la potencia, o ampliamos más en nuestra gráfica en el componente de frecuencia positiva veremos que la potencia de los componentes de frecuencia de la señal analítica es el doble de la potencia total del componente de frecuencia positiva (o negativa) de la señal real , es decir, es similar a un espectro unilateral que contiene la potencia total de la señal. Vea el trazado ampliado a continuación.

xlim([0.1,1]); ylim([-10,6]);

Vemos que la potencia de los componentes de frecuencia de la señal analítica (compleja) 500, 600 y 700 Hz son aproximadamente 0, -6 y 6 dB, respectivamente, que es la potencia total de la señal original. Estos valores corresponden a nuestra señal original de valor real que tiene tres tonos con amplitudes de 1, 0,5 y 2, respectivamente.

En este punto podemos modular la señal analítica para desplazar el contenido espectral a otra frecuencia central sin producir pares de componentes de frecuencia y mantener una señal de valor real.

Para modular la señal a la frecuencia portadora fo, multiplicaremos la señal analítica por un exponencial.

mcm = mc.*exp(1i*2*pi*fo*t);

Como se muestra en el diagrama de Spectral Shifter, después de modular nuestra señal calcularemos la parte real. Cuyo espectro es

periodogram(real(mcm), [], 4096, Fs, 'power', 'centered');  % Zooming in we get ylim([-75,0]);

hgcf = gcf; hgcf.Color = 'white';

Como se muestra en la gráfica anterior nuestra señal se ha modulado a una nueva frecuencia central de fo sin crear los pares de frecuencia, es decir, dio lugar a la banda lateral superior.

Si comparamos la gráfica espectral anterior con la de la modulación DSB podemos ver que el Cambio Espectral logró la modulación SSB.

Implementación eficiente de la modulación SSB

A partir de nuestra derivación anterior podemos ver que la señal modulada SSB, f[n] se puede escribir como

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo mathvariant="normal"></mo>
<mo stretchy="false">[</mo>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>c</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mi>j</mi>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
</mrow>
</math>

donde mc[n] es la señal analítica definida como

<math display="block">
<mrow>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>c</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mi>m</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>+</mo>
<mi>j</mi>
<munderover accent="true">
<mrow>
<mi>m</mi>
</mrow>
<mrow></mrow>
<mrow>
<mo stretchy="false"></mo>
</mrow>
</munderover>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
</mrow>
</math>

Expandir esa ecuación y tomar la parte real que obtenemos

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo stretchy="false">[</mo>
<mi>m</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">cos</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>-</mo>
<munderover accent="true">
<mrow>
<mi>m</mi>
</mrow>
<mrow></mrow>
<mrow>
<mo stretchy="false"></mo>
</mrow>
</munderover>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">sin</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
</mrow>
</math>

que da como resultado una sola banda lateral, banda lateral superior (SSBU). Del mismo modo, podemos definir la banda lateral inferior SSB (SSBL) por

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo mathvariant="normal"></mo>
<mo stretchy="false">[</mo>
<msub>
<mrow>
<mi>m</mi>
</mrow>
<mrow>
<mi>c</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">exp</mi>
<mo stretchy="false">(</mo>
<mo>-</mo>
<mi>j</mi>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
</mrow>
</math>

<math display="block">
<mrow>
<mi>f</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo stretchy="false">[</mo>
<mi>m</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">cos</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>+</mo>
<munderover accent="true">
<mrow>
<mi>m</mi>
</mrow>
<mrow></mrow>
<mrow>
<mo stretchy="false"></mo>
</mrow>
</munderover>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mi mathvariant="normal">sin</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mi>π</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>o</mi>
</mrow>
</msub>
<mi>n</mi>
<mo>/</mo>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>s</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
</mrow>
</math>

La ecuación SSBU anterior sugiere una manera más eficiente de implementar SSB. En lugar de realizar la multiplicación compleja de mc[n] con exp(j*2*pi*fo*n/fs) y luego tirar la parte imaginaria, podemos calcular solo las cantidades que necesitamos implementando SSBU como se muestra a continuación.

Para implementar la modulación SSB mostrada anteriormente necesitamos calcular la transformación Hilbert de nuestra señal de mensaje m[n] y modular ambas señales. Pero antes de hacer eso tenemos que señalar el hecho de que los transformadores Hilbert ideales no son realizables. Sin embargo, se han desarrollado algoritmos que se aproximan al Transformador Hilbert, como la técnica de diseño de filtros FIR Parks-McClellan, que se pueden utilizar. MATLAB® Signal Processing Toolbox™ proporciona la función firpm que diseña dichos filtros. También, puesto que el filtro introduce un retardo necesitamos compensar ese retardo agregando el retardo (N/2, donde N es el orden del filtro) a la señal que se está multiplicando por el término del coseno como se muestra abajo.

Para el transformador FIR Hilbert utilizaremos un filtro de longitud impar que es computacionalmente más eficiente que un filtro de longitud uniforme. Los filtros de longitud uniforme disfrutan de errores de banda de paso más pequeños. El ahorro en filtros de longitud impar es el resultado de que estos filtros tienen varios de los coeficientes que son cero. Además, el uso de un filtro de longitud impar requerirá un desplazamiento por un retardo de tiempo entero, en lugar de un retardo de tiempo fraccionario que requiere un filtro de longitud uniforme. Para un filtro de longitud impar, la respuesta de magnitud de un transformador Hilbert es cero para w - 0 y w - pi. Para los archivadores de longitud uniforme, la respuesta de magnitud no tiene que ser 0 en pi, por lo tanto, han aumentado los anchos de banda. Así que para los filtros de longitud impar el ancho de banda útil se limita a

<math display="block">
<mrow>
<mn>0</mn>
<mo><</mo>
<mi>w</mi>
<mo><</mo>
<mi>π</mi>
</mrow>
</math>

Vamos a diseñar el filtro y trazar su respuesta de fase cero.

Hd = designfilt('hilbertfir','FilterOrder',60,...                              'TransitionWidth',0.1,...                              'DesignMethod','equiripple');  hfv = fvtool(Hd,'Analysis','Magnitude',...     'MagnitudeDisplay','Zero-phase',...     'FrequencyRange','[-pi, pi)'); hfv.Color = 'white';

Para aproximar la transformación de Hilbert filtraremos la señal del mensaje con el filtro.

m_tilde = filter(Hd,m);

La señal de la banda lateral superior es entonces

G = filtord(Hd)/2;   % Filter delay m_delayed = [zeros(1,G),m(1:end-G)]; f = m_delayed.*cos(2*pi*fo*t) - m_tilde.*sin(2*pi*fo*t);

y el espectro es

periodogram(f, [], 4096, Fs, 'power', 'centered');  % Zooming in we get ylim([-75,0]); hgcf = gcf; hgcf.Color = 'white';

Como se ve en la trama anterior modulamos con éxito la señal del mensaje (tres tonos) a la frecuencia portadora de 3.5k Hz y mantuvimos sólo la banda lateral superior.

Resumen

Como hemos visto, mediante el uso de una aproximación a la transformación Hilbert podemos producir señales analíticas, que son útiles en muchas aplicaciones de señal que requieren un cambio espectral. Específicamente hemos visto cómo un transformador aproximado de Hilbert se puede utilizar para implementar la modulación de banda lateral única.