ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

fft

構文

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

説明

Y = fft(X) は高速フーリエ変換 (FFT) アルゴリズムを使用して、X離散フーリエ変換 (DFT) を計算します。

  • X がベクトルの場合、fft(X) はそのベクトルのフーリエ変換を返します。

  • X が行列の場合、fft(X) は、X の列をベクトルとして扱い、各列のフーリエ変換を返します。

  • X が多次元配列の場合、fft(X) は、サイズが 1 ではない最初の配列次元に沿った値をベクトルとして扱い、各ベクトルのフーリエ変換を返します。

Y = fft(X,n)n 点の DFT を返します。値を指定しない場合、Y のサイズは X と同じです。

  • X がベクトルであり、X の長さが n より短い場合、n の長さになるように X の末尾をゼロで埋めます。

  • X がベクトルであり、X の長さが n を超える場合、X が長さ n で切り捨てられます。

  • X が行列の場合、各列はベクトルの場合と同様に扱われます。

  • X が多次元配列の場合、サイズが 1 でない最初の配列次元がベクトルの場合と同様に扱われます。

Y = fft(X,n,dim) は、次元 dim に沿ったフーリエ変換を返します。たとえば、X が行列の場合、fft(X,n,2) は、各行の n 点のフーリエ変換を返します。

すべて折りたたむ

フーリエ変換を使用して、ノイズに埋もれた信号の周波数成分を求めます。

信号のパラメーターとして、サンプリング周波数 1 kHz、信号の持続期間 1.5 秒を指定します。

Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

50 Hz、振幅 0.7 の正弦波と 120 Hz、振幅 1 の正弦波で信号を構成します。

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

平均値 0、分散 4 のホワイト ノイズで信号を乱します。

X = S + 2*randn(size(t));

ノイズを含む信号を時間領域にプロットします。信号 X(t) を見て周波数成分を特定することは困難です。

plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

信号のフーリエ変換を計算します。

Y = fft(X);

両側スペクトル P2 を計算します。次に、P2 および偶数の信号長 L に基づいて、片側スペクトル P1 を計算します。

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

周波数領域 f を定義し、片側振幅スペクトル P1 をプロットします。ノイズを追加したため、予期したとおり、振幅は正確に 0.7 と 1 にはなりません。平均的に、信号が長くなるほど周波数がよりよく近似されます。

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

ここで、ノイズを含まない元の信号のフーリエ変換を計算すると、正確な振幅 0.7 と 1.0 が得られます。

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1) 
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

ガウス パルスを時間領域から周波数領域に変換します。

信号のパラメーターとガウス パルス X を定義します。

Fs = 100;           % Sampling frequency
t = -0.5:1/Fs:0.5;  % Time vector 
L = length(t);      % Signal length

X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));

パルスを時間領域にプロットします。

plot(t,X)
title('Gaussian Pulse in Time Domain')
xlabel('Time (t)')
ylabel('X(t)')

関数 fft を使用して信号を周波数領域に変換するには、まず新しい入力長として、元の信号長の次の 2 のべき乗を指定します。これにより、fft のパフォーマンスを向上するために、信号 X の末尾がゼロで埋められます。

n = 2^nextpow2(L);

ガウス パルスを周波数領域に変換します。

Y = fft(X,n);

周波数領域を定義し、固有周波数をプロットします。

f = Fs*(0:(n/2))/n;
P = abs(Y/n);

plot(f,P(1:n/2+1)) 
title('Gaussian Pulse in Frequency Domain')
xlabel('Frequency (f)')
ylabel('|P(f)|')

時間領域および周波数領域で複数の余弦波を比較します。

信号のパラメーターとして、サンプリング周波数 1 kHz、信号の持続期間 1 秒を指定します。

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector

周波数がスケーリングされた余弦波を各行が表す行列を作成します。その結果の X は 3 行 1000 列の行列です。1 行目の波の周波数は 50、2 行目の波の周波数は 150、3 行目の波の周波数は 300 です。

x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row wave

X = [x1; x2; x3];

X の各行の最初から 100 個の要素を順番に 1 つの Figure にプロットし、それらの周波数を比較します。

for i = 1:3
    subplot(3,1,i)
    plot(t(1:100),X(i,1:100))
    title(['Row ',num2str(i),' in the Time Domain'])
end

アルゴリズムのパフォーマンスのために、fft の入力の末尾をゼロで埋めることができます。この場合、X の各行の長さが現在の長さの次に大きい 2 のべき乗になるように、各行をゼロで埋めます。関数 nextpow2 を使用して新しい長さを定義します。

n = 2^nextpow2(L);

X の行に沿って、つまり、各信号に対して fft を使用するように引数 dim を指定します。

dim = 2;

信号のフーリエ変換を計算します。

Y = fft(X,n,dim);

各信号の両側スペクトルと片側スペクトルを計算します。

P2 = abs(Y/L);
P1 = P2(:,1:n/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);

1 つの Figure 内で、周波数領域に各行の片側振幅スペクトルをプロットします。

for i=1:3
    subplot(3,1,i)
    plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))
    title(['Row ',num2str(i),' in the Frequency Domain'])
end

入力引数

すべて折りたたむ

入力配列。ベクトル、行列または多次元配列として指定します。

X が 0 行 0 列の空の行列である場合、fft(X) は 0 行 0 列の空の行列を返します。

データ型: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
複素数のサポート: あり

変換の長さ。[] または非負の整数スカラーとして指定します。変換の長さとして正の整数スカラーを指定すると、fft のパフォーマンスが向上することがあります。長さは通常 2 のべき乗、あるいは小さい素数の積に因数分解可能な値です。n が信号の長さ未満である場合、fftn 番目の要素から後の残りの信号値を無視し、切り捨て後の結果を返します。n0 の場合、fft は空の行列を返します。

例: n = 2^nextpow2(size(X,1))

データ型: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

演算の対象の次元。正の整数のスカラーとして指定します。値を指定しない場合、既定値は、サイズが 1 ではない最初の配列の次元です。

  • fft(X,[],1)X の列に沿って演算し、各列のフーリエ変換を返します。

  • fft(X,[],2)X の行に沿って演算し、各行のフーリエ変換を返します。

dimndims(X) よりも大きい場合、fft(X,[],dim)X を返します。n が指定された場合、fft(X,n,dim) は次元 dim に沿って埋め込みまたは切り捨てを行うことにより、X を長さ n にします。

データ型: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

出力引数

すべて折りたたむ

周波数領域の表現。ベクトル、行列または多次元配列として返されます。

X の型が single である場合、fft はネイティブ レベルの単精度で計算し、Y の型も single になります。それ以外の場合、Ydouble 型として返されます。

Y のサイズは次のとおりです。

  • Y = fft(X) または Y = fft(X,[],dim) の場合、Y のサイズは X のサイズに等しくなります。

  • Y = fft(X,n,dim) の場合、size(Y,dim) の値は n に等しくなりますが、その他すべての次元のサイズは X と同じままです。

X が実数の場合、Y は共役対称になり、Y の特異点の数は ceil((n+1)/2) になります。

データ型: double | single

詳細

すべて折りたたむ

ベクトルの離散フーリエ変換

Y = fft(X) はフーリエ変換、X = ifft(Y) は逆フーリエ変換の実装です。長さ nX および Y の変換は、次式で定義されます。

Y(k)=j=1nX(j)Wn(j1)(k1)X(j)=1nk=1nY(k)Wn(j1)(k1),

ここで、

Wn=e(2πi)/n

は 1 の n 乗根の 1 つです。

ヒント

  • 関数 fft の実行時間は、変換する長さに依存します。変換の長さが小さい素因数のみからなる場合、素数または大きい素因数からなる場合よりもかなり速くなります。

  • ほとんどの n の値について、実数入力 DFT の計算時間は複素数入力 DFT の約半分になります。ただし、n が大きな素因数をもつ場合、速度の差はほとんどありません。

  • ユーティリティ関数 fftw を使用して、fft の処理速度を向上できます。この関数は、特定のサイズと次元をもつ FFT の計算に使用されるアルゴリズムの最適化を制御します。

アルゴリズム

FFT 関数 (fftfft2fftnifftifft2ifftn) は、FFTW [1][2] と呼ばれるライブラリに基づいています。

参照

[2] Frigo, M., and S. G. Johnson. “FFTW: An Adaptive Software Architecture for the FFT.” Proceedings of the International Conference on Acoustics, Speech, and Signal Processing. Vol. 3, 1998, pp. 1381-1384.

拡張機能

参考

| | | |

トピック

R2006a より前に導入