Ok, I posted this once before, but here it is again with some more information.<br>
<br>
I've written a piece of code to create a synthetic dataset.&nbsp; It's
a 128^3 dataset, each point with a 3-component double value consisting
of (sin(x), junk, morejunk).&nbsp; I extract just the first component,
and do an FFT.&nbsp; You'll find the code at the end of this message,
along with my &quot;PrintStatistics&quot; function attached.<br>
<br>
You'll see from the #if/#endif blocks that there's two possible ways to
do it.&nbsp; The first is with a vtkArrayCalculator, where I set a very
trivial function to simply copy out the one value.&nbsp; The other way
is with a vtkImageExtractComponents.&nbsp; When doing it with the
vtkArrayCalculator, the filter seems to work just fine but then the FFT
yields values like :<br>
<div style="margin-left: 40px; font-family: courier new,monospace;">p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array [0]: vtkDoubleArray &quot;result&quot;, 2,097,152 points, 8 bytes per point<br>
p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Magnitude Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0000&nbsp;
1482912.5793<br>
p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 0 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1048575.9848&nbsp;&nbsp; 1048575.8760<br>
p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 1 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1048572.9243&nbsp;&nbsp; 1048579.0968<br>
</div>
With a simple sin wave, the result should be almost purely imaginary, so the Component 0 range should be almost 0 to 0.&nbsp; <br>
<br>
When I switch to using the vtkImageExtractComponents, the results look better:<br>
<div style="font-family: courier new,monospace;">
<div style="margin-left: 40px; font-family: courier new,monospace;">p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array [0]: vtkDoubleArray &quot;image&quot;, 2,097,152 points, 8 bytes per point<br>
p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Magnitude Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0000&nbsp;
1048576.0091<br>
p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 0 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -0.0557 0.0011<br>
p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Component 1 Range:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1048576.0089&nbsp;&nbsp; 1048576.0091<br>
</div>
<br>
</div>
<br>
Unfortunately, when working with the vtkImageExtractComponents filter,
I lose the other two fields if I had planned on using them for coloring
or something.&nbsp; Also, my results aren't quite what I
expected.&nbsp; Much better, but on more complex datasets I seem to get
results that are a little off from the expected result.&nbsp; I don't
know if the cause of all this is related, but I'm chasing down what I
can.<br>
<br>
So, any ideas?<br>
<br>
<span style="font-family: courier new,monospace;">----- Code starts here -------</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"></span>
<div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">#include &lt;stdio.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;string.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;stdlib.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;unistd.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;stat.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;sys/types.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;sys/stat.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;sys/mman.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;fcntl.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkObject.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;vtkImageData.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &quot;vtkPointData.h&quot;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkDataArray.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkUnsignedCharArray.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkDoubleArray.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkImageData.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkImageFFT.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkArrayCalculator.h&gt;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#include &lt;vtkImageExtractComponents.h&gt;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">int main (int argc, char *argv[])</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; double *data;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; int xdim, ydim, zdim;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; double kx;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; int x,y,z;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; long index;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; xdim = 128;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ydim = 128;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; zdim = 128;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; if ((data = (double*)malloc(sizeof(double)*xdim*ydim*zdim*3)) == NULL) {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror(&quot;Unable to allocate memory!\n\t&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; printf(&quot;Constructing sin(kx * x) dataset...\n&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; kx = 2.0 * 3.1415926 / (double)xdim;</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; for(x=0; x&lt;xdim; x++) {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(y=0; y&lt;ydim; y++) {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(z=0; z&lt;zdim; z++) {</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
index = z + (y*zdim) + (x * ydim * zdim);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
data[(index*3)+0] = sin(kx * (double)x);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
data[(index*3)+1] = cos(kx * (double)x);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
data[(index*3)+2] = tan(kx * (double)x);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; }</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; vtkDoubleArray *ucPointer = vtkDoubleArray::New();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ucPointer-&gt;SetNumberOfComponents(3);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ucPointer-&gt;SetArray(data, xdim*ydim*zdim*3, 1);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ucPointer-&gt;SetName(&quot;image&quot;);</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; vtkImageData *image = vtkImageData::New();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; image-&gt;Initialize();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; image-&gt;SetDimensions(xdim, ydim, zdim);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; image-&gt;SetExtent(1, xdim, 1, ydim, 1, zdim);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; image-&gt;SetScalarTypeToDouble();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; image-&gt;SetNumberOfScalarComponents(3);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; image-&gt;GetPointData()-&gt;SetScalars(ucPointer);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; PrintStatistics(image);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; printf(&quot;Extracting Velocity X-Component...\n&quot;);</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#if 0</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; vtkArrayCalculator *extract = vtkArrayCalculator::New();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;SetInput(image);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;SetResultArrayName(&quot;result&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;AddScalarVariable(&quot;x&quot;, &quot;image&quot;, 0);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;SetFunction(&quot;(x*1.0)+0.0&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;ReplaceInvalidValuesOff();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;Update();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;GetOutput()-&gt;GetPointData()-&gt;RemoveArray(&quot;image&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;GetOutput()-&gt;GetPointData()-&gt;SetActiveScalars(&quot;result&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#else</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; vtkImageExtractComponents *extract = vtkImageExtractComponents::New();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;SetInput(image);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;SetComponents(0);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; extract-&gt;Update();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">#endif</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; PrintStatistics(extract-&gt;GetOutput());</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; printf(&quot;Computing FFT...\n&quot;);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; vtkImageFFT *fft = vtkImageFFT::New();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; fft-&gt;SetInput(extract-&gt;GetOutput());</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; fft-&gt;Update();</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; PrintStatistics(fft-&gt;GetOutput());</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">}</span><br>
<br>
</div>
<br>-- <br>Randall Hand<br>Visualization Scientist, <br>ERDC-MSRC Vicksburg, MS<br>Homepage: <a href="http://www.yeraze.com">http://www.yeraze.com</a>