<< Chapter < Page | Chapter >> Page > |
There are more efficient ways to write this method taking known symmetry and asymmetry conditions into account. However, I wrote the method the way that Idid because I wanted it to mimic the behavior of an FFT algorithm. Therefore, the complex input must extend from zero to the sampling frequency.
The method does not implement an FFT algorithm. Rather, the inverseTransform method implements a straight-forward sampled-data version of the continuous inverse Fourier transform that is defined usingintegral calculus.
The parameters to the inverseTransform method are:
The method considers the data length to be realIn.length , and considers the computational time increment to be 1.0/realIn.length .
The method returns a number of points equal to the data length. It assumes that the real input consists of positive frequency points for a symmetric realfrequency function. That is, the real input is assumed to be symmetric about the folding frequency. The method does not test this assumption.
The method assumes that the imaginary input consists of positive frequency points for an asymmetric imaginary frequency function. That is, the imaginaryinput is assumed to be asymmetric about the folding frequency. Once again, the method does not test this assumption.
A symmetric real part and an asymmetric imaginary part guarantee that theimaginary output will be all zero values. Having made that assumption, the program makes no attempt to compute an imaginary output. If the assumptionsdescribed above are not valid, the results won't be valid.
The program was tested using JDK 1.8 under Windows 7.
The beginning of the class and the beginning of the static inverseTransform method is shown in Listing 5 .
Listing 5. Beginning of the class named InverseComplexToReal01. |
---|
public class InverseComplexToReal01{
public static void inverseTransform(double[] realIn,double[] imagIn,double[] realOut){int dataLen = realIn.length;
double delT = 1.0/realIn.length;double startTime = 0.0; |
Listing 5 declares and initializes some variables that will be used later.
The inverse transform computation
Listing 6 contains a pair of nested for loops that perform the actual inverse transform computation.
Listing 6. The inverse transform computation. |
---|
//Outer loop interates on time domain
// values.for(int i=0; i<dataLen;i++){
double time = startTime + i*delT;double real = 0;
//Inner loop iterates on frequency// domain values.
for(int j=0; j<dataLen; j++){
real += realIn[j]*
Math.cos(2*Math.PI*time*j)+ imagIn[j]*Math.sin(2*Math.PI*time*j);
}//end inner looprealOut[i] = real;}//end outer loop
}//end inverseTransform}//end class InverseComplexToReal01 |
If you have been studying the earlier modules in this series, you should be able to understand the code in Listing 6 without further explanation. Pay particular attention to the comments that describe the two for loops.
Notification Switch
Would you like to follow the 'Digital signal processing - dsp' conversation and receive update notifications?