处理后的Matlab FFT2归一化
Matlab FFT2 normalization after processing
我正在尝试了解 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后有变化,还是我做错了。
是的,将频率乘以矩阵 m
会改变能量。您放大了一些频率并杀死了其他频率:这很可能会使信号变强或变弱。举个简单的例子,假设 m
的所有条目都等于 2:然后将信号加倍,将其能量乘以 4。对于一般乘数 m
,对能量的影响将取决于信号群岛
如果你真的想让fm
拥有和a
一样的能量,就这样吧:
fm = fm*norm(a(:))/norm(fm(:));
直接回答"how FFT normalization works":应用fft2
将能量乘以矩阵的元素数。函数 ifft2
是 fft2
的反函数,它用能量除以元素数。因此,如果您在 fft2
之后使用 ifft2
并且不关心 fs
等中间结果,则不需要对 sqrt(numel(...))
进行任何除法或乘法运算.
我正在尝试了解 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后有变化,还是我做错了。
是的,将频率乘以矩阵 m
会改变能量。您放大了一些频率并杀死了其他频率:这很可能会使信号变强或变弱。举个简单的例子,假设 m
的所有条目都等于 2:然后将信号加倍,将其能量乘以 4。对于一般乘数 m
,对能量的影响将取决于信号群岛
如果你真的想让fm
拥有和a
一样的能量,就这样吧:
fm = fm*norm(a(:))/norm(fm(:));
直接回答"how FFT normalization works":应用fft2
将能量乘以矩阵的元素数。函数 ifft2
是 fft2
的反函数,它用能量除以元素数。因此,如果您在 fft2
之后使用 ifft2
并且不关心 fs
等中间结果,则不需要对 sqrt(numel(...))
进行任何除法或乘法运算.