Main Content

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

dsp.IFFT

逆離散フーリエ変換 (IDFT)

説明

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

  • double 信号のアルゴリズム

  • 半分長のアルゴリズム

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

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

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

入力の IFFT を計算するには、次のようにします。

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

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

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

作成

説明

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

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

プロパティ

すべて展開する

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

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

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

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

IFFT オブジェクトへのフーリエ変換された入力要素の順序がビット反転順である場合、このプロパティを true に設定します。既定の設定は false で、これは線形順を表します。

依存関係

このプロパティは、FFTLengthSource プロパティが Auto の場合にのみ適用されます。

入力が共役対称である場合、このプロパティを true に設定して、実数値出力を得ます。実数値シーケンスの離散フーリエ変換は共役対称であり、このプロパティを true に設定すると IDFT 計算法が最適化されます。共役対称入力に対してこのプロパティを false に設定すると、出力値が非ゼロの虚数部をもつ複素数になる可能性があります。これは丸め誤差によって発生します。非共役対称入力に対してこのプロパティを true に設定すると、出力が無効になります。

依存関係

このプロパティは、FFTLengthSource プロパティが Auto の場合にのみ適用されます。

IFFT 出力を FFT 長で分割するかどうかを指定します。既定の設定は true で、出力の各要素が FFT 長で分割されます。

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

依存関係

このプロパティは、BitReversedInput および ConjugateSymmetricInput の両方が false である場合にのみ適用されます。

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

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

  • 入力が固定小数点データ型である。

  • FFTImplementation プロパティが Radix-2 である。

依存関係

このプロパティは、BitReversedInput および ConjugateSymmetricInput プロパティを false に、FFTLengthSource プロパティを 'Property' に設定した場合に適用されます。

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

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

固定小数点プロパティ

丸め方法を指定します。

オーバーフロー アクションを 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 input または Custom に指定します。

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

依存関係

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

使用法

説明

y = ift(x) は、入力 x の逆離散フーリエ変換 (IDFT) yx の最初の次元に沿って計算します。

入力引数

すべて展開する

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

FFTLengthSource プロパティが Auto である場合、最初の次元に沿った x の長さは、正の 2 の整数乗でなければなりません。FFTLengthSource プロパティが 'Property' である場合、最初の次元に沿った x の長さは、任意の正の整数になり、FFTLength プロパティは、正の 2 の整数乗でなければなりません。

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

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

出力引数

すべて展開する

入力信号の逆離散フーリエ変換。ベクトル、行列、または N 次元配列として返されます。

FFTLengthSource プロパティが 'Auto' に設定されている場合、FFT 長は入力信号の行数と同じになります。FFTLengthSource プロパティが 'Property' に設定されている場合、FFT 長は FFTLength プロパティで指定されます。

データ型: 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 の内部状態のリセット

すべて折りたたむ

ノイズを含んだ正弦波入力信号の 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;

アルゴリズム

このオブジェクトは、IFFT ブロックのリファレンス ページで説明されているアルゴリズム、入力、および出力を実装しています。オブジェクト プロパティは、[出力サンプリング モード] パラメーターが dsp.IFFT でサポートされないことを除き、ブロック パラメーターに対応しています。

参照

[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 で導入