Ý tưởng chính là phương pháp lấy mẫu ngẫu nhiên thực thi nhiều ràng buộc hơn đối với tín hiệu kết quả so với phương pháp lấy mẫu thống nhất.
Thuật toán POCS (chiếu lên các bộ lồi) được sử dụng để tái tạo tín hiệu được lấy mẫu ngẫu nhiên là phần chính: nó thực thi:
- Đó là tín hiệu phải từ phổ này.
- Đó là tín hiệu có giá trị thực.
- Những gì chúng ta biết về phổ của tín hiệu (các hệ số Fourier được lấy mẫu ngẫu nhiên).
- Những gì chúng ta biết về hình thức miền thời gian của tín hiệu.
Phương pháp lấy mẫu thống nhất làm cho không có nỗ lực để thực thi các ràng buộc táo bạo .
Đây là một ví dụ cho thấy:
- Trên cùng bên trái: Lấy mẫu và tái cấu trúc thống nhất chỉ sử dụng FFT.
- Trên cùng bên phải: Lấy mẫu ngẫu nhiên và tái cấu trúc chỉ sử dụng FFT.
- Dưới cùng bên trái: Tái thiết bằng POCS
Như bạn có thể thấy, ràng buộc cuối cùng đó thực sự cải thiện việc tái thiết một cách mạnh mẽ.
Mã R bên dưới
#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')