MATLAB - 快速傅里叶变换



快速傅里叶变换 (FFT) 是一种广泛应用于信号处理和其他领域的数学算法,用于高效计算离散傅里叶变换 (DFT) 及其逆变换。DFT 将信号从其原始域(通常是时间或空间)转换为频域表示。

快速傅里叶变换相对于标准 DFT 的主要优势在于其速度。标准 DFT 算法的计算复杂度为 O(N^2),其中 N 是信号中的样本数,而 FFT 将其降低到 O(N log N),对于大型数据集而言速度快得多。

使用 Matlab 中的 fft() 函数进行快速傅里叶变换

MATLAB 中的 fft() 函数用于计算信号的快速傅里叶变换 (FFT)。它以表示时域信号的向量作为输入,并返回表示频域信号的向量。

语法

Y = fft(X)
Y = fft(X,n)
Y = fft(X,n,dim)

语法解释

Y = fft(X) − MATLAB 中的函数计算信号的傅里叶变换。如果提供向量,则计算该向量的变换。如果提供矩阵,则计算矩阵每一列的变换。对于多维数组,它将沿第一个非单一维度上的值视为向量,并计算每个向量的变换。

Y = fft(X,n) − MATLAB 中的 fft() 函数可以计算特定长度的傅里叶变换,称为 n 点 DFT。

如果提供的向量 X 短于 n,则会在 X 的末尾添加零,使其长度为 n。如果 X 长于 n,则会截断多余的值。

如果 X 是矩阵,则它将每一列视为向量进行处理。

对于多维数组,它将第一个非单一维度视为向量。

Y = fft(X,n,dim) − MATLAB 中的 fft() 函数可以沿矩阵或多维数组的特定维度计算傅里叶变换。例如,如果您有一个矩阵 X 并使用 fft(X,n,2),它将计算矩阵每一行的 n 点傅里叶变换。

让我们来看一些上面解释的语法的示例。

示例 1:可视化简单输入信号的傅里叶变换

我们的代码如下所示:

x = [0, 1, 0, -1];
Y = fft(x);

% Plotting
figure;

subplot(2,1,1);
stem(x);
title('Input Signal');
xlabel('Time');
ylabel('Amplitude');

subplot(2,1,2);
stem(abs(Y));
title('Magnitude of Fourier Transform');
xlabel('Frequency');
ylabel('Magnitude');

在这个示例中,我们有一个简单的输入信号 x,由向量 [0, 1, 0, -1] 表示。

fft(x) 函数使用快速傅里叶变换 (FFT) 算法计算输入信号 x 的离散傅里叶变换 (DFT)。结果存储在变量 Y 中。

计算傅里叶变换后,我们创建一个图形来绘制输入信号及其傅里叶变换以进行可视化。

在第一个子图 (subplot(2,1,1)) 中,我们使用 stem() 函数绘制时域中的输入信号 x。x 轴表示时间,y 轴表示信号的幅度。

在第二个子图 (subplot(2,1,2)) 中,我们使用 abs() 函数计算傅里叶变换 Y 的幅度,因为傅里叶变换可能具有复数值。然后我们使用 stem() 绘制傅里叶变换的幅度。这里,x 轴表示频率,y 轴表示傅里叶系数的幅度。

执行后的输出如下所示:

示例 2:使用矩阵进行快速傅里叶变换

我们的代码如下:

X = [1, 2, 3; 4, 5, 6; 7, 8, 9];
Y = fft(X);

% Plotting
figure;

subplot(2,1,1);
stem(X(:));
title('Input Matrix (Vectorized)');
xlabel('Index');
ylabel('Value');

subplot(2,1,2);
stem(abs(Y(:)));
title('Magnitude of Fourier Transform (Vectorized)');
xlabel('Frequency Index');
ylabel('Magnitude');

在这个示例中,第一个子图显示输入矩阵 X(向量化),其中矩阵元素沿 x 轴,其值在 y 轴上。第二个子图显示矩阵(向量化)的傅里叶变换 Y 的幅度,其中频率索引在 x 轴上,傅里叶系数的幅度在 y 轴上。

执行后的输出如下所示:

示例 3:使用语法 Y = fft(x,n) 进行快速傅里叶变换

我们的代码如下所示:

x = [0, 1, 0, -1];
n = 8; % Desired length of the Fourier transform
Y = fft(x, n);

% Plotting
figure;

subplot(2,1,1);
stem(x);
title('Input Signal');
xlabel('Time');
ylabel('Amplitude');

subplot(2,1,2);
stem(abs(Y));
title('Magnitude of Fourier Transform (n-point DFT)');
xlabel('Frequency');
ylabel('Magnitude');

在这个示例中,我们有一个向量 x 代表我们的输入信号。我们想使用语法 Y = fft(x, n) 计算 x 的 8 点离散傅里叶变换 (DFT)。

由于 x 的长度为 4,短于 n (8),MATLAB 会在 x 的末尾添加零,使其长度为 8,然后再计算傅里叶变换。

计算傅里叶变换后,我们创建一个图形来绘制输入信号及其傅里叶变换以进行可视化。

在第一个子图 (subplot(2,1,1)) 中,我们使用 stem() 函数绘制时域中的输入信号 x。x 轴表示时间,y 轴表示信号的幅度。

在第二个子图 (subplot(2,1,2)) 中,我们使用 abs() 函数计算傅里叶变换 Y 的幅度,因为傅里叶变换可能具有复数值。然后我们使用 stem() 绘制傅里叶变换的幅度。这里,x 轴表示频率,y 轴表示傅里叶系数的幅度。

执行后的输出如下所示:

示例 4:矩阵每一行的傅里叶变换

我们的代码如下所示:

X = [1, 2, 3; 4, 5, 6];

% Compute the 4-point Fourier transform of each row
n = 4; % Desired length of the Fourier transform
Y = fft(X, n, 2);

% Display the result
disp('Matrix X:');
disp(X);
disp('Fourier Transform of Each Row (n-point DFT):');
disp(Y);

在这个代码中,我们首先定义一个有两行的矩阵 X,其中每一行代表不同的信号。然后我们使用 fft(X, n, 2) 计算 X 每一行的 4 点傅里叶变换,其中 n 是傅里叶变换的所需长度。最后,我们显示原始矩阵 X 和每一行的傅里叶变换。

代码执行后的输出如下所示:

X = [1, 2, 3; 4, 5, 6];

% Compute the 4-point Fourier transform of each row
n = 4; % Desired length of the Fourier transform
Y = fft(X, n, 2);

% Display the result
disp('Matrix X:');
disp(X);
disp('Fourier Transform of Each Row (n-point DFT):');
disp(Y);

Matrix X:
     1     2     3
     4     5     6

Fourier Transform of Each Row (n-point DFT):
   6.0000 + 0.0000i  -2.0000 - 2.0000i   2.0000 + 0.0000i  -2.0000 + 2.0000i
  15.0000 + 0.0000i  -2.0000 - 5.0000i   5.0000 + 0.0000i  -2.0000 + 5.0000i
广告