Построить фазовую структурную функцию фазового экрана по определению - PullRequest
0 голосов
/ 23 мая 2018

У меня уже был фазовый экран (2-D матрица NxN и LxL в масштабе размеров, например: N = 256, L = 2 метра).

Я хотел бы найти функцию фазовой структуры - D (r), определенную как D (delta (r)) = <[x (r) -x (r + delta (r))] ^ 2> (<.> - усреднение по ансамблю, r - положение на фазовом экране в метре, x - значение фазы в точке на фазовом экране, дельта (r) является переменной и не фиксированной) в программе Matlab.Есть ли у вас какие-либо предложения для моей цели?

P / S: Я пытался вычислить D (r) с помощью автокорреляции (определяется как B (r)), но этот расчет все еще остается в некоторых приближениях.Поэтому я хочу точно рассчитать результат D (r).Пожалуйста, посмотрите на это изображение, чтобы лучше понять определения D (r) и B (r) .Ниже приведен код моей функции для расчета B (r).

% Code copied from "Numerical Simulation of Optical Wave Propagation with Examples in Matlab",
% by Jason D. Schmidt, SPIE Press, SPIE Vol. No.: PM199
% listing 3.7, page 48.
% (Schmidt defines the ft2 and ift2 functions used in this code elswhere.)
function D = str_fcn2_ft(ph, mask, delta)
    % function D = str_fcn2_ft(ph, mask, delta)

    N = size(ph, 1);
    ph = ph .* mask;

    P = ft2(ph, delta);
    S = ft2(ph.^2, delta);
    W = ft2(mask, delta);
    delta_f = 1/(N*delta);
    w2 = ift2(W.*conj(W), delta_f);

    D = 2 * ft2(real(S.*conj(W)) - abs(P).^2, delta) ./ w2 .*mask;`



%fire run
N = 256; %number of samples  
L = 16;  %grid size [m]
delta = L/N; %sample spacing [m]
F = 1/L; %frequency-domain grid spacing[1/m]
x = [-N/2 : N/2-1]*delta; 
[x y] = meshgrid(x);
w = 2; %width of rectangle
%A = rect(x/2).*rect(y/w);
A = lambdaWrapped;
%A = phz;
mask = ones(N); 
%perform digital structure function 
C = str_fcn2_ft(A, mask, delta);
C = real(C);

1 Ответ

0 голосов
/ 30 мая 2018

Одним из способов непосредственного вычисления этой функции D (r) является случайная выборка: вы выбираете две случайные точки на экране, определяете их квадрат расстояния и разности фаз и обновляете аккумулятор:

phi = rand(256,256)*(2*pi); % the data, phase

N = size(phi,1); % number of samples  
L = 16;  % grid size [m]
delta = L/N; % sample spacing [m]

D = zeros(1,sqrt(2)*N); % output function
count = D; % for computing mean

for n = 1:1e6 % find a good amount of points here, the more points the better the estimate
   coords = randi(N,2,2);
   r = round(norm(coords(1,:) - coords(2,:)));
   if r<1
      continue % skip if the two coordinates are the same
   end
   d = phi(coords(1,1),coords(1,2)) - phi(coords(2,1),coords(2,2));
   d = mod(abs(d),pi); % you might not need this, depending on how A is constructed
   D(r) = D(r) + d.^2;
   count(r) = count(r) + 1;
end
I = count > 0;
D(I) = D(I) ./ count(I); % do not divide by 0, some bins might not have any samples
I = count < 100;
D(I) = 0; % ignore poor estimates

r = (1:length(D)) * delta;
plot(r,D)

Если вам нужна еще большая точность, подумайте об интерполяции.Вычислить случайные координаты в виде значений с плавающей точкой и интерполировать фазу, чтобы получить значения между выборками.D тогда должно быть длиннее, индексировано как round(r*10) или что-то в этом роде.Вам понадобится гораздо больше случайных выборок, чтобы заполнить этот гораздо больший аккумулятор.

...