Estou tentando fazer com que conv(x, k, 'same')
o resultado seja igual ao FFT
. Mas percebo que isso só funciona para o shape full
e não para o same
.
% Create vector and kernel
x = randn(1, 100);
k = randn(1, 10);
% Do 1D conv
y_conv = conv(x, k, 'full');
% Do 1D FFT
N = length(x) + length(k) - 1;
X = fft(x, N);
K = fft(k, N);
Y_fft = ifft(X .* K);
% Compare
max_diff = max(abs(y_conv - Y_fft));
disp(['The maximal difference is: ' num2str(max_diff)]);
A razão pela qual eu quero ter same
é porque meus dados de saída precisam ser iguais aos dados de entrada.
Pergunta:
O que precisa ser feito/alterado para que o resultado da FFT seja igual ao conv(x, k, 'same')
?
Blocos “mesmos” com zeros. Você precisa preencher sua entrada com pelo menos
K-1
zeros (se o seu kernel tiver lengthK
), depois fazer a convolução FFT e, finalmente, cortar o resultado no tamanho esperado.fft(x, N)
almofadas com zeros à direita quandoN > length(x)
. Então você precisará cortar da direita. Mas devido à forma comofft(k, N)
funciona, a origem do kernel está na primeira amostra, e não no meio como assumido por “mesmo”. Portanto, o resultado é alterado. Portanto, você também precisará remover algumas amostras do lado esquerdo, provavelmente(K-1)/2
amostras consideradasK
ímpares.