2016-01-22 2 views
0

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

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

%% 
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) 

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

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

ответ

1

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

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

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

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