|
|
◆ Sinq1f()
| Sub Sinq1f |
( |
N As |
Long, |
|
|
R() As |
Double, |
|
|
Wsave() As |
Double, |
|
|
Info As |
Long, |
|
|
Optional Inc As |
Long = 1 |
|
) |
| |
One-dimensional quarter sine transform
- Purpose
- This routine computes the one-dimensional Fourier transform of a sequence which is a sine series with odd wave numbers. This is referred to as the forward transform or Fourier analysis, transforming the sequence from physical to spectral space.
R(k) = (2/N)ΣR(j)sin(π(j+1)(2k+1)/(2n)) + (-1)^(k+2) R(N-1)/N (Σ for j = 0 to N-2) (k = 0 to N-1)
This transform is normalized since a call to Sinq1f followed by a call to Sinq1b (or vice-versa) reproduces the original array subject to algorithmic constraints, roundoff error, etc.
- Parameters
-
| [in] | N | The length of the sequence to be transformed. (N >= 1) (The transform is most efficient when N is a product of small primes) |
| [in,out] | R() | Array R(LR - 1) (LR >= Inc*(N - 1) + 1)
[in] The sequence to be transformed.
[out] The Fourier forward transformed sequence of data. |
| [in] | Wsave() | Array Wsave(LWsave - 1) (LWsave >= 2*N + ln(N)/ln(2) + 4)
Work data. Its contents must be initialized with a call to Sinq1i before the first call to Sinq1f or Sinq1b for a given transform length N. |
| [out] | Info | = 0: Successful exit.
= -1: The argument N had an illegal value. (N < 1)
= -2: The argument R() is invalid. (Array R() is not big enough)
= -3: The argument Wsave() is invalid. (Array Wsave() is not big enough)
= -5: The argument Inc had an illegal value. (Inc < 1) |
| [in] | Inc | (Optional)
Integer increment between the locations, in array R(), of two consecutive elements within the sequence. (Inc >= 1) (default = 1) |
- Reference
- FFTPACK
- Example Program
- Compute the sine transform and backward transform of 5 random data sequence successively, and compare with the original data sequence.
Sub Ex_Sinq1()
Const N = 5
Dim Wsave() As Double, R(N - 1) As Double, R0(N - 1) As Double
Dim LWsave As Long, Info As Long, I As Long
'-- Initialization
LWsave = 2 * N + Log(N) / Log(2) + 4
ReDim Wsave(LWsave - 1)
If Info <> 0 Then GoTo Err
'-- Generate test data
For I = 0 To N - 1
R(I) = Rnd()
R0(I) = R(I)
Next
'-- Forward transform
Call Sinq1f(N, R(), Wsave(), Info)
If Info <> 0 Then GoTo Err
'-- Backward transform
Call Sinq1b(N, R(), Wsave(), Info)
If Info <> 0 Then GoTo Err
'-- Print result
For I = 0 To N - 1
Debug.Print R0(I), R(I), R(I) - R0(I)
Next
Exit Sub
Err:
End Sub
Sub Sinq1f(N As Long, R() As Double, Wsave() As Double, Info As Long, Optional Inc As Long=1) One-dimensional quarter sine transform
Sub Sinq1i(N As Long, Wsave() As Double, Info As Long) Initialization of work data for Sinq1f and Sinq1b
Sub Sinq1b(N As Long, R() As Double, Wsave() As Double, Info As Long, Optional Inc As Long=1) One-dimensional quarter sine backward transform
- Example Results
0.538389623165131 0.538389623165131 -1.11022302462516E-16
0.728501200675964 0.728501200675964 1.11022302462516E-16
0.163476526737213 0.163476526737213 0
0.280120372772217 0.280120372772217 0
0.352979362010956 0.352979362010956 1.11022302462516E-16
|