3.2.4. 傅立叶变换矩阵

概念与内涵

由上一节知, 傅里叶变换为线性变换, 傅里叶变换矩阵可以通过对单位矩阵做傅里叶变换得到.

一维傅里叶变换矩阵

变换矩阵推导

将零频率分量移到频谱中心

由于Matlab, Numpy等工具中的 fft() 函数未将零频率分量移到频谱中心, 这里讨论如何通过 fft() 函数得到二维傅里叶变换矩阵.

设有一维信号 \({\bm x}=[x_0, x_2, \cdots, x_{N-1}]^T\), 记一维傅里叶变换矩阵为 \({\bm F}∈{\mathbb C}^{N×N}\)

二维傅里叶变换矩阵

变换矩阵推导

二维傅里叶变换相当于对数据依次进行两个维度的傅里叶变换, 因此其变换矩阵也分为两部分.

将零频率分量移到频谱中心

由于Matlab, Numpy等工具中的 fft() 函数未将零频率分量移到频谱中心, 这里讨论如何通过 fft() 函数得到二维傅里叶变换矩阵.

FFT 线性变换验证实验

一维傅里叶变换矩阵实验

本实验验证一维 FT 变换为线性变换, 即可以通过矩阵乘法实现, 实验中仿真信号为正弦信号 \(A{\sin }(2πF_c t)\), 其中 \(F_c\) 为频率,:math:t 为时间, \(A\) 为幅度, 实验中设置 \(A=3\), \(F_c=100Hz\), 设置采样率 \(F_s= 1000Hz\), 采样时间为 \(T_s = 0.5s\). 从而采样点数为 \(N_s=500\), 对单位矩阵 \({\bm I}∈ {\mathbb R}^{N_s×N_s}\) 做傅里叶变换得到傅里叶变换矩阵, 与信号相乘即将信号变换到频域.

代码 3.2 1DFT with matrix multiplication
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Ts = 0.5;
Fs = 1000;
Fc = 100;

A = 3;
Ns = uint32(Fs * Ts);
t = linspace(0, Ts, Ns)';
x = A * sin(2*pi*Fc*t);
f = linspace(-Fs/2.0, Fs/2.0, Ns);

y1 = fft(fftshift(x));
y1 = fftshift(fft(x));

I = eye(Ns);
M = fftshift(fft(I));
y2 = M * x;

residual = abs(y1- y2);

figure(1)
subplot(221)
plot(t, x)
xlabel('time/s')
ylabel('amplitude')
title('Orignal signal')
grid on

subplot(222)
plot(f, residual)
xlabel('time/s')
ylabel('amplitude')
title('Residual of 1D-FT results')
grid on

subplot(223)
plot(f, abs(y1))
xlabel('frequency/Hz')
ylabel('amplitude')
title('1D-FT results with matlab''s function fft')
grid on

subplot(224)
plot(f, abs(y2))
xlabel('frequency/Hz')
ylabel('amplitude')
title('1D-FT results with matrix multiplication')
grid on
1D-FT with matrix multiplication

图 3.9 1D-FT with matrix multiplication

1D-FT with matrix multiplication

二维傅里叶变换矩阵实验

本实验验证二维 FT 变换为线性变换, 即可以通过矩阵乘法实现, 实验中信号为图像, 对单位矩阵 \({\bm I}∈ {\mathbb R}^{N_s×N_s}\) 的行和列分别做傅里叶变换得到行和列上的傅里叶变换矩阵, 与信号相乘即将信号变换到频域.

代码 3.3 2D FT with matrix multiplication
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
clear all
close all

X = imread('lighthouse.png');
% X = imread('cameraman.tif');
X = double(X(:, :, 1));

[H, W] = size(X);

Y1 = fftshift(fft(fftshift(X, 1), [], 1), 1);
Y1 = fftshift(fft(fftshift(Y1, 2), [], 2), 2);

MH = fftshift(fft(fftshift(eye(H), 2), [], 1), 1);
MW = fftshift(fft(fftshift(eye(W), 1), [], 2), 2);

Y2 = MH * X;
Y2 = Y2 * MW;

residual = abs(Y1- Y2);

figure(1)
subplot(221)
imagesc(X)
title('Orignal signal')
colorbar();

subplot(222)
imagesc(residual)
title('Residual of 2D-FT results')
colorbar();

subplot(223)
imagesc(20*log10(abs(Y1)))
title('2D-FT results with matlab''s function fft')
colorbar();

subplot(224)
imagesc(20*log10(abs(Y2)))
title('2D-FT results with matrix multiplication')
colorbar();
2D-FT with matrix multiplication

图 3.10 2D-FT with matrix multiplication

2D-FT with matrix multiplication