From 9369b715d173891455227606562dd3f6490a586b Mon Sep 17 00:00:00 2001
From: Chad Hanna <crh184@psu.edu>
Date: Sat, 21 Jan 2017 20:52:06 -0500
Subject: [PATCH] reference_psd.py: use pyfftw if available otherwise fallback
 to the horendously slow scipy

---
 gstlal/python/reference_psd.py | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/gstlal/python/reference_psd.py b/gstlal/python/reference_psd.py
index 4fa589c84e..28a3054fbb 100644
--- a/gstlal/python/reference_psd.py
+++ b/gstlal/python/reference_psd.py
@@ -30,7 +30,10 @@ import math
 import numpy
 import os
 import scipy
-import scipy.fftpack
+try:
+	from pyfftw.interfaces import scipy_fftpack as fftpack
+except ImportError:
+	from scipy import fftpack
 from scipy import interpolate
 import sys
 import signal
@@ -375,19 +378,14 @@ def psd_to_linear_phase_whitening_fir_kernel(psd, invert = True):
 	if invert:
 		data_nonzeros = (data != 0.)
 		data[data_nonzeros] = 1./data[data_nonzeros]
-	try:
-		kernel = scipy.fftpack.idct(numpy.sqrt(data), type = 1) / (2 * len(data) - 1)
-		kernel = numpy.hstack((kernel[::-1], kernel[1:]))
-	except AttributeError:
-		# this computer's scipy.fftpack is missing idct()
-		# repack data:  data[0], data[1], 0, data[2], 0, ....
-		tmp = numpy.zeros((2 * len(data) - 1,), dtype = data.dtype)
-		tmp[0] = data[0]
-		tmp[1::2] = data[1:]
-		data = tmp
-		del tmp
-		kernel = scipy.fftpack.irfft(numpy.sqrt(data))
-		kernel = numpy.roll(kernel, (len(kernel) - 1) / 2)
+	# repack data:  data[0], data[1], 0, data[2], 0, ....
+	tmp = numpy.zeros((2 * len(data) - 1,), dtype = data.dtype)
+	tmp[0] = data[0]
+	tmp[1::2] = data[1:]
+	data = tmp
+	del tmp
+	kernel = fftpack.irfft(numpy.sqrt(data))
+	kernel = numpy.roll(kernel, (len(kernel) - 1) / 2)
 
 	#
 	# apply a Tukey window whose flat bit is 50% of the kernel.
@@ -428,14 +426,14 @@ def linear_phase_fir_kernel_to_minimum_phase_whitening_fir_kernel(linear_phase_k
 	# compute abs of FFT of kernel
 	#
 
-	absX = abs(scipy.fftpack.fft(linear_phase_kernel))
+	absX = abs(fftpack.fft(linear_phase_kernel))
 
 	#
 	# compute the cepstrum of the kernel
 	# (i.e., the iFFT of the log of the abs of the FFT of the kernel)
 	#
 
-	cepstrum = scipy.fftpack.ifft(scipy.log(absX))
+	cepstrum = fftpack.ifft(scipy.log(absX))
 
 	#
 	# compute sgn
@@ -450,13 +448,13 @@ def linear_phase_fir_kernel_to_minimum_phase_whitening_fir_kernel(linear_phase_k
 	# compute theta
 	#
 
-	theta = -1.j * scipy.fftpack.fft(sgn * cepstrum)
+	theta = -1.j * fftpack.fft(sgn * cepstrum)
 
 	#
 	# compute minimum phase kernel
 	#
 
-	minimum_phase_kernel = scipy.real(scipy.fftpack.ifft(absX * scipy.exp(1.j * theta)))
+	minimum_phase_kernel = scipy.real(fftpack.ifft(absX * scipy.exp(1.j * theta)))
 
 	#
 	# this kernel needs to be reversed to follow conventions used with the
-- 
GitLab