Когда и как сделать заполнение нулями для дискретной свертки? - PullRequest
0 голосов
/ 21 марта 2019

Я хочу взять дискретную свертку двух одномерных векторов.Векторы соответствуют данным об интенсивности в зависимости от частоты.Моя цель состоит в том, чтобы взять свертку одного вектора интенсивности B с собой, а затем взять свертку результата с исходным вектором B и т. Д., Каждый раз получая свертку результата с исходным вектором B. Я хочу получить окончательный результат.длина результата равна исходному вектору B.

Я начинаю с кода в IDL, который пытаюсь изменить в MATLAB.Соответствующая часть кода гласит:

for i=1,10 do begin
if i lt 2 then A=B else A=Rt
n=i+1
Rt=convol(A,B,s,center=0,/edge_zero)
...
endfor

, который я переписал в MATLAB

for i = 2:11
    if i < 3
        A = B; % indices start at 0, not 1
    else
        A = Rt;
    end
    n = i + 1;

    % Scale by 1/s
    Rt = (1/s).*conv(A,B);
    ...
end

Но я не уверен, как включить заполнение нулями, использующее параметр edge_zero .В IDL свертка вычисляет значения элементов на краю вектора, как если бы вектор был дополнен нулями.Необязательный третий параметр для функции свертки в MATLAB включает в себя параметр «same», который возвращает центральную часть свертки того же размера, что и u для conv (u, v), но это не является правильным способом.об этой проблеме.Как сделать аналогичное заполнение нулями в MATLAB?

1 Ответ

0 голосов
/ 23 марта 2019

Вот код, который мне нужен для моего докторского исследования, которое, как я знаю, правильно выполняет заполнение нулями.Надеюсь, это поможет.

function conv_out=F_convolve_FFT(f,g,dw,flipFlag),
 if(nargin<4), flipFlag==0; end;

 % length of function f to be convolved, initialization of conv_out, and padding p
 N=length(f); conv_out=zeros(1,N); p=zeros(1,N);

 % uncomment if working with tensor f,g's of rank 3 or greater
 % f=F_reduce_rank(f); g=F_reduce_rank(g);

 % padding. also, this was commented out: EN=length(fp);
 fp = [f p]; gp = [g p];

 % if performing convolution of the form c(w) = int(f(wp)g(w+wp),wp) = int(f(w-wp)gbar(wp),wp) due to reverse-order domain on substitution
 if(flipFlag==1), gp=fliplr(gp); end;

 % perform the convolution. You do NOT need to multiply the invocation of "F_convolve_FFT(f,g,dw,flipFlag)" in your program by "dx", the finite-element.
 c1 = ifft(fft(fp).*fft(gp))*dw;

 % if performing "reverse" convolution, an additional circshift is necessary to offset the padding
 if(flipFlag==1), c1=circshift(c1',N)'; end;

 % offset the padding by dNm
 if(mod(N,2)==0), dNm=N/2; elseif(mod(N,2)==1), dNm=(N-1)/2; end;

 % padding. also, this was commented out: EN=length(fp);
 conv_out(:)=c1(dNm+1:dNm+N);

return
...