sprod2du,dprod2du(3F) sprod2du,dprod2du(3F)
sprod2du, dprod2du - Compute the product of a 2D Fourier transforms with
a 2D filter.
Fortran :
subroutine sprod2du( n1,n2,array,lda,filter,ldf)
integer n1,n2,lda,ldf
real array(lda,n2), filter(ldf,n2)
subroutine dprod2du( n1,n2,array,lda,filter,ldf)
integer n1,n2,lda,ldf
real*8 array(lda,n2), filter(ldf,n2)
C :
#include <fft.h>
int sprod2du(int n1, int n2, float *array, int lda,
float *filter, int ldf);
int dprod2du(int n1, int n2, double *array,int lda,
double *filter, int ldf);
sprod2du and dprod2du compute the product of the Fourier transforms of 2D
real sequence (size N1xN2) with the Fourier transform of 2D real filter.
Note, the product of the Fourier transforms of two sequences is equal to
the Fourier transform of their convolution.
N1 Integer, the first dimension size of the 2D sequence.
Unchanged on exit.
N2 Integer, the second dimension size of the 2D sequence. Unchanged
on exit.
ARRAY Array containing the samples of the 2D sequence to be transformed.
On input, the element {i,j} of the sequence is stored as A(i,j) in
Fortran , and A[i+j*lda] in C.
On exit, the array is overwritten by its transform.
LDA Integer, array leading dimension: increment between the samples of
two consecutive sub-sequences (e.g between {i,j+1} and {i,j} ).
Unchanged on exit.
FILTER Array containing the Fourier Transform of the 2D filter.
Unchanged on exit.
LDF Integer, array leading dimension: increment between the first samples
of two consecutive sub-sequence(e.g between {i,j+1} and {i,j} ).
Unchanged on exit.
Page 1
sprod2du,dprod2du(3F) sprod2du,dprod2du(3F)
Example of Calling Sequence
Working on a 64*1024 sequence of real values. We successively apply a
Direct Fourier Transform, the product with a SINGLE filter transform,
then an Inverse Fourier TransformElements
of sequence are stored with increment (stride)1, and the offset
between the first element of two succesive sub-sequence (leading
dimension) is 1026 (1026 >= 1024+2).
Fortran
real array(0:1026-1,0:64-1),
filter(0:1026-1,0:64-1), coeff(64+15 + 2*(1024+15))
call scfft2dui( 1024, 64, coeff)
call scfft2du( -1, 1024, 64, array, 1026, coeff)
call sprod2du( 1024, 64, array, 1026 , filter, 1026)
call csfft2du( 1, 1024, 64, array, 1026, coeff)
C
#include <fft.h>
float array[64*1026], filter[1026], *coeff;
coeff = scfft2dui( 1024, 64, NULL);
scfft2du( -1, 1024, 64, array, 1026, coeff);
sprod2du( 1024, 64, array, 1026, filter, 1026);
csfft2du( -1, 1024, 64, array, 1026, coeff);
NOTE : As the FFTs are not normalized, a successive direct, then inverse
transform, scales the original input by the size of the sequence. Rather
than calling sscal2d or dscal2d to scale back the result, this scaling
factor could be directly applied to the filter transform, thus saving
some extra work.
fft, scfft2dui, dzfft2dui, scfft2du, dzfft2du, sscal2d, dscal2d
PPPPaaaaggggeeee 2222 [ Back ]
|