Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

dsp.FFT

説明

dsp.FFT System object™ は、高速フーリエ変換 (FFT) を使用して入力の離散フーリエ変換 (DFT) を計算します。オブジェクトは、入力が実数/複素数のどちらであるか、また、出力が線形順とビット反転順のどちらであるかに応じて、次の 1 つ以上の高速フーリエ変換 (FFT) アルゴリズムを使用します。

  • double 信号のアルゴリズム

  • 半分長のアルゴリズム

  • 基数 2 の時間間引き (DIT) アルゴリズム

  • 基数 2 の周波数間引き (DIF) アルゴリズム

  • FFTW から選択されたアルゴリズム [1][2]

入力の DFT を計算する方法は次のとおりです。

  1. dsp.FFT オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

ft = dsp.FFT は、N 次元配列の DFT を計算する FFT オブジェクト ft を返します。列ベクトルまたは多次元配列の場合、FFT オブジェクトは最初の次元に沿って DFT を計算します。入力が行ベクトルである場合、FFT オブジェクトは単一サンプルの DFT の行を計算し、警告を表示します。

ft = dsp.FFT(Name,Value) は、指定した各プロパティが指定の値に設定された FFT オブジェクトを返します。各プロパティ名を一重引用符で囲みます。指定していないプロパティは既定値になります。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

FFT に使用する実装を AutoRadix-2FFTW のいずれかとして指定します。このプロパティを Radix-2 に設定する場合、FFT の長さは 2 のべき乗でなければなりません。

入力要素の順序に対する出力チャネル要素の順序を指定します。このプロパティを true に設定すると、周波数インデックスがビット反転順で出力されます。既定値は false であり、これは周波数インデックスの線形順に対応します。

FFT 長によって FFT の出力を分割する場合、このプロパティを true に設定します。このオプションは、FFT の出力をその入力と同じ振幅範囲内に留める必要がある場合に役立ちます。これは特に、固定小数点データ型での作業に役立ちます。

このプロパティの既定値は false であり、スケーリングなしです。

FFT 長の決定方法を Auto または Property として指定します。このプロパティを Auto に設定すると、FFT 長は入力信号の行数と等しくなります。

FFT 長。2 以上の整数で指定します。

次の条件のいずれかに当てはまる場合、このプロパティは 2 のべき乗でなければなりません。

依存関係

このプロパティは、FFTLengthSource プロパティを Property に設定した場合に適用されます。

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

FFT 長が入力長よりも短い場合に入力データをラップします。このプロパティを true に設定すると、FFT 長が入力長よりも短い場合、FFT 演算の前に長さを法とするデータ ラッピングが発生します。このプロパティを false に設定すると、FFT 演算の前に入力データが FFT 長に切り捨てられます。

固定小数点プロパティ

丸め方法を指定します。

オーバーフロー アクションを Wrap または Saturate として指定します。

正弦表のデータ型を Same word length as input または Custom として指定します。

正弦表の固定小数点データ型を SignednessAuto に設定されたスケーリングされていない numerictype (Fixed-Point Designer) オブジェクトとして指定します。

依存関係

このプロパティは、SineTableDataType プロパティを Custom に設定した場合に適用されます。

積のデータ型を Full precisionSame as input、または Custom として指定します。

乗算の固定小数点型を SignednessAuto に設定された、スケーリングされた numerictype (Fixed-Point Designer) オブジェクトとして指定します。

依存関係

このプロパティは、ProductDataType プロパティを Custom に設定した場合に適用されます。

アキュムレータのデータ型を Full precisionSame as inputSame as product、または Custom として指定します。

アキュムレータの固定小数点データ型を SignednessAuto に設定された、スケーリングされた numerictype (Fixed-Point Designer) オブジェクトとして指定します。

依存関係

このプロパティは、AccumulatorDataType プロパティを Custom に設定した場合に適用されます。

出力データ型を Full precisionSame as inputCustom のいずれかに指定します。

出力の固定小数点型を SignednessAuto に設定された、スケーリングされた numerictype (Fixed-Point Designer) オブジェクトとして指定します。

依存関係

このプロパティは、OutputDataType プロパティを Custom に設定した場合に適用されます。

使用法

構文

説明

y = ft(x) は、入力 x の DFT yx の最初の次元に沿って計算します。

入力引数

すべて展開する

時間領域入力信号。ベクトル、行列、または N 次元配列として指定します。

FFTLengthSource プロパティが 'Auto' に設定されている場合、最初の次元に沿った x の長さは、正の 2 の整数乗でなければなりません。この長さは FFT 長でもあります。FFTLengthSource プロパティが 'Property' である場合、FFTLength に指定する値は、正の 2 の整数乗でなければなりません。

可変サイズの入力信号は、FFTLengthSource プロパティが 'Auto' に設定されている場合にのみ、サポートされます。

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

出力引数

すべて展開する

入力信号の離散フーリエ変換。ベクトル、行列、または N 次元配列として返されます。FFTLengthSource プロパティが 'Auto' に設定されている場合、FFT 長は入力信号の行数と同じになります。FFTLengthSource プロパティが 'Property' に設定されている場合、FFT 長は FFTLength プロパティで指定されます。

2 のべき乗でない変換の長さをサポートするには、FFTImplementation プロパティを 'FFTW' に設定します。

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

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

加法性ノイズの信号の周波数成分を検出します。

メモ: この例は R2016b 以降でのみ動作します。それ以前のリリースを使用している場合、それぞれの関数の呼び出しを等価な step 構文で置き換えてください。たとえば、myObject(x) は step(myObject,x) になります。

Fs = 800; L = 1000;
t = (0:L-1)'/Fs;
x = sin(2*pi*250*t) + 0.75*cos(2*pi*340*t);
y = x + .5*randn(size(x)); % noisy signal
ft = dsp.FFT('FFTLengthSource','Property', ...
    'FFTLength',1024);
Y = ft(y);

片側振幅スペクトルをプロットします。

plot(Fs/2*linspace(0,1,512), 2*abs(Y(1:512)/1024))
title('Single-sided amplitude spectrum of noisy signal y(t)')
xlabel('Frequency (Hz)'); ylabel('|Y(f)|')

Figure contains an axes object. The axes object with title Single-sided amplitude spectrum of noisy signal y(t) contains an object of type line.

ノイズを含んだ正弦波入力信号の FFT を計算します。信号のエネルギーは、FFT 係数の大きさの二乗として保存されます。信号エネルギーの 99.99% を占める FFT 係数を決定し、その係数の IFFT を取って時間領域信号を再構成します。再構成後の信号と元の信号を比較します。

Note: R2016a 以前のリリースを使用している場合、それぞれのオブジェクトの呼び出しを等価な step 構文で置き換えてください。たとえば、obj(x)step(obj(x)) になります。

有限の時間間隔 0nN-1 で定義される時間領域信号 x[n] について考えます。信号 x[n] のエネルギーは、次の方程式で求められます。

EN=n=0N-1|x[n]|2

FFT 係数 X[k] は、周波数領域の信号値と見なされます。したがって、周波数領域の信号 x[n] のエネルギーは、FFT 係数の大きさの二乗和です。

EN=1Nk=0N-1|X[k]|2

パーセバルの定理によると、時間領域または周波数領域における信号の合計エネルギーは同じです。

EN=n=0N-1|x[n]|2=1Nk=0N-1|X[k]|2

初期化

dsp.SineWave System object を初期化して、44.1 kHz でサンプリングされる、周波数が 1000 Hz の正弦波を生成します。dsp.FFT および dsp.IFFT オブジェクトを構築して、入力信号の FFT と IFFT を計算します。

これらの各変換オブジェクトの 'FFTLengthSource' プロパティは 'Auto' に設定されます。したがって、FFT 長は入力フレーム サイズと見なされます。この例の入力フレーム サイズは 1020 で、2 のべき乗ではないため、'FFTImplementation''FFTW' として選択します。

L = 1020;
Sineobject = dsp.SineWave('SamplesPerFrame',L,...
    'PhaseOffset',10,...
    'SampleRate',44100,...
    'Frequency',1000);
ft = dsp.FFT('FFTImplementation','FFTW');
ift = dsp.IFFT('FFTImplementation','FFTW',...
    'ConjugateSymmetricInput',true);
rng(1);

ストリーミング

ノイズを含む入力信号でストリーミングを行います。各フレームの FFT を計算し、信号の 99.99% のエネルギーを構成する係数を決定します。これらの係数の IFFT を取って時間領域信号を再構成します。

numIter = 1000;
for Iter = 1:numIter
    Sinewave1 = Sineobject();
    Input = Sinewave1 + 0.01*randn(size(Sinewave1));
    FFTCoeff = ft(Input);
    FFTCoeffMagSq = abs(FFTCoeff).^2;
    
    EnergyFreqDomain = (1/L)*sum(FFTCoeffMagSq);
    [FFTCoeffSorted, ind] = sort(((1/L)*FFTCoeffMagSq),...
        1,'descend');
    
    CumFFTCoeffs = cumsum(FFTCoeffSorted);
    EnergyPercent = (CumFFTCoeffs/EnergyFreqDomain)*100;
    Vec = find(EnergyPercent > 99.99);
    FFTCoeffsModified = zeros(L,1);
    FFTCoeffsModified(ind(1:Vec(1))) = FFTCoeff(ind(1:Vec(1)));
    ReconstrSignal = ift(FFTCoeffsModified);
end

信号の 99.99% のエネルギーは、Vec(1) によって与えられる FFT 係数の数で表すことができます。

Vec(1)
ans = 296

信号はこれらの係数を使用して効率的に再構成されます。再構成された信号の最後のフレームと元の時間領域信号を比較すると、差が非常に小さくなっており、プロットがほぼ一致していることがわかります。

max(abs(Input-ReconstrSignal))
ans = 0.0431
plot(Input,'*');
hold on;
plot(ReconstrSignal,'o');
hold off;

Figure contains an axes object. The axes object contains 2 objects of type line.

アルゴリズム

このオブジェクトは、FFT ブロックのリファレンス ページで説明されているアルゴリズム、入力、および出力を実装しています。オブジェクト プロパティはブロック パラメーターに対応します。

参照

[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.

拡張機能

バージョン履歴

R2012a で導入

参考

オブジェクト