MATLAB 逆高速フーリエ変換

Ammar Ali 2022年8月18日
MATLAB 逆高速フーリエ変換

このチュートリアルでは、MATLAB の ifft() 関数を使用して逆高速フーリエ変換を見つける方法について説明します。

MATLAB 逆高速フーリエ変換

Matlab の ifft() 関数を使用して、ベクトル、行列、または多次元配列の逆高速フーリエ変換を見つけることができます。ifft() 関数には、以下に示す 4つの構文があります。

Out = ifft(X)
Out = ifft(X,n)
Out = ifft(X,n,dim)
Out = ifft(___,symflag)

最初の構文は、高速フーリエ変換アルゴリズムを使用して、入力 X の逆高速フーリエ変換を返します。ifft() 関数は、入力 X に存在する共役対称ベクトルをチェックします。ベクトルが共役対称の場合、出力は高速で実在します。

反対角交換行列とその複素共役の積が元のベクトルと等しい場合、ベクトルは共役対称です。時間領域信号の場合、その高速フーリエ変換には、正の周波数スペクトルの半分と負の周波数スペクトルの半分が含まれます。

入力 X は、ベクトル、行列、または多次元配列にすることができます。最初の構文は、入力がベクトルの場合、ベクトルの逆高速フーリエ変換を含むベクトルを返し、出力ベクトルは入力ベクトルと同じ長さになります。

入力が行列の場合、構文は行列の列の逆高速フーリエ変換を含む行列を返し、出力行列のサイズは入力行列になります。入力が多次元配列の場合、関数は最初の次元に沿った値の逆高速フーリエ変換を返し、それらをベクトルとして扱います。

2 番目の構文は、2 番目の引数 n として逆高速フーリエ変換を見つけるポイントを追加するために使用されます。ポイントを追加しない場合、関数は要素のインデックスをポイントとして使用します。

引数 n がゼロの場合、関数の出力は空行列になります。引数の長さ n が入力ベクトルまたは行列の長さよりも短い場合、ifft() 関数は残りの値を無視します。

引数の長さ n がベクトルまたは行列の長さよりも大きい場合、関数は入力値の間にゼロを追加し、関数のパフォーマンスを向上させます。引数の長さ n は通常、小さい素数または 2 の累乗の積です。

3 番目の構文は、次元を 3 番目の引数 dim として設定するために使用されます。これは、行列および多次元配列の場合に逆高速フーリエ変換を見つけるために使用されます。たとえば、行列入力の場合、関数は各列の逆高速フーリエ変換を検出しますが、3 番目の引数として 2 を追加すると、関数は各行の逆高速フーリエ変換を返します。

4 番目の引数は、入力の対称性を対称または非対称に設定するために使用されます。入力が完全に対称でない場合は、この引数を使用して対称に設定し、関数が入力を対称として扱うようにすることができます。

たとえば、ベクトルを作成し、fft() 関数を使用してその高速フーリエ変換を見つけてから、ifft() 関数を使用して逆高速フーリエ変換を見つけます。以下のコードを参照してください。

clc
clear

n = [1 6 2]
fourier = fft(n)
inverse_fourier = ifft(fourier)

出力:

n =

     1     6     2


fourier =

   9.0000 + 0.0000i  -3.0000 - 3.4641i  -3.0000 + 3.4641i


inverse_fourier =

    1.0000    6.0000    2.0000

上記のコードでは、3つの要素のベクトルを使用してフーリエ変換と逆フーリエ変換を見つけ、ifft() 関数の結果を確認しました。出力では、入力ベクトル nifft() 関数の出力が同じであることがわかります。これは、関数が完全に機能していることを意味します。

出力では、入力ベクトル n のフーリエ変換に大きさと位相が含まれていることがわかります。どちらも元の信号を再構築するために使用されます。振幅や位相などのフーリエ変換の一部を取り出すと、元の信号を再構築できなくなります。

ifft() 関数を使用して元の信号を再構築する前に、信号に振幅と位相が含まれていることを確認する必要があります。また、信号が元の位置からずれていないことを確認する必要があります。

たとえば、fftshift() 関数を使用してフーリエ変換を見つけ、ゼロ周波数成分をスペクトルの中心にシフトすることができます。ifft() 関数を使用してその逆フーリエ変換を見つけると、元のシングルを適切に再構築できません。

この場合、ifft() 関数の代わりに ifftshift() 関数を使用できます。ifftshift() 関数は逆フーリエ変換を検出し、信号を元の位置に戻します。

上記の 2 番目の構文を使用してポイントを設定すると、出力も変更されます。たとえば、入力ベクトルの長さよりも長いポイントの長さの場合、再構築された信号には、元のベクトルまたは行列要素よりも多くの要素が含まれます。

ifft() 関数の次元を変更すると、出力も変更され、元のベクトルまたは行列と一致しない可能性があります。たとえば、上記の例を繰り返して、入力ベクトルの逆フーリエ変換を行うために使用されるポイントの数を変更してみましょう。

以下のコードを参照してください。

clc
clear

n = [1 6 2]
fourier = fft(n)
inverse_fourier = ifft(fourier,4)

出力:

n =

     1     6     2


fourier =

   9.0000 + 0.0000i  -3.0000 - 3.4641i  -3.0000 + 3.4641i


inverse_fourier =

   0.7500 + 0.0000i   3.8660 - 1.6160i   2.2500 + 1.7321i   2.1340 - 0.1160i

ポイントの数をデフォルトで 3 である 4 に変更したため、ifft() 関数の出力が入力ベクトル n と一致しないことがわかります。ifft() 関数の詳細については、このリンクを確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook