Matlab FFT2处理后归一化

时间:2016-01-22 13:59:25

标签: matlab fft normalization ifft

我试图了解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,那么我就不知道如何再次将其归一化。

在与m相乘后能量是否会发生变化,或者我做错了什么。

1 个答案:

答案 0 :(得分:1)

是的,将频率乘以矩阵m会改变能量。你放大了一些频率并杀死了其他频率:这可能会使信号更强或更弱。举一个简单的例子,假设m所有条目都等于2:那么你将信号加倍,将其能量乘以4.对于一般乘数m,对能量的影响将取决于信号是。

如果你真的希望fm具有与a相同的能量,那么就这样做:

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

直接回答“FFT规范化的工作原理”:应用fft2将能量乘以矩阵的元素数。函数ifft2fft2的倒数,它将能量除以元素的数量。因此,如果您在ifft2之后使用fft2并且不关心fs等中间结果,则无需按sqrt(numel(...))进行任何除法或乘法运算。