Нормализация Matlab FFT2 после обработки

Я пытаюсь понять, как работает нормализация MATLAB FFT.

Давайте обсудим следующий пример.

%%
sum2D = @(a) sum(reshape(a,1,[]));             % sum elements in 2D matrix

a = [0 0 0; 1 2 1; 1 1 1; 1 1 1; 0 0 0]

f1 = fft2(a)

m = [0 32 0; 0 0 0; 0 1 0; 0 2 0; 0 0 0]

fs = m.*fftshift(f1);
fs = fs./sqrt(numel(fs));

fm = ifft2(fs);
fm = fm.*sqrt(numel(fm))

% imshow(abs(fs))

norm(a(:))^2,norm(fs(:))^2,norm(fm(:))^2

sum2D(abs(a).^2)
sum2D(abs(fs).^2)
sum2D(abs(fm).^2)
sum2D(abs(fp).^2)

Если m = 1, нормализация работает, и энергия одинакова в исходном сигнале, fft и обратном fft. Но если я умножу сигнал после выполнения fft на некоторый вектор m, то я не знаю, как это снова нормализовать.

Должна ли энергия измениться после умножения на м, или я что-то не так делаю.


person bordart    schedule 22.01.2016    source источник


Ответы (1)


Да, умножение частот на матрицу m меняет энергию. Вы усилили одни частоты и убили другие: это вполне может сделать сигнал сильнее или слабее. В качестве простого примера предположим, что m имеет все элементы, равные 2: затем вы удваиваете сигнал, умножая его энергию на 4. Для общего множителя m влияние на энергию будет зависеть от того, что представляет собой сигнал.

Если вы действительно хотите, чтобы fm имел ту же энергию, что и a, просто сделайте так:

fm = fm*norm(a(:))/norm(fm(:));

Чтобы напрямую ответить «как работает нормализация БПФ»: применение fft2 умножает энергию на количество элементов матрицы. Функция ifft2, обратная fft2, делит энергию на количество элементов. Итак, если вы используете ifft2 после fft2 и не заботитесь о промежуточных результатах, таких как fs, вам не нужно выполнять какое-либо деление или умножение на sqrt(numel(...)).

person Community    schedule 23.01.2016