実数値入力の離散フーリエ変換 (RDFT)

バージョン名: RDFT-9

カテゴリー: 信号処理

簡単な説明: RDFT 操作は、指定された次元による入力テンソルの離散実数から複素数へのフーリエ変換を行います。

属性:

利用可能な属性はありません。

入力:

  • 1: data - RDFT 変換のデータを含むタイプ T の入力テンソル。必須。

  • 2: axes - RDFT が適用される次元インデックスを指定する T_IND タイプの 1D テンソルで、axes は入力テンソルのさまざまな次元のインデックスの順序なしリストです。例えば、[0, 4], [4, 0], [4, 2, 1], [1, 2, 3], [-3, 0, -2]。これらのインデックスは、-r から r - 1 までの整数である必要があります (r = rank(data))。負の軸 a は、軸 r + a として解釈されます。他の次元は変わりません。axes 属性内の要素の順序が重要であり、3 番目の入力 signal_size 内の要素に直接マッピングされます。必須。

  • 3: signal_size - 入力 axes からの軸に関する信号サイズを記述する T_SIZE タイプの 1D テンソル。signal_size[i] == -1 である場合、RDFT は axes[i] 軸のフルサイズに対して計算されます。signal_size[i] > data_shape[axes[i]] の場合、入力データは最後で axes[i] 軸に対してゼロパディングされます。最後に、signal_size[i] < data_shape[axes[i]]、次に入力データが axes[i] 軸に関してトリミングされます。より正確には、signal_size[i] < data_shape[axes[i]] の場合、axes[i] 軸のスライス 0: signal_size[i] が考慮されます。オプションで、デフォルト値 [axes 内 adata_shape[a] ] を使用します。

  • 注: 入力 signal_size が指定されている場合、signal_size のサイズは axes のサイズと同じである必要があります。

出力:

  • 1: 入力 data テンソルと同じタイプの要素を持ち、ランク r + 1 を持つ結果のテンソル (r = rank(data))。出力の形状は [S_0, S_1, ..., S_{r-1}, 2] の形式で、すべての S_a は次のように計算されます。

  1. normalized_axes を計算します。ここで、axes[i] >= 0 の場合、normalized_axes[i] = axes[i]、そうでない場合は、normalized_axes[i] = axes[i] + r となります。

  2. anormalized_axes にない場合、S_a = data_shape[a] となります。

  3. anormalized_axes にある場合、一部の ia = normalized_axes[i] になります。

    • i != len(normalized_axes) - 1 である場合、S_a は、signal_size 入力が指定されていないと S_a = data_shape[a] として計算され、指定されている場合は signal_size[i] = -1 として計算されます。それ以外は S_a = signal_size[a] です。

    • i = len(normalized_axes) - 1 である場合、S_a は、signal_size 入力が指定されていないと S_a = data_shape[a] // 2 + 1 として計算され、指定されている場合は signal_size[i] = -1 として計算されます。それ以外は S_a = signal_size[a] // 2 + 1 です。

タイプ:

  • T: サポートされている浮動小数点タイプ。

  • T_IND: int64 または int32

  • T_SIZE: int64 または int32

詳細な説明: RDFT は、指定された軸に関して実数値の入力テンソルの離散フーリエ変換を行います。計算は以下のルールに従って行われます。

簡単にするために、入力テンソル A の形状は [B_0, ..., B_{k-1}, M_0, ..., M_{q-1}]axes=[k,...,k+q-1]、および signal_size=[S_0,...,S_{q-1}] であると想定します。

signal_size を考慮して、D を入力テンソル A とします。したがって、D の形状は [B_0, ..., B_{k-1}, S_0, ..., S_{q-1}] になります。

次に、

\[X=X[j_0,\dots,j_{k-1},j_k,\dots,j_{k+q-1}]\]

のすべてのインデックス j_0,...,j_{k+q-1} は、実数値の入力テンソルになります。

次に、テンソル X の変換 RDFT は、形状 [B_0, ..., B_{k-1}, S_0 // 2 + 1, ..., S_{r-1} // 2 + 1] のテンソル Y であり、次のようになります。

\[Y[n_0,\dots,n_{k-1},m_0,\dots,m_{q-1}]=\sum\limits_{j_0=0}^{S_0-1}\cdots\sum\limits_{j_{q-1}=0}^{S_{q-1}-1}X[n_0,\dots,n_{k-1},j_0,\dots,j_{q-1}]\exp\left(-2\pi i\sum\limits_{b=0}^{q-1}\frac{m_bj_b}{S_b}\right)\]

すべてのインデックスは n_0,...,n_{k-1}m_0,...,m_{q-1} です。

軸と信号サイズの一般的な場合の計算も同様です。

例:

signal_size 入力なし (3D 入力テンソル)

 <layer ... type="RDFT" ... >
     <input>
         <port id="0">
             <dim>1</dim>
             <dim>320</dim>
             <dim>320</dim>
         </port>
         <port id="1">
             <dim>2</dim> <!-- axes input contains [1, 2] -->
         </port>
     <output>
         <port id="2">
             <dim>1</dim>
             <dim>320</dim>
             <dim>161</dim>
             <dim>2</dim>
         </port>
     </output>
 </layer>

signal_size 入力なし (2D 入力テンソル)

 <layer ... type="RDFT" ... >
     <input>
         <port id="0">
             <dim>320</dim>
             <dim>320</dim>
         </port>
         <port id="1">
             <dim>2</dim> <!-- axes input contains [0, 1] -->
         </port>
     <output>
         <port id="2">
             <dim>320</dim>
             <dim>161</dim>
             <dim>2</dim>
         </port>
     </output>
 </layer>

signal_size 入力あり (3D 入力テンソル)

 <layer ... type="RDFT" ... >
     <input>
         <port id="0">
             <dim>1</dim>
             <dim>320</dim>
             <dim>320</dim>
         </port>
         <port id="1">
             <dim>2</dim> <!-- axes input contains [1, 2] -->
         </port>
         <port id="2">
             <dim>2</dim> <!-- signal_size input contains [512, 100] -->
         </port>
     <output>
         <port id="3">
             <dim>1</dim>
             <dim>512</dim>
             <dim>51</dim>
             <dim>2</dim>
         </port>
     </output>
 </layer>

signal_size 入力あり (2D 入力テンソル)

 <layer ... type="RDFT" ... >
     <input>
         <port id="0">
             <dim>320</dim>
             <dim>320</dim>
         </port>
         <port id="1">
             <dim>2</dim> <!-- axes input contains [0, 1] -->
         </port>
         <port id="2">
             <dim>2</dim> <!-- signal_size input contains [512, 100] -->
         </port>
     <output>
         <port id="3">
             <dim>512</dim>
             <dim>51</dim>
             <dim>2</dim>
         </port>
     </output>
 </layer>

signal_size 入力あり (4D 入力テンソル、signal_size-1、ソートされていない軸)

 <layer ... type="RDFT" ... >
     <input>
         <port id="0">
             <dim>16</dim>
             <dim>768</dim>
             <dim>580</dim>
             <dim>320</dim>
         </port>
         <port id="1">
             <dim>3</dim> <!-- axes input contains  [3, 1, 2] -->
         </port>
         <port id="2">
             <dim>3</dim> <!-- signal_size input contains [170, -1, 1024] -->
         </port>
     <output>
         <port id="3">
             <dim>16</dim>
             <dim>768</dim>
             <dim>513</dim>
             <dim>170</dim>
             <dim>2</dim>
         </port>
     </output>
 </layer>

signal_size 入力あり (4D 入力テンソル、signal_size-1、ソートされていない軸、2 番目の例)

 <layer ... type="RDFT" ... >
     <input>
         <port id="0">
             <dim>16</dim>
             <dim>768</dim>
             <dim>580</dim>
             <dim>320</dim>
         </port>
         <port id="1">
             <dim>3</dim> <!-- axes input contains  [3, 0, 2] -->
         </port>
         <port id="2">
             <dim>3</dim> <!-- signal_size input contains [258, -1, 2056] -->
         </port>
     <output>
         <port id="3">
             <dim>16</dim>
             <dim>768</dim>
             <dim>1029</dim>
             <dim>258</dim>
             <dim>2</dim>
         </port>
     </output>
 </layer>