Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apodization Mask for Fast Fourier Transforms in Python

I need to do a Fourier transform of a map in Python. Fast Fourier Transforms expect periodic boundary conditions, but the input map is not periodic. So I need to apply an input filter/weight slowly tapering the map toward zero at the edges. Are there libraries for doing this in python?

like image 411
Ronald Donald Avatar asked Sep 14 '17 05:09

Ronald Donald


2 Answers

Such tapering is often referred to as a "window".

Scipy has many window functions.

You can use numpy.expand_dims to create the 2D window you want.

Regarding Stefan's comment, apparently the numpy team thinks that including more than arrays was a mistake. I would stick to using scipy for signal processing. Watch out, as they moved quite a bit of functions around in their 1.0 release so older documentation is, well, quite old.

As a final note: a "filter" is typically reserved for multiplications you apply in the Frequency domain, not spatial domain.

like image 63
hmaarrfk Avatar answered Oct 22 '22 15:10

hmaarrfk


My favorite function to apodize a map is the generalized Gaussian (also called 'Super-Gaussian' which is a Gaussian whose exponent is raised to a power P. By setting P to, say, 4 or 6 you get a flat-top pulse which falls off smoothly, which is good for FFT applications where sharp edges always create ripples in conjugate space.

The generalized Gaussian is available on Scipy. Here is a minimal code (Python 3) to apodize a 2D array with a generalized Gaussian. As noted in previous comments, there are dozens of functions which would work just as well.

import numpy as np
from scipy.signal import general_gaussian

# A 128x128 array
array =  np.random.rand(128,128)
# Define a general Gaussian in 2D as outer product of the function with itself
window = np.outer(general_gaussian(128,6,50),general_gaussian(128,6,50))
# Multiply
ap_array = window*array
like image 45
NeverNervous Avatar answered Oct 22 '22 13:10

NeverNervous