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_1d_multi_rfmt (c06fr)

## Purpose

nag_sum_fft_complex_1d_multi_rfmt (c06fr) computes the discrete Fourier transforms of m$m$ sequences, each containing n$n$ complex data values. This function is designed to be particularly efficient on vector processors.
Note: this function is scheduled to be withdrawn, please see c06fr in Advice on Replacement Calls for Withdrawn/Superseded Routines..

## Syntax

[x, y, trig, ifail] = c06fr(m, n, x, y, init, trig)
[x, y, trig, ifail] = nag_sum_fft_complex_1d_multi_rfmt(m, n, x, y, init, trig)

## Description

Given m$m$ sequences of n$n$ complex data values zjp ${z}_{\mathit{j}}^{\mathit{p}}$, for j = 0,1,,n1$\mathit{j}=0,1,\dots ,n-1$ and p = 1,2,,m$\mathit{p}=1,2,\dots ,m$, nag_sum_fft_complex_1d_multi_rfmt (c06fr) simultaneously calculates the Fourier transforms of all the sequences defined by
 n − 1 ẑkp = 1/(sqrt(n)) ∑ zjp × exp( − i(2πjk)/n),  k = 0,1, … ,n − 1​ and ​p = 1,2, … ,m. j = 0
$z^kp = 1n ∑ j=0 n-1 zjp × exp( -i 2πjk n ) , k= 0, 1, …, n-1 ​ and ​ p= 1,2,…,m .$
(Note the scale factor 1/(sqrt(n)) $\frac{1}{\sqrt{n}}$ in this definition.)
The discrete Fourier transform is sometimes defined using a positive sign in the exponential term
 n − 1 ẑkp = 1/(sqrt(n)) ∑ zjp × exp( + i(2πjk)/n). j = 0
$z^kp = 1n ∑ j=0 n-1 zjp × exp( +i 2πjk n ) .$
To compute this form, this function should be preceded and followed by a call of nag_sum_conjugate_complex_sep (c06gc) to form the complex conjugates of the zjp ${z}_{j}^{p}$ and the kp ${\stackrel{^}{z}}_{k}^{p}$.
The function uses a variant of the fast Fourier transform (FFT) algorithm (see Brigham (1974)) known as the Stockham self-sorting algorithm, which is described in Temperton (1983). Special code is provided for the factors 2$2$, 3$3$, 4$4$, 5$5$ and 6$6$. This function is designed to be particularly efficient on vector processors, and it becomes especially fast as m$m$, the number of transforms to be computed in parallel, increases.

## 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 number of sequences to be transformed.
Constraint: m1${\mathbf{m}}\ge 1$.
2:     n – int64int32nag_int scalar
n$n$, the number of complex values in each sequence.
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 must be stored in x and y respectively as if in a two-dimensional array of dimension (1 : m,0 : n1)$\left(1:{\mathbf{m}},0:{\mathbf{n}}-1\right)$; each of the m$m$ sequences is stored in a row of each array. In other words, if the real parts of the p$p$th sequence to be transformed are denoted by xjp${x}_{\mathit{j}}^{p}$, for j = 0,1,,n1$\mathit{j}=0,1,\dots ,n-1$, then the mn$mn$ elements of the array x must contain the values
 x01 , x02 , … , x0m , x11 , x12 , … , x1m , … , xn − 11 , xn − 12 , … , xn − 1m . $x01 , x02 ,…, x0m , x11 , x12 ,…, x1m ,…, x n-1 1 , x n-1 2 ,…, x n-1 m .$
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 value of n$n$, and store in the array trig.
init = 'S'${\mathbf{init}}=\text{'S'}$ or 'R'$\text{'R'}$
The required trigonometric coefficients are assumed to have been calculated and stored in the array trig in a prior call to one of nag_sum_fft_real_1d_multi_rfmt (c06fp), nag_sum_fft_hermitian_1d_multi_rfmt (c06fq) or nag_sum_fft_complex_1d_multi_rfmt (c06fr). The function performs a simple check that the current value of n$n$ is consistent with the values stored in trig.
Constraint: init = 'I'${\mathbf{init}}=\text{'I'}$, 'S'$\text{'S'}$ or 'R'$\text{'R'}$.
6:     trig( 2 × n $2×{\mathbf{n}}$) – double array
If init = 'S'${\mathbf{init}}=\text{'S'}$ or 'R'$\text{'R'}$, trig must contain the required trigonometric coefficients that have been previously calculated. Otherwise trig need not be set.

None.

work

### Output Parameters

1:     x( m × n ${\mathbf{m}}×{\mathbf{n}}$) – double array
2:     y( m × n ${\mathbf{m}}×{\mathbf{n}}$) – double array
x and y store the real and imaginary parts of the complex transforms.
3:     trig( 2 × n $2×{\mathbf{n}}$) – double array
Contains the required coefficients (computed by the function if init = 'I'${\mathbf{init}}=\text{'I'}$).
4:     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 the array trig and the current value of n are inconsistent.
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 by nag_sum_fft_complex_1d_multi_rfmt (c06fr) is approximately proportional to nm log(n)$nm\mathrm{log}\left(n\right)$, but also depends on the factors of n$n$. nag_sum_fft_complex_1d_multi_rfmt (c06fr) is fastest if the only prime factors of n$n$ are 2$2$, 3$3$ and 5$5$, and is particularly slow if n$n$ is a large prime, or has large prime factors.

## Example

```function nag_sum_fft_complex_1d_multi_rfmt_example
m = int64(3);
n = int64(6);
x = [0.3854;
0.9172;
0.1156;
0.6772;
0.0644;
0.0685;
0.1138;
0.6037;
0.206;
0.6751;
0.643;
0.863;
0.6362;
0.0428;
0.6967;
0.1424;
0.4815;
0.2792];
y = [0.5417;
0.9089;
0.6214;
0.2983;
0.3118;
0.8681;
0.1181;
0.3465;
0.706;
0.7255;
0.6198;
0.8652;
0.8638;
0.2668;
0.919;
0.8723;
0.1614;
0.3355];
init = 'Initial';
trig = zeros(12,1);
[xOut, yOut, trigOut, ifail] = nag_sum_fft_complex_1d_multi_rfmt(m, n, x, y, init, trig)
```
```

xOut =

1.0737
1.1237
0.9100
-0.5706
0.1728
-0.3054
0.1733
0.4185
0.4079
-0.1467
0.1530
-0.0785
0.0518
0.3686
-0.1193
0.3625
0.0101
-0.5314

yOut =

1.3961
1.0677
1.7617
-0.0409
0.0386
0.0624
-0.2958
0.7481
-0.0695
-0.1521
0.1752
0.0725
0.4517
0.0565
0.1285
-0.0321
0.1403
-0.4335

trigOut =

1
1
1
1
1
6
0
0
0
0
0
6

ifail =

0

```
```function c06fr_example
m = int64(3);
n = int64(6);
x = [0.3854;
0.9172;
0.1156;
0.6772;
0.0644;
0.0685;
0.1138;
0.6037;
0.206;
0.6751;
0.643;
0.863;
0.6362;
0.0428;
0.6967;
0.1424;
0.4815;
0.2792];
y = [0.5417;
0.9089;
0.6214;
0.2983;
0.3118;
0.8681;
0.1181;
0.3465;
0.706;
0.7255;
0.6198;
0.8652;
0.8638;
0.2668;
0.919;
0.8723;
0.1614;
0.3355];
init = 'Initial';
trig = zeros(12,1);
[xOut, yOut, trigOut, ifail] = c06fr(m, n, x, y, init, trig)
```
```

xOut =

1.0737
1.1237
0.9100
-0.5706
0.1728
-0.3054
0.1733
0.4185
0.4079
-0.1467
0.1530
-0.0785
0.0518
0.3686
-0.1193
0.3625
0.0101
-0.5314

yOut =

1.3961
1.0677
1.7617
-0.0409
0.0386
0.0624
-0.2958
0.7481
-0.0695
-0.1521
0.1752
0.0725
0.4517
0.0565
0.1285
-0.0321
0.1403
-0.4335

trigOut =

1
1
1
1
1
6
0
0
0
0
0
6

ifail =

0

```