0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 function [sol,valorlambda]=restaura_bloque(observado,B,F,M,N,lambdas,criterio_lambda)
0015
0016 M = size(observado,1);
0017
0018 nlamb=length(lambdas);
0019
0020 vectorsol = rand(nlamb*M,M);
0021
0022
0023 [dummy,varianzaruido] = wiener2(observado,[2 2]);
0024
0025
0026 energB = sum(sum(abs(B).^2));
0027
0028 Bconj = conj(B);
0029
0030 BB = B.*Bconj;
0031
0032
0033
0034
0035
0036
0037 operador = formatea_operador(F);
0038
0039 F = operador;
0040
0041 energF = sum(sum(abs(F).^2));
0042
0043
0044
0045 F = sqrt(energB)*F/sqrt(energF);
0046
0047
0048
0049 FF = F.*conj(F);
0050
0051
0052
0053 ang = linspace(0,pi/2,5);
0054 v = [reverse(cos(ang)) ones(1,M-2*5) cos(ang)];
0055 pesos = v'*v;
0056
0057 observado = observado.*pesos + (1-pesos).*mean(mean(observado));
0058
0059
0060
0061
0062 cub=fft2(observado);
0063
0064 espdeg = cub;
0065
0066
0067
0068 x=zeros(nlamb,1);
0069 y=zeros(nlamb,1);
0070
0071
0072 for k=1:nlamb
0073
0074 lambda=lambdas(k);
0075
0076
0077 Hinv=Bconj./( BB + lambda^2*FF);
0078
0079
0080 fftsol = Hinv.*cub;
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 rF = B.*fftsol - cub;
0102
0103 x(k) = norm(rF(:))/M;
0104
0105
0106
0107
0108 pF = F.*fftsol;
0109
0110 y(k)=norm(pF(:))/M;
0111
0112
0113
0114 end
0115
0116
0117
0118
0119 if (nlamb==1)
0120 valorlambda=lambda;
0121 else
0122 valorlambda = seleccion_lambda(x,y,lambdas,varianzaruido,criterio_lambda);
0123 end
0124
0125
0126
0127 distancias = abs(lambdas-valorlambda);
0128 pos = find(distancias==min(distancias));
0129 pos = pos(1);
0130
0131
0132
0133
0134 Hinv=Bconj./( BB + valorlambda^2*FF);
0135
0136
0137
0138
0139 sol=real(ifft2(Hinv.*cub));
0140
0141
0142