Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

upfirdn

Sobremuestrear, apliqcar filtro FIR y submuestrear

Descripción

yout = upfirdn(xin,h) filtra la señal de entrada xin utilizando un filtro FIR con respuesta al impulso h. No se implementa el sobremuestreo ni el submuestreo con esta sintaxis.

yout = upfirdn(xin,h,p) especifica el factor de sobremuestreo entero p.

ejemplo

yout = upfirdn(xin,h,p,q) especifica el factor de submuestreo entero q.

Ejemplos

contraer todo

Cambie la tasa de muestreo de una señal con un factor de conversión racional de una tasa DAT de 48 kHz a la tasa de muestreo CD de 44,1 kHz. Utilice la función rat para encontrar el numerador L y el denominador M del factor racional.

Fdat = 48e3;
Fcd = 44.1e3;
[L,M] = rat(Fcd/Fdat)
L = 147
M = 160

Genere una sinusoide de 1,5 kHz muestreada a fDAT durante 0,25 segundos. Represente el primer milisegundo de la señal.

t = 0:1/Fdat:0.25-1/Fdat;
x = sin(2*pi*1.5e3*t);
stem(t,x)
xlim([0 0.001])
hold on

Figure contains an axes object. The axes object contains an object of type stem.

Diseñe un filtro paso bajo anti-aliasing mediante una ventana de Kaiser. Establezca los bordes de banda del filtro en el 90% y el 110% de la frecuencia de corte, (fDAT/2)×min(1/L,1/M). Especifique una ondulación de la banda de paso de 5 dB y una atenuación de la banda de parada de 40 dB. Establezca la ganancia de la banda de paso en L.

f = (Fdat/2)*min(1/L,1/M);
d = designfilt('lowpassfir', ...
    'PassbandFrequency',0.9*f,'StopbandFrequency',1.1*f, ...
    'PassbandRipple',5,'StopbandAttenuation',40, ...
    'DesignMethod','kaiserwin','SampleRate',48e3);
h = L*tf(d);

Utilice upfirdn con el filtro h para remuestrear la sinusoide. Calcule y compense el retardo introducido por el filtro. Genere el vector de tiempo remuestreado correspondiente.

y = upfirdn(x,h,L,M);

delay = floor(((filtord(d)-1)/2-(L-1))/L);
y = y(delay+1:end);
t_res = (0:(length(y)-1))/Fcd;

Superponga la señal remuestreada en la gráfica.

stem(t_res,y,'*')
legend('Original','Resampled','Location','southeast')
hold off

Figure contains an axes object. The axes object contains 2 objects of type stem. These objects represent Original, Resampled.

Argumentos de entrada

contraer todo

Señal de entrada, especificada como vector o matriz. Si xin es un vector, entonces representa una única señal. Si xin es una matriz, entonces cada columna se filtra de forma independiente. Para obtener más detalles, consulte Consejos.

Tipos de datos: single | double

Respuesta al impulso del filtro, especificada como un vector o matriz. Si h es un vector, entonces representa un filtro FIR. Si h es una matriz, cada columna es una secuencia de respuesta al impulso FIR independiente. Para obtener más detalles, consulte Consejos.

Tipos de datos: single | double

Factor de sobremuestreo, especificado como entero positivo.

Tipos de datos: single | double

Factor de submuestreo, especificado como entero positivo.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Señal de salida, devuelta como un vector o una matriz. Cada columna de yout tiene una longitud ceil(((length(xin)-1)*p+length(h))/q).

Si la entrada de upfirdn es de precisión simple, la función devuelve yout con precisión simple.

Nota

Puesto que upfirdn realiza la convolución y el cambio de tasa, las señales de salida yout tienen una longitud distinta de las señales de entrada xin. El número de filas de yout es aproximadamente p/q veces el número de filas de xin.

Sugerencias

Las combinaciones válidas de los tamaños de xin y h son:

  1. xin es un vector y h es un vector.

    Las entradas son un filtro y una señal, así que la función convoluciona xin con h. La señal de salida yout es un vector fila si xin es un vector fila; de lo contrario, yout es un vector columna.

  2. xin es una matriz y h es un vector.

    Las entradas son un filtro y muchas señales, así que la función convoluciona h con cada columna de xin. El yout resultante es una matriz con el mismo número de columnas que xin.

  3. xin es un vector y h es una matriz.

    Las entradas son varios filtros y una señal, así que la función convoluciona cada columna de h con xin. El yout resultante es una matriz con el mismo número de columnas que h.

  4. xin es una matriz y h es una matriz, ambos con el mismo número de columnas.

    Las entradas son varios filtros y varias señales, por lo que la función convoluciona las columnas de xin y h correspondientes. El yout resultante es una matriz con el mismo número de columnas que xin y h.

Algoritmos

upfirdn utiliza una estructura de interpolación polifase. El número de operaciones de multiplicación y suma en la estructura polifase es de aproximadamente (LhLxpLx)/q donde Lh y Lx son las longitudes de h(n) y x(n), respectivamente. En el caso de las señales largas, esta fórmula es, a menudo, exacta.

upfirdn realiza una cascada de tres operaciones:

  1. Sobremuestrear los datos de entrada en la matriz xin por un factor del entero p (insertando ceros)

  2. Aplicar un filtro FIR a los datos de la señal sobremuestreada con la secuencia de respuesta al impulso especificada en el vector o la matriz h

  3. Submuestrear el resultado por un factor del entero q (descartando muestras)

El filtro FIR suele ser un filtro paso bajo, que debe diseñar utilizando otra función como firpm o fir1.

Nota

La función resample realiza un diseño FIR utilizando firls, seguido de un cambio de tasa implementado con upfirdn.

Referencias

[1] Crochiere, R. E. "A General Program to Perform Sampling Rate Conversion of Data by Rational Ratios." Programs for Digital Signal Processing (Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds.). New York: IEEE Press, 1979, Programs 8.2-1–8.2-7.

[2] Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido antes de R2006a

expandir todo

Consulte también

| | | | | | |