Matlab は FFT 変換を実装します

Matlab は FFT 変換を実装します


信号処理では、高速フーリエ変換 (FFT) が非常に一般的な周波数領域解析方法です。この記事では、Matlab を使用して FFT 変換を実装する方法を紹介し、Matlab コードを通じて実際の出力結果を示します。

原理

FFT は、離散フーリエ変換 (DFT) を計算するための高速アルゴリズムです。DFT は時間領域の信号を周波数領域の信号に変換します。これは次の式で表すことができます。

X k = ∑ n = 0 N − 1 xne − i 2 π kn / N X_k=\sum_{n=0}^{N-1}x_n e^{-i2\pi kn/N}バツ=n = 0N 1バツei 2 πkn / N

その中で、xn x_nバツは時間領域の信号シーケンスX k X_kバツは周波数領域の信号シーケンス、kkkは周波数番号です (0 ≤ k < N 0\leq k < N0k<N)、NNNは信号の長さです。

FFT アルゴリズムは、分割統治戦略により DFT アルゴリズムの計算量をO ( N 2 ) O(N^2)から削減します。O ( N2 )O( N log 2 N ) O(Nlog_2N)に縮小O ( Nl o g2N ) を計算することで、コンピューター上で DFT を迅速に計算するという目的が達成されます。

達成

手動検証

ここでは、Matlab を使用して FFT 変換を行う方法を説明する簡単な例を示します。まず単純な配列を生成します。

x = [1, 2, 3, 4, 5, 6, 7, 8];

次に、Matlab の組み込み fft 関数を使用して、この配列に対して FFT 変換を実行します。

X = fft(x);

この演算は、入力配列と同じ長さの複素数の配列を返します。Matlab の disp 関数を使用して、この配列を出力できます。

disp(X);

この例の出力は次のとおりです。

   36.0000 + 0.0000i
   -4.0000 + 9.6569i
   -4.0000 + 4.0000i
   -4.0000 + 1.6569i
   -4.0000 + 0.0000i
   -4.0000 - 1.6569i
   -4.0000 - 4.0000i
   -4.0000 - 9.6569i

ご覧のとおり、出力結果は長さ 8 の複素数の配列です。

FFT の正確さを検証するには、この入力配列の FFT 結果を手動で計算し、その結果を Matlab によって計算された結果と比較します。FFT アルゴリズムの計算プロセスは次の式で表すことができます。

X k = ∑ n = 0 N − 1 xne − i 2 π kn / N X_k=\sum_{n=0}^{N-1}x_n e^{-i2\pi kn/N}バツ=n = 0N 1バツei 2 πkn / N

その中で、xn x_nバツは時間領域の信号シーケンスX k X_kバツは周波数領域の信号シーケンス、kkkは周波数番号です (0 ≤ k < N 0\leq k < N0k<N)、NNNは信号の長さです。

入力配列の場合x = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] x=[1,2,3,4,5,6,7,8]バツ=[ 1 2 3 4 5 6 7 8 ] 、 N = 8 N=8となります。N=したがって、X 0 X_0バツ0計算式は次のとおりです。

X 0 = ∑ n = 0 7 xne − i 2 π 0 n / 8 = 36 X_0 = \sum_{n=0}^{7}x_n e^{-i2\pi 0n/8}=36バツ0=n = 07バツei 2 π 0 n /8=36

次に、 X 1 X_1を計算できます。バツ1

X 1 = ∑ n = 0 7 xne − i 2 π 1 n / 8 = − 4 + 9.6569 i X_1 = \sum_{n=0}^{7}x_n e^{-i2\pi 1n/8}=- 4+9.6569iバツ1=n = 07バツei 2 π 1 n /8=−4 _+9.6569i _

類推により、すべてのX k X_kを計算できます。バツ最終結果は、Matlab によって計算された結果と一致する必要があります。

単純な FFT 変換とスペクトル

以下は、FFT 変換を実装するための簡単な Matlab コードです。

% 生成测试信号
Fs = 1000;      % 采样频率
t = 0:1/Fs:1-1/Fs;   % 时间向量
x = 1*sin(2*pi*100*t); % 信号

% 绘制信号图
subplot(2,1,1);
plot(t,x);
title('信号');
xlabel('时间 (s)');
ylabel('幅度');

% 计算FFT
N = length(x);
X = fft(x);
f = Fs*(0:(N/2))/N;

% 绘制FFT图
subplot(2,1,2);
plot(f,abs(X(1:N/2+1)));
title('FFT');
xlabel('频率 (Hz)');
ylabel('幅度');

画像-20230308202228276

この例では、周波数 100Hz の正弦波信号を生成しました。Matlab の fft 関数を使用して FFT を計算し、結果を振幅スペクトルとしてプロットします。FFT アルゴリズムの出力は対称であるため、振幅スペクトルをプロットするときは、周波数の正の半分のみをプロットすることに注意してください。

パワースペクトルを見つける

信号の振幅スペクトルは FFT 変換を通じて取得できますが、信号の特性をよりよく理解するには、通常、信号のパワー スペクトル密度を取得する必要があります。パワー スペクトル密度は、さまざまな周波数での信号のパワー分布を表します。

パワー スペクトルを求める方法は、信号を FFT 変換し、各周波数の振幅の 2 乗を信号の長さで除算し、それに係数を乗じてパワー スペクトル密度を求めます。具体的な式は次のとおりです。

P k = 2 ∣ X k ∣ 2 N P_k=\frac{2|X_k|^2}{N}P=N2∣X _2

その中で、P k P_kPは周波数kkですk 、 X k X_kのパワー スペクトル密度バツは周波数kkですk 、 NNの信号振幅Nは信号の長さです。

以下は、パワー スペクトルを取得するための簡単な Matlab コードです。

% 生成测试信号
Fs = 1000;      % 采样频率
t = 0:1/Fs:1-1/Fs;   % 时间向量
x = 1*sin(2*pi*100*t); % 信号

% 绘制信号图
subplot(2,1,1);
plot(t,x);
title('信号');
xlabel('时间 (s)');
ylabel('幅度');

% 计算FFT
N = length(x);
X = fft(x);
f = Fs*(0:(N/2))/N;

% 计算功率谱
P = (2*abs(X(1:N/2+1)).^2)/N;

% 绘制功率谱图
subplot(2,1,2);
plot(f,P);
title('功率谱密度');
xlabel('频率 (Hz)');
ylabel('功率');

画像-20230308201245085

パワー スペクトルを計算するときは、係数2 2を使用することに注意してください。これは、実際には信号のパワー スペクトルが対称であるにもかかわらず、周波数の正の半分のみをプロットしているためです。

結論は

この記事では、Matlab を使用して FFT 変換を実装し、信号のパワー スペクトル密度を計算する方法を紹介します。FFT 変換を通じて、信号を時間領域から周波数領域に変換し、信号の特性をさらに理解することができます。

おすすめ

転載: blog.csdn.net/qq_34022877/article/details/129410817