passband matriz iir filtrar espaƱol designfilt coefficients butterworth matlab filter sliding-window

matriz - matlab designfilt coefficients



filtro de ventana deslizante simple en Matlab (2)

No tengo el paquete para nlfilter y no seguí este ejemplo .

Tengo una función muy simple fun y quiero aplicarla a una ventana móvil de una matriz. La matriz es Nx1 , y quiero ver la longitud k intervalos, por ejemplo. Entonces para N=10 k=3 y fun = @(x) min(x); Me gustaría obtener

A = [13 14 2 14 10 3 5 9 15 8]; filter(A,k,fun) = [2 2 2 3 3 3 5 8];

Aquí solo quiero ver los índices 1,2,3 y 2,3,4, luego ... luego 8,9,10, por lo que la secuencia final es de longitud 7. Puedo hacerlo fácilmente con un ciclo for, pero no tengo idea de cómo vectorizarlo para Matlab. Ayuda por favor. Gracias.


Aquí hay una manera muy simple y rápida de hacerlo:

>> min([A(1:(end-2)); A(2:(end-1)); A(3:end)], [], 1) ans = 2 2 2 3 3 3 5 8

EDITAR: ya que quieres una función completa ...

function running_min = running_min(x, k) xrep = repmat(x, 1, k); xrep = reshape([xrep zeros(1, k)], length(x)+1, k); running_min = min(xrep, [], 2)''; running_min = running_min(1:end-k);


La publicación que mencionaste dio una solución general para la construcción de ventanas correderas (se podía controlar: superposición frente a distinta, paso de diapositiva, cantidad de superposición, tamaño de ventanas)

En su caso, es mucho más simple y se puede realizar fácilmente con la función HANKEL :

x = [13 14 2 14 10 3 5 9 15 8]; idx = hankel(1:3, 3:length(x)) min( x(idx) )

Si quieres construir una solución reutilizable:

function y = myFilter(x,k,fcn) idx = hankel(1:k, k:length(x)); y = cellfun(fcn, num2cell(x(idx),1)); end

que usamos como:

x = [13 14 2 14 10 3 5 9 15 8]; y = myFilter(x, 3, @(x)min(x))

Tenga en cuenta que estoy usando CELLFUN en caso de que fcn no pueda operar a través de las dimensiones de una manera vectorizada ...