二维傅里叶变换的矩阵表示的理论可以参考以下博客或文章:
二维傅立叶变换矩阵
离散傅立叶变换的矩阵表示
可以通过编程实现矩阵表示,但是运算量很大。
我这里用MATLAB自带的dftmtx函数实现。
dftmtx()函数——离散傅立叶变换矩阵
句法
a = dftmtx(n);
n — 离散傅立叶变换长度,正整数
a = dftmtx(n) 返回一个 n-by- n复杂离散傅立叶变换矩阵。
对于列向量 x的傅立叶变换如下:
y = dftmtx(n)* x
与y = fft(x,n)相同。
离散傅里叶逆变换矩阵由正变换矩阵求共轭转置并除以系数而来,如下:
ainv = conj(dftmtx(n))‘ / n
用FFT计算离散傅里叶变换比使用DFT矩阵更有效。FFT还使用较少的内存。这两个过程给出相同的结果。
实际上,dftmtx函数是由fft(eye(n))实现的。
如:dftmtx(16) 与 fft(eye(16)) 等价。
一维傅立叶变换实例:
clear all;clc;
N = 512;
t = [0: N-1];
f = cos(2*pi/256*t) + sin(3*pi/128*t);
Psi = fft(eye(N)); %正变换
iPsi = conj(fft(eye(N)))' / N; %反变换
F1 = fft(f);
F2 = Psi * f';
f1 = iPsi * F1';
F3 = dftmtx(N) * f'; %正变换
figure('name', '两种频谱计算方法对比');
subplot(2,2,1);plot(real(F1));title('FFT');
subplot(2,2,2);plot(real(F2));title('相乘计算结果');
subplot(2,2,3);plot(f);title('原信号');
subplot(2,2,4);plot(real(f1));title('相乘反变换结果');
结果对比:
二维傅立叶变换实例:
P = peaks(20);
X = repmat(P,[5 10]);
P = dftmtx(100);
iP = conj(fft(eye(100)));
Q = dftmtx(200);
iQ = conj(fft(eye(200)));
Y = fft2(X); %正变换
x = ifft2(Y); %反变换
Y1 = P * X * Q; %相乘正变换
x1 = iP * Y1 * iQ / (100 * 200); %相乘反变换
figure;
subplot(2,2,1);imagesc(X);title('图像');
subplot(2,2,2);imagesc(abs(fftshift(Y))); title('FFT2D');
subplot(2,2,3);imagesc(abs(fftshift(Y1)));title('相乘正变换');
subplot(2,2,4);imagesc(real(x));title('相乘反变换');
结果对比: