逆離散複素数から実数へのフーリエ変換 (IRDFT)#

バージョン名: IRDFT-9

カテゴリー: 信号処理

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

属性:

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

入力

  • 1: data - IRDFT 変換のデータを含むタイプ T の入力テンソル。入力テンソルの最後の次元は 2 に等しくなければなりません。つまり、入力テンソルの形状は、複素数の実数成分と虚数成分を表す [D_0, D_1, ..., D_{N-1}, 2][:, ..., :, 1] 形式である必要があります。必須。

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

  • 次の制約を満たす必要があります: rank(data) >= len(axes) + 1 and (rank(data) - 1) not in axes and (-1) not in axes

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

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

出力

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

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

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

  3. anormalized_axes にある場合は、一部の ia = normalized_axes[i] になります。このような場合、signal_size 入力が指定されていないと S_a = 2 * (data_shape[a] - 1)、指定されている場合は signal_size[i] = -1 となります。それ以外は S_a = signal_size[a] です。また、+ i != len(normalized_axes) - 1S_aS_a = data_shape[a] として計算され、signal_size 入力が指定されていないまたは指定されると、signal_size[i] = -1; および S_a = signal_size[a] です。+ i = len(normalized_axes) - 1S_aS_a = 2 * (data_shape[a] - 1) として計算され、signal_size 入力が指定されていないまたは指定されると、signal_size[i] = -1; および S_a = signal_size[a] です。

タイプ

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

  • T_IND: int64 または int32

  • T_SIZE: int64 または int32

詳細な説明: IRDFT は、次の規則に従って入力テンソルの離散フーリエ変換を行います。

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

D を入力テンソル A の値とします。

次に、

X[j0,,jk1,jk,,jk+q1]=D[j0,,jk1,jk,,jk+q1,0]+iD[j0,,jk1,jk,,jk+q1,1]

のすべてのインデックス j_0,...,j_{k+q-1} に対して、i は虚数単位、つまり X は複素数テンソルです。

次の式を使用して、形状 [B_0, ..., B_{k-1}, 2 * (M_0 - 1), ..., 2 * (M_{q-1} - 1)] の複素テンソル F を定義します:

F[j0,,jk1,jk,,jp,,jk+q1]={X[j0,,jk1,jk,,jp,,jk+q1], when jp=0,,Mp1;X[j0,,jk1,jk,,2(Mp11)jp,,jk+q1], otherwise.

次の方法で、形状 [B_0, ..., B_{k-1}, S_0, ..., S_{q-1}] を持つ複素テンソル G を構築します。S_a > 2 * (M_a - 1) の場合、F の軸 k + a にはゼロが埋め込まれます。 S_a < 2 * (M_a - 1) の場合、F の軸 k + a がトリミングされます。つまり、この軸のスライス 0: S_a のみを考慮します。最後に、S_a = 2 * (M_a - 1) の場合、F の全軸 k + a を考慮します。

Y を次のような形状 [B_0, ..., B_{k-1}, S_0, ..., S_{q-1}] を持つ複素テンソルとします:

Y[n0,,nk1,m0,,mq1]=1b=0q1Sbj0=0S01jq1=0Sq11X[n0,,nk1,j0,,jq1]exp(2πib=0q1mbjbSb)

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

最後に、逆離散複素数から実数へのフーリエ変換の結果は、テンソル Y の実数部になります。

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

:

signal_size 入力はありません (4D 入力テンソル):

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

signal_size 入力はありません (3D 入力テンソル):

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

signal_size 入力 (4D 入力テンソル) があります:

<layer ... type="IRDFT" ... > 
    <input> 
        <port id="0"> 
            <dim>1</dim> 
            <dim>161</dim> 
            <dim>161</dim> 
            <dim>2</dim> 
        </port> 
        <port id="1"> 
            <dim>2</dim> <!-- [1, 2] --> 
        </port> 
        <port id="2"> 
            <dim>2</dim> <!-- [512, 100] --> 
        </port> 
    <output> 
        <port id="3"> 
            <dim>1</dim> 
            <dim>512</dim> 
            <dim>100</dim> 
        </port> 
    </output> 
</layer>

signal_size 入力 (3D 入力テンソル) があります:

<layer ... type="IRDFT" ... > 
    <input> 
        <port id="0"> 
            <dim>161</dim> 
            <dim>161</dim> 
            <dim>2</dim> 
        </port> 
        <port id="1"> 
            <dim>2</dim> <!-- [0, 1] --> 
        </port> 
        <port id="2"> 
            <dim>2</dim> <!-- [512, 100] --> 
        </port> 
    <output> 
        <port id="3"> 
            <dim>512</dim> 
            <dim>100</dim> 
        </port> 
    </output> 
</layer>

signal_size 入力があります (5D 入力テンソル、signal_size-1、ソートされていない軸):

<layer ... type="IRDFT" ... > 
    <input> 
        <port id="0"> 
            <dim>16</dim> 
            <dim>768</dim> 
            <dim>580</dim> 
            <dim>320</dim> 
            <dim>2</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>1024</dim> 
            <dim>170</dim> 
        </port> 
    </output> 
</layer>

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

<layer ... type="IRDFT" ... > 
    <input> 
        <port id="0"> 
            <dim>16</dim> 
            <dim>768</dim> 
            <dim>580</dim> 
            <dim>320</dim> 
            <dim>2</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>2056</dim> 
            <dim>258</dim> 
        </port> 
    </output> 
</layer>