特殊な対称性を持つ DFT への入力はさまざまなアプリケーションで発生します。対称性を利用する変換は通常、実数-複素数および複素数-実数 FFT 変換などのように、ストレージと計算数を節約します。パフォーマンスライブラリ コサインおよびサイン変換は、偶関数および奇関数内で検出された対称性プロパティーを利用する特殊なケースの FFT ルーチンです。
次の表に、Oracle Developer Studio パフォーマンスライブラリの高速コサインおよびサイン変換を示します。倍精度ルーチンの名前は角括弧で囲んでいます。名前が「V」で始まるルーチンは、1 つ以上のシーケンスの変換を同時に計算できます。名前が「I」で終わるものは、初期化ルーチンです。
|
|
|
M: 変換するシーケンスの数。
LEN、LEN-1、LEN+1: 入力シーケンスの長さ。
X: 変換するシーケンスを格納する実数の配列。出力で、実数変換結果は X に格納されます。
TABLE: 変換ルーチンに必要な変換サイズに固有の定数の配列。定数は初期化ルーチンによって計算されます。
WORK: 変換ルーチンに必要なワークスペース。単一のシーケンスを処理するルーチンで、WORK には初期化ルーチンによって計算された定数も格納されます。
よく見られる対称性のもう 1 つのタイプは、n = -N+1, …, 0, …, N の場合に x(n) = -x(-n) である奇数対称性です。高速コサイン変換の場合と同様に、高速サイン変換 (FST) は、奇数対称性を利用してメモリーと計算を節約します。実数奇数シーケンス x の場合、対称性は、x(0) = -x(0) = 0 であることを示します。したがって、x の長さが 2 N の場合、FST を計算するために、x の N = 1 の値のみ必要です。ルーチン SINT は単一の実数奇数シーケンスの FST を計算し、VSINT は 1 つ以上のシーケンスの FST を計算します。[V]SINT を呼び出す前に、入力長 N-1 に関連付けられた三角法の定数と係数を計算するために、[V]SINTI を呼び出す必要があります。FST はそれ自身の逆変換です。VSINT を 2 回呼び出すと、元の N -1 データポイントになります。SINT を 2 回呼び出すと、2N をかけた元の N -1 データポイントになります。
-N+1, …, 0, …, N の場合に x(n) = -x(-n - 1) のような対称性を持つ奇数シーケンスは、1/4 波奇数対称性があると言います。SINQF および SINQB はそれぞれ単一の実数 1/4 波奇数シーケンスの FST およびその逆変換を計算し、VSINQF および VSINQB は 1 つまたは複数のシーケンスを処理します。SINQB は正規化されないため、SINQB の入力として SINQF の結果を使用すると、4 N の係数でスケーリングされた元のシーケンスが生成されます。ただし、VSINQB は正規化されるため、VSINQF の呼び出しのあとの VSINQB の呼び出しによって、元のシーケンスが生成されます。1/4 波奇数対称性がある長さ 2 N の実数シーケンスの FST には、N 入力データポイントが必要で、N ポイントの結果シーケンスを生成します。[V]SINQI を呼び出して変換ルーチンを呼び出す前に初期化が必要です。
実数偶数シーケンスを処理する FFT の特殊な形式は、高速コサイン変換 (FCT) です。実数シーケンス x は、x(n) = x(-n) の場合に偶数の対称性があると言われます。ここで n = -N + 1, …, 0, …, N です。長さ 2N のシーケンスの FCT には N + 1 入力データポイントが必要で、サイズ N + 1 のシーケンスを生成します。ルーチン COST は単一の実数偶数シーケンスの FCT を計算し、VCOST は 1 つ以上のシーケンスの FCT を計算します。[V]COST を呼び出す前に、[V]COSTI を呼び出して、入力長 N +1 に関連付けられる三角法の定数と係数を計算する必要があります。FCT はそれ自身の逆変換です。VCOST を 2 回呼び出すと、元の N +1 データポイントになります。COST を 2 回呼び出すと、2N をかけた元の N +1 データポイントになります。
n = ‐N + 1, … , 0, …, N の場合に、x(n) = x(-n - 1) のような対称性を持つ偶数シーケンス x は、1/4 波偶数対称性があると言います。COSQF および COSQB は単一の実数 1/4 波偶数シーケンスの FCT とその逆変換をそれぞれ計算します。VCOSQF および VCOSQB は 1 つ以上のシーケンスを処理します。[V]COSQB の結果は正規化されず、
でスケーリングされた場合、元のシーケンスが取得されます。1/4 波実数対称性がある長さ 2N の実数シーケンスの FCT には、N の入力データポイントが必要で、N ポイントの結果シーケンスを生成します。変換ルーチンを呼び出す前に、[V]COSQI を呼び出して、初期化が必要です。
Oracle Developer Studio パフォーマンスライブラリルーチンは、次のセクションの方程式を使用して、高速コサインおよびサイン変換と逆変換を計算します。
シーケンスの順方向および逆方向 FCT は次のように計算されます。
[D]COST 注記:
N ポイントシーケンスの FCT を計算するために、N + 1 の値が必要になります。
[D]COST は逆変換も計算します。[D]COST が 2 回呼び出されると、結果は
でスケーリングされた元のシーケンスになります。
複数シーケンスの順方向および逆方向 FCT は次のように計算されます。
i = 0、M - 1 の場合
.
V[D]COST 注記
M N ポイントシーケンスの VFCT を計算するために、M × (N+1) の値が必要になります。
入力および出力シーケンスは、行方向に格納されます。
V[D]COST は正規化され、それ自身の逆変換です。V[D]COST が 2 回呼び出されると、結果は元のデータになります。
1/4 波偶数シーケンスの順方向 FCT は次のように計算されます。
N ポイント 1/4 波偶数シーケンスの順方向 FCT を計算するために、N の値が必要です。
1/4 波偶数シーケンスの逆方向 FCT は次のように計算されます
.
順変換ルーチンと逆変換ルーチンを呼び出すと、
でスケーリングされた元の入力になります。
1 つまたは複数の 1/4 波偶数シーケンスの順方向 FCT は次のように計算されます
i = 0、M - 1 の場合
V[D]COSQF 注記:
入力および出力シーケンスは、行方向に格納されます。
変換は正規化されるため、V[D]COSQF の呼び出し後すぐに、逆変換ルーチン V[D]COSQB が呼び出された場合、元のデータが取得されます。
1 つ以上の 1/4 波偶数シーケンスの逆方向 FCT は次のように計算されます
i = 0、M - 1 の場合
V[D]COSQB 注記:
入力および出力シーケンスは、行方向に格納されます。
変換は正規化されるため、V[D]COSQB が V[D]COSQF の呼び出し後すぐに呼び出された場合、元のデータが取得されます。
シーケンスの順方向および逆方向 FST は次のように計算されます
.
[D]SINT 注記:
N ポイントシーケンスの FST を計算するために、N-1 の値が必要です。
[D]SINT は逆変換も計算します。[D]SINT が 2 回呼び出された場合、結果は
でスケーリングされた元のシーケンスになります。
複数シーケンスの順方向および逆方向高速サイン変換は次のように計算されます
i = 0、M - 1 の場合
.
V[D]SINT 注記:
M N ポイントシーケンスの VFST を計算するために、M × (N - 1) の値が必要です。
入力および出力シーケンスは、行方向に格納されます。
V[D]SINT は正規化され、それ自身の逆変換です。V[D]SINT を 2 回呼び出すと、元のデータが生成されます。
1/4 波奇数シーケンスの順方向 FST は次のように計算されます
.
N ポイント 1/4 波奇数シーケンスの順方向 FST を計算するために、N の値が必要になります。
1/4 波奇数シーケンスの逆方向 FST は次のように計算されます
.
順変換ルーチンと逆変換ルーチンを呼び出すと、
でスケーリングされた元の入力になります。
1 つ以上の 1/4 波奇数シーケンスの順方向 FST は次のように計算されます
i = 0、M - 1 の場合
.
V[D]SINQF 注記:
入力および出力シーケンスは、行方向に格納されます。
変換は正規化されるため、V[D]SINQF の呼び出し後すぐに、逆変換ルーチン V[D]SINQB が呼び出された場合、元のデータが取得されます。
1 つ以上の 1/4 波奇数シーケンスの逆方向 FST は次のように計算されます
i = 0、M - 1 の場合
.
V[D]SINQB 注記:
入力および出力シーケンスは、行方向に格納されます。
変換は正規化されるため、V[D]SINQB が V[D]SINQF の呼び出し後すぐに呼び出された場合、元のデータが取得されます。
使用例 15 は、COST を呼び出して、実数偶数シーケンスの FCT と逆変換を計算します。実数シーケンスの長さが 2N の場合、N + 1 の入力データポイントのみを格納する必要があり、結果のデータポイントの数も N + 1 になります。結果は入力配列に格納されます。
使用例 15 単一の実数偶数シーケンスの FCT と逆方向 FCT の計算my_system% cat cost.f program Drive cost implicit none integer,parameter :: len=4 real x(0:len),work(3*(len+1)+15), z(0:len), scale integer i scale = 1.0/(2.0*len) call RANDOM_NUMBER(x(0:len)) z(0:len) = x(0:len) write(*,'(a25,i1,a10,i1,a12)')'Input sequence of length ', $ len,' requires ', len+1,' data points' write(*,'(5(f8.3,2x),/)')(x(i),i=0,len) call costi(len+1, work) call cost(len+1, z, work) write(*,*)'Forward fast cosine transform' write(*,'(5(f8.3,2x),/)')(z(i),i=0,len) call cost(len+1, z, work) write(*,*) $ 'Inverse fast cosine transform (results scaled by 1/2*N)' write(*,'(5(f8.3,2x),/)')(z(i)*scale,i=0,len) end my_system% f95 -dalign cost.f -library=sunperf my_system% a.out Input sequence of length 4 requires 5 data points 0.557 0.603 0.210 0.352 0.867 Forward fast cosine transform 3.753 0.046 1.004 -0.666 -0.066 Inverse fast cosine transform (results scaled by 1/2*N) 0.557 0.603 0.210 0.352 0.867
使用例 16 では、VCOSQF および VCOSQB を呼び出して、2 つの実数 1/4 波偶数シーケンスの FCT と逆方向 FCT をそれぞれ計算しています。実数シーケンスの長さが 2N の場合、N の入力データポイントのみを格納する必要があり、結果のデータポイントの数も N になります。結果は入力配列に格納されます。
使用例 16 2 つの実数 1/4 波偶数シーケンスの FCT および逆方向 FCT の計算my_system% cat vcosq.f program vcosq implicit none integer,parameter :: len=4, m = 2, ld = m+1 real x(ld,len),xt(ld,len),work(3*len+15), z(ld,len) integer i, j call RANDOM_NUMBER(x) z = x write(*,'(a27,i1)')' Input sequences of length ',len do j = 1,m write(*,'(a3,i1,a4,4(f5.3,2x),a1,/)') $ 'seq',j,' = (',(x(j,i),i=1,len),')' end do call vcosqi(len, work) call vcosqf(m,len, z, xt, ld, work) write(*,*) $ 'Forward fast cosine transform for quarter-wave even sequences' do j = 1,m write(*,'(a3,i1,a4,4(f5.3,2x),a1,/)') $ 'seq',j,' = (',(z(j,i),i=1,len),')' end do call vcosqb(m,len, z, xt, ld, work) write(*,*) $ 'Inverse fast cosine transform for quarter-wave even sequences' write(*,*)'(results are normalized)' do j = 1,m write(*,'(a3,i1,a4,4(f5.3,2x),a1,/)') $ 'seq',j,' = (',(z(j,i),i=1,len),')' end do end my_system% f95 -dalign vcosq.f -library=sunperf my_system% a.out Input sequences of length 4 seq1 = (0.557 0.352 0.990 0.539 ) seq2 = (0.603 0.867 0.417 0.156 ) Forward fast cosine transform for quarter-wave even sequences seq1 = (0.755 -.392 -.029 0.224 ) seq2 = (0.729 0.097 -.091 -.132 ) Inverse fast cosine transform for quarter-wave even sequences (results are normalized) seq1 = (0.557 0.352 0.990 0.539 ) seq2 = (0.603 0.867 0.417 0.156 )
次の例の使用例 17 では、SINT を呼び出して、実数奇数シーケンスの FST と逆変換を計算しています。実数シーケンスの長さが 2N の場合、N - 1 の入力データポイントのみを格納する必要があり、結果のデータポイントの数も N- 1 になります。結果は入力配列に格納されます。
使用例 17 2 つの実数 1/4 波偶数シーケンスの FCT および逆方向 FCT の計算my_system% cat sint.f program Drive sint implicit none integer,parameter :: len=4 real x(0:len-2),work(3*(len-1)+15), z(0:len-2), scale integer i call RANDOM_NUMBER(x(0:len-2)) z(0:len-2) = x(0:len-2) scale = 1.0/(2.0*len) write(*,'(a25,i1,a10,i1,a12)')'Input sequence of length ', $ len,' requires ', len-1,' data points' write(*,'(3(f8.3,2x),/)')(x(i),i=0,len-2) call sinti(len-1, work) call sint(len-1, z, work) write(*,*)'Forward fast sine transform' write(*,'(3(f8.3,2x),/)')(z(i),i=0,len-2) call sint(len-1, z, work) write(*,*) $ 'Inverse fast sine transform (results scaled by 1/2*N)' write(*,'(3(f8.3,2x),/)')(z(i)*scale,i=0,len-2) end my_system% f95 -dalign sint.f -library=sunperf my_system% a.out Input sequence of length 4 requires 3 data points 0.557 0.603 0.210 Forward fast sine transform 2.291 0.694 -0.122 Inverse fast sine transform (results scaled by 1/2*N) 0.557 0.603 0.210
次の例の使用例 18 では、VSINQF および VSINQB を呼び出して、2 つの実数 1/4 波奇数シーケンスの FST と逆方向 FST をそれぞれ計算しています。実数シーケンスの長さが 2N の場合、N の入力データポイントのみを格納する必要があり、結果のデータポイントの数も N になります。結果は入力配列に格納されます。
使用例 18 2 つの実数 1/4 波奇数シーケンスの FST および逆方向 FST の計算my_system% cat vsinq.f program vsinq implicit none integer,parameter :: len=4, m = 2, ld = m+1 real x(ld,len),xt(ld,len),work(3*len+15), z(ld,len) integer i, j call RANDOM_NUMBER(x) z = x write(*,'(a27,i1)')' Input sequences of length ',len do j = 1,m write(*,'(a3,i1,a4,4(f5.3,2x),a1,/)') $ 'seq',j,' = (',(x(j,i),i=1,len),')' end do call vsinqi(len, work) call vsinqf(m,len, z, xt, ld, work) write(*,*) $ 'Forward fast sine transform for quarter-wave odd sequences' do j = 1,m write(*,'(a3,i1,a4,4(f5.3,2x),a1,/)') $ 'seq',j,' = (',(z(j,i),i=1,len),')' end do call vsinqb(m,len, z, xt, ld, work) write(*,*) $ 'Inverse fast sine transform for quarter-wave odd sequences' write(*,*)'(results are normalized)' do j = 1,m write(*,'(a3,i1,a4,4(f5.3,2x),a1,/)') $ 'seq',j,' = (',(z(j,i),i=1,len),')' end do end my_system% f95 vsinq.f -library=sunperf my_system% a.out Input sequences of length 4 seq1 = (0.557 0.352 0.990 0.539 ) seq2 = (0.603 0.867 0.417 0.156 ) Forward fast sine transform for quarter-wave odd sequences seq1 = (0.823 0.057 0.078 0.305 ) seq2 = (0.654 0.466 -.069 -.037 ) Inverse fast sine transform for quarter-wave odd sequences (results are normalized) seq1 = (0.557 0.352 0.990 0.539 ) seq2 = (0.603 0.867 0.417 0.156 )