Main Content

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.

fftfilt

Filtrado FIR basado en FFT mediante el método overlap-add

Descripción

ejemplo

y = fftfilt(b,x) filtra los datos en vector con el filtro descrito por vector de coeficiente .xb

y = fftfilt(b,x,n) para determinar la longitud de la FFT.n

y = fftfilt(d,x) filtra los datos en vector con un objeto .xdigitalFilterd

y = fftfilt(d,x,n) para determinar la longitud de la FFT.n

ejemplo

y = fftfilt(gpuArrayb,gpuArrayX,n) filtra los datos del objeto con los coeficientes de filtro FIR en el archivo .gpuArray (Parallel Computing Toolbox)gpuArrayXgpuArraygpuArrayb

Ejemplos

contraer todo

Compruebe que es más eficaz para operandos más pequeños y es más eficaz para operandos grandes.filterfftfilt Filtro

<math display="inline">
<mrow>
<msup>
<mrow>
<mn>10</mn>
</mrow>
<mrow>
<mn>6</mn>
</mrow>
</msup>
</mrow>
</math>
números aleatorios con dos filtros aleatorios: uno corto, con 20 toques, y uno largo, con 2000. Usar y medir los tiempos de ejecución.tictoc Repita el experimento 100 veces para mejorar las estadísticas.

rng default  N = 100;  shrt = 20; long = 2000;  tfs = 0; tls = 0; tfl = 0; tll = 0;  for kj = 1:N          x = rand(1,1e6);      bshrt = rand(1,shrt);      tic     sfs = fftfilt(bshrt,x);     tfs = tfs+toc/N;      tic     sls = filter(bshrt,1,x);     tls = tls+toc/N;      blong = rand(1,long);      tic     sfl = fftfilt(blong,x);     tfl = tfl+toc/N;          tic     sll = filter(blong,1,x);     tll = tll+toc/N;  end

Compare los tiempos promedio.

fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',shrt,tfs,tls)
  20-tap filter averages: fftfilt: 0.298452 s; filter: 0.023427 s 
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.118607 s; filter: 0.325501 s 

Este ejemplo requiere parallel Computing Toolbox™ software. Consulte para obtener una lista de GPU compatibles.GPU Support by Release (Parallel Computing Toolbox)

Cree una señal que consista en una suma de ondas sinusoidales en ruido aditivo gaussiano blanco. Las frecuencias de onda sinusoidal son 2.5, 5, 10 y 15 kHz. La frecuencia de muestreo es de 50 kHz.

Fs = 50e3; t = 0:1/Fs:10-(1/Fs); x = cos(2*pi*2500*t) + 0.5*sin(2*pi*5000*t) + 0.25*cos(2*pi*10000*t)+ ...     0.125*sin(2*pi*15000*t) + randn(size(t));

Diseñe un filtro equiripple FIR de paso bajo utilizando .designfilt

d = designfilt('lowpassfir','SampleRate',Fs, ...     'PassbandFrequency',5500,'StopbandFrequency',6000, ...     'PassbandRipple',0.5,'StopbandAttenuation',50); B = d.Coefficients;

Filtre los datos en la GPU mediante el método overlap-add. Coloque los datos en la GPU utilizando .gpuArray Devuelva la salida al espacio de trabajo MATLAB® utilizando y trace la estimación de densidad espectral de potencia de los datos filtrados.gather

y = fftfilt(gpuArray(B),gpuArray(x)); periodogram(gather(y),rectwin(length(y)),length(y),50e3)

Argumentos de entrada

contraer todo

Coeficientes de filtro, especificados como vector. Si es una matriz, aplica el filtro en cada columna del vector de señal .bfftfiltbx

Datos de entrada, especificados como vectores. Si es una matriz, filtra sus columnas.xfftfilt Si y son ambas matrices con el mismo número de columnas, la ésima columna de se utiliza para filtrar la ésima columna de . trabaja tanto para entradas reales como complejas.bxibixfftfilt

Longitud FFT, especificada como un entero positivo. De forma predeterminada, elige una longitud FFT y una longitud de bloque de datos que garantizan un tiempo de ejecución eficaz.fftfilt

Filtro digital, especificado como un objeto.digitalFilter Se utiliza para generar en función de las especificaciones de respuesta de frecuencia.designfiltd

Matrices de GPU, especificadas como un objeto. contiene los coeficientes de filtro y son los datos de entrada.gpuArraygpuArraybgpuArrayX Consulte para obtener más información sobre los objetos.Run MATLAB Functions on a GPU (Parallel Computing Toolbox)gpuArray El uso con objetos requiere software.fftfiltgpuArrayParallel Computing Toolbox™ Consulte para obtener una lista de GPU compatibles.GPU Support by Release (Parallel Computing Toolbox) Los datos filtrados, , es un objeto.ygpuArray Consulte un ejemplo de filtrado de adición de superposición en la GPU.Filtrado de superposición y adición en la GPU

Argumentos de salida

contraer todo

Datos de salida, devueltos como vector, matriz u objeto.gpuArray

Más acerca de

contraer todo

Comparación con la funciónfilter

Cuando la señal de entrada es relativamente grande, es más rápida que .fftfiltfilter

realiza multiplicaciones para cada muestra en , donde está la longitud del filtro. realiza 2 operaciones FFT —la FFT del bloque de señal de longitud más el FT inverso del producto de los FFT— a costa defilterNxNfftfiltL 12Llog2L donde está la longitud del bloque.L A continuación, realiza multiplicaciones puntuales por un costo total deL L+Llog2L=L(1+log2L) Multiplicaciones. Por lo tanto, la relación de costes es L(1+log2L)/(NL)=(1+log2L)/N que es aproximadamente registro2/  .LN

Por lo tanto, es más rápido cuando el registrofftfilt2es menos de .LN

Algoritmos

filtra los datos utilizando el método eficiente basado en FFT de , una técnica de filtrado de dominio de frecuencia que funciona sólo para filtros FIR mediante la combinación de bloques filtrados de dominio de frecuencia sucesivos de una secuencia de entrada.fftfiltsuperposición-añadir[1] La operación realizada por se describe en el dominio de tiempo por la ecuación de diferencia:fftfilt

y(n)=b(1)x(n)+b(2)x(n1)++b(nb+1)x(nnb)

Una representación equivalente es la descripción del dominio de transformación Z o frecuencia:

Y(z)=(b(1)+b(2)z1++b(nb+1)znb)X(z)

se utiliza para implementar el método overlap-add. divide una secuencia de entrada en bloques de datos de longitud, donde debe ser mayor que la longitud del filtro.fftfiltfftfftfiltxLLN

y convoluciona cada bloque con el filtro porb

y = ifft(fft(x(i:i+L-1),nfft).*fft(b,nfft)); 

donde está la longitud ffT. superpone las secciones de salida sucesivas por puntos, donde está la longitud del filtro y las suma.nfftfftfiltn-1n

elige los parámetros clave y de diferentes maneras, dependiendo de si proporciona una longitud FFT para el filtro y la señal.fftfiltLnfftn Si no especifica un valor para (que determina la longitud de FFT), elige estos parámetros clave automáticamente:nfftfilt

  • Si es mayor que , elige valores que minimizan el número de bloques por el número de flops por FFT.length(x)length(b)fftfilt

  • Si es mayor o igual que , utiliza un único FFT de longitudlength(b)length(x)fftfilt

    2^nextpow2(length(b) + length(x) - 1) 

    Esto calcula

    y = ifft(fft(B,nfft).*fft(X,nfft)) 

Si proporciona un valor para , elige una longitud FFT, , of y una longitud de bloque de datos de - + .nfftfiltnfft2^nextpow2(n)nfftlength(b)1 Si es menor que , establece en .nlength(b)fftfiltnlength(b)

Referencias

[1] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

Capacidades ampliadas

Consulte también

| | | |

Introducido antes de R2006a