La idea clave es que el enfoque de muestreo aleatorio impone más restricciones en la señal resultante que el enfoque de muestreo uniforme.
El algoritmo POCS (proyecciones sobre conjuntos convexos) utilizado para la reconstrucción de la señal muestreada al azar es la pieza clave: impone:
- Que la señal debe ser de este espectro.
- Que la señal tiene un valor real.
- Lo que sabemos sobre el espectro de la señal (los coeficientes de Fourier muestreados al azar).
- Lo que sabemos sobre la forma de dominio de tiempo de la señal.
El enfoque de muestreo uniforme no intenta imponer la restricción en negrita .
Aquí hay un ejemplo que muestra:
- Arriba a la izquierda: Submuestreo y reconstrucción uniformes utilizando solo la FFT.
- Arriba a la derecha: Submuestreo aleatorio y reconstrucción utilizando solo la FFT.
- Abajo a la izquierda: reconstrucción mediante POCS
Como puede ver, esa restricción final realmente mejora enormemente la reconstrucción.
Código R a continuación
#30219
T <- 128
N <- 5
x <- rep(0, T)
x[sample(T,N)] <- rep(1,N)
X <- fft(x);
Xu <- rep(0, T)
Xu[seq(1,T,4)] <- X[seq(1,T,4)];
xu <- fft(Xu, inverse = TRUE)*4/T;
par(mfrow=c(2,2))
plot(x, type="l", lwd = 5, ylim = c(0,1.2))
lines(abs(xu), col="red")
title('Original (black) & reconstructed\n from uniform undersampling (red)')
Xr <- rep(0,T)
r_ix <- sample(T,T/4)
Xr[r_ix] <- X[r_ix]
xr <- fft(Xr, inverse = TRUE)*4/T
plot(x, type="l", lwd = 5, ylim = c(0,1.2))
lines(abs(xr), col="red")
#lines(Re(xr), col="blue")
#lines(Im(xr), col="green")
title('Original (black) & reconstructed\n from non-uniform undersampling (red)')
#soft thresh function
softThresh <- function(vals_to_threshold, lambda)
{
ix <- which(abs(vals_to_threshold) < lambda)
vals_to_threshold[ix] <- rep(0, length(ix))
ix <- which(vals_to_threshold >= lambda)
vals_to_threshold[ix] <- vals_to_threshold[ix] - lambda
ix <- which(vals_to_threshold <= -lambda)
vals_to_threshold[ix] <- vals_to_threshold[ix] + lambda
return(vals_to_threshold)
}
# POCS
lambda <- 0.1
Xhat <- Xr
for (iteration in seq(1,100))
{
# 1. Compute the inverse FT to get estimate
xhat <- Re(fft(Xhat, inverse = TRUE)/T)
# 2. Apply Softrhesh in the time domain
xhat <- softThresh(xhat, lambda)
# 3. Find the FFT
Xhat <- fft(xhat)
# 4. Enforce known values
Xhat[r_ix] <- X[r_ix]
}
plot(x, type="l", lwd = 5, ylim = c(0,1.2))
lines(xhat, col="red")
title('Reconstructed using POCS')