# Apply 1D FFT along specified dimension (row or column) using SimpleITK is SLOW

**URL:** https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247
**Category:** Uncategorized
**Created:** [October 8, 2024, 6:02pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247 "2024-10-08T18:02:21Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![SuperTXUH](https://discourse.itk.org/user_avatar/discourse.itk.org/supertxuh/32/4360_2.png) [@SuperTXUH](https://discourse.itk.org/u/SuperTXUH)
#### Post date: [October 8, 2024, 6:02pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/1 "2024-10-08T18:02:21Z")

</div>

Hello,

I am using sitk::ForwardFFT in C++ to apply 1D FFT on each row or column on a 2D image. However, I found the processing speed is quite slow even using buffer operations.

Is there any built-in function in SimpleITK to apply 1D FFT or can anyone advise to speed up the 1D FFD procedure?

Thanks!  
Elliot

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [October 8, 2024, 6:48pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/2 "2024-10-08T18:48:28Z")

</div>

Have you considered this class?  
[https://itk.org/Doxygen/html/classitk\_1\_1ForwardFFTImageFilter.html](https://itk.org/Doxygen/html/classitk_1_1ForwardFFTImageFilter.html)

---

<div class="post-metadata">

### Author: ![zivy](https://discourse.itk.org/user_avatar/discourse.itk.org/zivy/32/1726_2.png) [@zivy](https://discourse.itk.org/u/zivy)
#### Post date: [October 8, 2024, 6:56pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/3 "2024-10-08T18:56:51Z")

</div>

Hello @SuperTXUH,

Not specific to FFT, is your build in release mode or could it be that it is in debug mode? The issue with speed and build type has happened to [others in the past](https://discourse.itk.org/t/speed-discrepancy-between-itk-and-simpleitk/6070).

---

<div class="post-metadata">

### Author: ![SuperTXUH](https://discourse.itk.org/user_avatar/discourse.itk.org/supertxuh/32/4360_2.png) [@SuperTXUH](https://discourse.itk.org/u/SuperTXUH)
#### Post date: [October 8, 2024, 8:09pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/4 "2024-10-08T20:09:11Z")

</div>

Thanks for pointing this out. I try to use “Forward1DFFTImageFilter”. However, the image seems not changed after apply fft then modulus. Where the input (imageIn) is sitk 2D image (float32).

```auto
    using PixelType = float;
    constexpr unsigned int Dimension = 2;
    using ImageType = itk::Image<PixelType, Dimension>;
    using ComplexImageType = itk::Image<std::complex<float>, Dimension>;

    ImageType::Pointer itkImage = dynamic_cast<ImageType*>(imageIn.GetITKBase());

    using FFTFilterType = itk::Forward1DFFTImageFilter<ImageType, ComplexImageType>;
    FFTFilterType::Pointer fftFilter = FFTFilterType::New();
    fftFilter->SetInput(itkImage);
    fftFilter->SetDirection(1);  
    fftFilter->Update();

    using ModulusFilterType = itk::ComplexToModulusImageFilter<ComplexImageType, ImageType>;
    ModulusFilterType::Pointer modulusFilter = ModulusFilterType::New();
    modulusFilter->SetInput(fftFilter->GetOutput());
    modulusFilter->Update();
    sitk::Image modulusImage = sitk::Image(modulusFilter->GetOutput());

```

---

<div class="post-metadata">

### Author: ![SuperTXUH](https://discourse.itk.org/user_avatar/discourse.itk.org/supertxuh/32/4360_2.png) [@SuperTXUH](https://discourse.itk.org/u/SuperTXUH)
#### Post date: [October 8, 2024, 8:10pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/5 "2024-10-08T20:10:34Z")

</div>

I am using the debug mode. The speed is fairly slow.

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [October 8, 2024, 8:13pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/6 "2024-10-08T20:13:53Z")

</div>

That is a base class. You need to use either [VNL](https://itk.org/Doxygen/html/classitk_1_1VnlForwardFFTImageFilter.html) or [FFTW](https://itk.org/Doxygen/html/classitk_1_1FFTWForwardFFTImageFilter.html) variant.

You want RelWithDebInfo or Release mode for performance testing. Debug can be very slow.

---

<div class="post-metadata">

### Author: ![blowekamp](https://discourse.itk.org/user_avatar/discourse.itk.org/blowekamp/32/79_2.png) [@blowekamp](https://discourse.itk.org/u/blowekamp)
#### Post date: [October 8, 2024, 8:16pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/7 "2024-10-08T20:16:17Z")

</div>

> [@SuperTXUH](#):
>
> I am using sitk::ForwardFFT in C++ to apply 1D FFT on each row or column on a 2D image. However, I found the processing speed is quite slow even using buffer operations.

If you compiled SimpleITK and ITK in debug mode, first compile in release mode to determine if the performance is reasonable.

---

<div class="post-metadata">

### Author: ![SuperTXUH](https://discourse.itk.org/user_avatar/discourse.itk.org/supertxuh/32/4360_2.png) [@SuperTXUH](https://discourse.itk.org/u/SuperTXUH)
#### Post date: [October 8, 2024, 8:40pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/8 "2024-10-08T20:40:12Z")

</div>

Thanks. The Release mode is significant faster than debug mode using my old codes. But using built-in method “Forward1DFFTImageFilter” from ITK probably can further speed it up. Do you have any idea why the example codes posted here does not working (the output modulusImage is still the original image)?

---

<div class="post-metadata">

### Author: ![SuperTXUH](https://discourse.itk.org/user_avatar/discourse.itk.org/supertxuh/32/4360_2.png) [@SuperTXUH](https://discourse.itk.org/u/SuperTXUH)
#### Post date: [October 8, 2024, 8:45pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/9 "2024-10-08T20:45:33Z")

</div>

Thanks for the reply. The release mode is much faster.

---

<div class="post-metadata">

### Author: ![SuperTXUH](https://discourse.itk.org/user_avatar/discourse.itk.org/supertxuh/32/4360_2.png) [@SuperTXUH](https://discourse.itk.org/u/SuperTXUH)
#### Post date: [October 8, 2024, 8:56pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/10 "2024-10-08T20:56:19Z")

</div>

Got the stupid error. I cast the wrong image at testing main. Thanks for all helps!

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [October 9, 2024, 1:47pm UTC](https://discourse.itk.org/t/apply-1d-fft-along-specified-dimension-row-or-column-using-simpleitk-is-slow/7247/11 "2024-10-09T13:47:57Z")

</div>

For posterity, can you share the approximate speedup you got from using `Release` mode instead of `Debug`, and from `Forward1DFFTImageFilter` over regular `ForwardFFT`?
