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
廣告
© . All rights reserved.