Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_sum_fft_complex_2d_sep (c06fu)

## Purpose

nag_sum_fft_complex_2d_sep (c06fu) computes the two-dimensional discrete Fourier transform of a bivariate sequence of complex data values. This function is designed to be particularly efficient on vector processors.
Note: this function is scheduled to be withdrawn, please see c06fu in Advice on Replacement Calls for Withdrawn/Superseded Routines..

## Syntax

[x, y, trigm, trign, ifail] = c06fu(m, n, x, y, init, trigm, trign)
[x, y, trigm, trign, ifail] = nag_sum_fft_complex_2d_sep(m, n, x, y, init, trigm, trign)

## Description

nag_sum_fft_complex_2d_sep (c06fu) computes the two-dimensional discrete Fourier transform of a bivariate sequence of complex data values z j1 j2 ${z}_{{j}_{1}{j}_{2}}$, for j1 = 0,1,,m1$\mathit{j1}=0,1,\dots ,m-1$ and j2 = 0,1,,n1$\mathit{j2}=0,1,\dots ,n-1$.
The discrete Fourier transform is here defined by
 m − 1 n − 1 ẑ k1k2 = 1/(sqrt(mn)) ∑ ∑ z j1 j2 × exp( − 2πi(( j1 k1 )/m + ( j2 k2 )/n)), j1 = 0 j2 = 0
$z^ k1k2 = 1mn ∑ j1=0 m-1 ∑ j2=0 n-1 z j1 j2 × exp( -2πi ( j1 k1 m + j2 k2 n ) ) ,$
where k1 = 0,1,,m1 ${k}_{1}=0,1,\dots ,m-1$, k2 = 0,1,,n1 ${k}_{2}=0,1,\dots ,n-1$.
(Note the scale factor of 1/(sqrt(mn)) $\frac{1}{\sqrt{mn}}$ in this definition.)
To compute the inverse discrete Fourier transform, defined with exp( + 2πi()) $\mathrm{exp}\left(+2\pi i\left(\dots \right)\right)$ in the above formula instead of exp(2πi()) $\mathrm{exp}\left(-2\pi i\left(\dots \right)\right)$, this function should be preceded and followed by calls of nag_sum_conjugate_complex_sep (c06gc) to form the complex conjugates of the data values and the transform.
This function calls nag_sum_fft_complex_1d_multi_rfmt (c06fr) to perform multiple one-dimensional discrete Fourier transforms by the fast Fourier transform (FFT) algorithm in Brigham (1974). It is designed to be particularly efficient on vector processors.

## References

Brigham E O (1974) The Fast Fourier Transform Prentice–Hall
Temperton C (1983) Self-sorting mixed-radix fast Fourier transforms J. Comput. Phys. 52 1–23

## Parameters

### Compulsory Input Parameters

1:     m – int64int32nag_int scalar
m$m$, the length of the first dimension of Z$Z$. Consider the matrix Z$Z$ with elements Zij = zi + 1j + 1${Z}_{ij}={z}_{i+1j+1}$, where z$z$ is the bivariate sequence defined in Section [Description], then m$m$ is the number of rows of Z$Z$.
Constraint: m1${\mathbf{m}}\ge 1$.
2:     n – int64int32nag_int scalar
n$n$, the length of the second dimension of Z$Z$. Consider the matrix Z$Z$ with elements Zij = zi + 1j + 1${Z}_{ij}={z}_{i+1j+1}$, where z$z$ is the bivariate sequence defined in Section [Description], then n$n$ is the number of columns of Z$Z$.
Constraint: n1${\mathbf{n}}\ge 1$.
3:     x( m × n ${\mathbf{m}}×{\mathbf{n}}$) – double array
4:     y( m × n ${\mathbf{m}}×{\mathbf{n}}$) – double array
The real and imaginary parts of the complex data values must be stored in arrays x and y respectively. If x and y are regarded as two-dimensional arrays of dimension (0 : m1,0 : n1)$\left(0:{\mathbf{m}}-1,0:{\mathbf{n}}-1\right)$, then x(j1,j2)${\mathbf{x}}\left({j}_{1},{j}_{2}\right)$ and y(j1,j2)${\mathbf{y}}\left({j}_{1},{j}_{2}\right)$ must contain the real and imaginary parts of z j1 j2 ${z}_{{j}_{1}{j}_{2}}$.
5:     init – string (length ≥ 1)
Indicates whether trigonometric coefficients are to be calculated.
init = 'I'${\mathbf{init}}=\text{'I'}$
Calculate the required trigonometric coefficients for the given values of m$m$ and n$n$, and store in the corresponding arrays trigm and trign.
init = 'S'${\mathbf{init}}=\text{'S'}$ or 'R'$\text{'R'}$
The required trigonometric coefficients are assumed to have been calculated and stored in the arrays trigm and trign in a prior call to nag_sum_fft_complex_2d_sep (c06fu). The function performs a simple check that the current values of m$m$ and n$n$ are consistent with the corresponding values stored in trigm and trign.
Constraint: init = 'I'${\mathbf{init}}=\text{'I'}$, 'S'$\text{'S'}$ or 'R'$\text{'R'}$.
6:     trigm( 2 × m $2×{\mathbf{m}}$) – double array
7:     trign( 2 × n $2×{\mathbf{n}}$) – double array
If init = 'S'${\mathbf{init}}=\text{'S'}$ or 'R'$\text{'R'}$, trigm and trign must contain the required coefficients calculated in a previous call of the function. Otherwise trigm and trign need not be set.
If m = n$m=n$ the same array may be supplied for trigm and trign.

None.

work

### Output Parameters

1:     x( m × n ${\mathbf{m}}×{\mathbf{n}}$) – double array
2:     y( m × n ${\mathbf{m}}×{\mathbf{n}}$) – double array
The real and imaginary parts respectively of the corresponding elements of the computed transform.
3:     trigm( 2 × m $2×{\mathbf{m}}$) – double array
4:     trign( 2 × n $2×{\mathbf{n}}$) – double array
trigm and trign contain the required coefficients (computed by the function if init = 'I'${\mathbf{init}}=\text{'I'}$).
5:     ifail – int64int32nag_int scalar
${\mathrm{ifail}}={\mathbf{0}}$ unless the function detects an error (see [Error Indicators and Warnings]).

## Error Indicators and Warnings

Errors or warnings detected by the function:
ifail = 1${\mathbf{ifail}}=1$
 On entry, m < 1${\mathbf{m}}<1$.
ifail = 2${\mathbf{ifail}}=2$
 On entry, n < 1${\mathbf{n}}<1$.
ifail = 3${\mathbf{ifail}}=3$
 On entry, init ≠ 'I'${\mathbf{init}}\ne \text{'I'}$, 'S'$\text{'S'}$ or 'R'$\text{'R'}$.
ifail = 4${\mathbf{ifail}}=4$
Not used at this Mark.
ifail = 5${\mathbf{ifail}}=5$
 On entry, init = 'S'${\mathbf{init}}=\text{'S'}$ or 'R'$\text{'R'}$, but at least one of the arrays trigm and trign is inconsistent with the current value of m or n.
ifail = 6${\mathbf{ifail}}=6$
An unexpected error has occurred in an internal call. Check all function calls and array dimensions. Seek expert help.

## Accuracy

Some indication of accuracy can be obtained by performing a subsequent inverse transform and comparing the results with the original sequence (in exact arithmetic they would be identical).

The time taken is approximately proportional to mn × log(mn) $mn×\mathrm{log}\left(mn\right)$, but also depends on the factorization of the individual dimensions m$m$ and n$n$. nag_sum_fft_complex_2d_sep (c06fu) is faster if the only prime factors are 2$2$, 3$3$ or 5$5$; and fastest of all if they are powers of 2$2$.

## Example

```function nag_sum_fft_complex_2d_sep_example
m = int64(3);
n = int64(5);
x = [1;
0.994;
0.903;
0.999;
0.989;
0.885;
0.987;
0.963;
0.823;
0.936;
0.891;
0.694;
0.802;
0.731;
0.467];
y = [0;
-0.111;
-0.43;
-0.04;
-0.151;
-0.466;
-0.159;
-0.268;
-0.568;
-0.352;
-0.454;
-0.72;
-0.597;
-0.682;
-0.884];
init = 'Initial';
trigm = zeros(6,1);
trign = zeros(10,1);
[xOut, yOut, trigmOut, trignOut, ifail] = ...
nag_sum_fft_complex_2d_sep(m, n, x, y, init, trigm, trign)
```
```

xOut =

3.3731
0.4565
-0.1705
0.4814
0.0549
-0.0375
0.2507
0.0093
-0.0423
0.0543
-0.0217
-0.0377
-0.4194
-0.0759
-0.0022

yOut =

-1.5187
0.1368
0.4927
-0.0907
0.0317
0.0584
0.1776
0.0389
0.0082
0.3188
0.0356
-0.0255
0.4145
0.0045
-0.0829

trigmOut =

1
1
3
0
0
3

trignOut =

1
1
1
1
5
0
0
0
0
5

ifail =

0

```
```function c06fu_example
m = int64(3);
n = int64(5);
x = [1;
0.994;
0.903;
0.999;
0.989;
0.885;
0.987;
0.963;
0.823;
0.936;
0.891;
0.694;
0.802;
0.731;
0.467];
y = [0;
-0.111;
-0.43;
-0.04;
-0.151;
-0.466;
-0.159;
-0.268;
-0.568;
-0.352;
-0.454;
-0.72;
-0.597;
-0.682;
-0.884];
init = 'Initial';
trigm = zeros(6,1);
trign = zeros(10,1);
[xOut, yOut, trigmOut, trignOut, ifail] = c06fu(m, n, x, y, init, trigm, trign)
```
```

xOut =

3.3731
0.4565
-0.1705
0.4814
0.0549
-0.0375
0.2507
0.0093
-0.0423
0.0543
-0.0217
-0.0377
-0.4194
-0.0759
-0.0022

yOut =

-1.5187
0.1368
0.4927
-0.0907
0.0317
0.0584
0.1776
0.0389
0.0082
0.3188
0.0356
-0.0255
0.4145
0.0045
-0.0829

trigmOut =

1
1
3
0
0
3

trignOut =

1
1
1
1
5
0
0
0
0
5

ifail =

0

```