Skip to content

Commit 253a164

Browse files
committed
irfft: apply ramp function to prevent double-counting in asymmetric ifgs
1 parent 2175c01 commit 253a164

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

orangecontrib/spectroscopy/irfft.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ def find_zpd(ifg, peak_search):
5555
else:
5656
raise NotImplementedError
5757

58+
def wing_size(ifg, zpd):
59+
"""Calculate negative and positive wing size (including zpd point)"""
60+
wing_n = zpd + 1
61+
wing_p = ifg.shape[-1] - zpd
62+
return wing_n, wing_p
63+
5864
def apodize(ifg, zpd, apod_func):
5965
"""
6066
Perform apodization of asymmetric interferogram using selected apodization
@@ -80,8 +86,7 @@ def apodize(ifg, zpd, apod_func):
8086
# Calculate negative and positive wing size
8187
# correcting zpd from 0-based index
8288
ifg_N = ifg.shape[-1]
83-
wing_n = zpd + 1
84-
wing_p = ifg_N - zpd
89+
wing_n, wing_p = wing_size(ifg, zpd)
8590
# Use larger wing to define apodization window width
8691
M = max(wing_n, wing_p)
8792

@@ -132,6 +137,18 @@ def apodize(ifg, zpd, apod_func):
132137

133138
return ifg_apod
134139

140+
def ramp(ifg, zpd):
141+
wing_n, wing_p = wing_size(ifg, zpd)
142+
# Use smaller wing to define symmetric subset size
143+
M = min(wing_n, wing_p)
144+
ramp = np.linspace(0, 1, 2 * M - 1)
145+
if wing_n < wing_p:
146+
ifg[..., :ramp.shape[0]] *= ramp
147+
else:
148+
ifg[..., -ramp.shape[0]:] *= ramp[::-1]
149+
150+
return ifg
151+
135152
def _zero_fill_size(ifg_N, zff):
136153
# Calculate desired array size
137154
Nzff = ifg_N * zff
@@ -215,6 +232,7 @@ def __call__(self, ifg, zpd=None, phase=None):
215232
# Note that L is now the zpd index
216233
Ixs = ifg[self.zpd - L : self.zpd + L].copy()
217234
ifg = apodize(ifg, self.zpd, self.apod_func)
235+
ifg = ramp(ifg, self.zpd)
218236
ifg = zero_fill(ifg, self.zff)
219237
ifg = np.hstack((ifg[self.zpd:], ifg[0:self.zpd]))
220238
Nzff = ifg.shape[0]
@@ -300,6 +318,7 @@ def __call__(self, ifg, zpd=None, phase=None):
300318
# Note that L is now the zpd index
301319
Ixs = ifg[:, self.zpd - L : self.zpd + L].copy()
302320
ifg = apodize(ifg, self.zpd, self.apod_func)
321+
ifg = ramp(ifg, self.zpd)
303322
ifg = zero_fill(ifg, self.zff)
304323
ifg = np.hstack((ifg[:, self.zpd:], ifg[:, 0:self.zpd]))
305324
Nzff = ifg.shape[1]

orangecontrib/spectroscopy/tests/test_irfft.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from orangecontrib.spectroscopy.irfft import (IRFFT, zero_fill, PhaseCorrection,
99
find_zpd, PeakSearch, ApodFunc,
10-
MultiIRFFT, apodize,
10+
MultiIRFFT, apodize, ramp,
1111
)
1212

1313
dx = 1.0 / 15797.337544 / 2.0
@@ -19,6 +19,14 @@ def setUp(self):
1919
self.ifg_single = Orange.data.Table("IFG_single.dpt")
2020
self.ifg_seq_ref = Orange.data.Table("agilent/background_agg256.seq")
2121
self.sc_dat_ref = Orange.data.Table("agilent/background_agg256.dat")
22+
self.ifgs = {
23+
'even_sym': self.ifg_single.X[0],
24+
'odd_sym': self.ifg_single.X[0][1:],
25+
'even_asym': self.ifg_seq_ref.X[0][1:],
26+
'odd_asym': self.ifg_seq_ref.X[0],
27+
'even_asym_reverse': self.ifg_seq_ref.X[0][1:][::-1],
28+
'odd_asym_reverse': self.ifg_seq_ref.X[0][::-1],
29+
}
2230

2331
def test_zero_fill(self):
2432
N = 1975
@@ -144,18 +152,19 @@ def test_multi_ab(self):
144152
np.testing.assert_allclose(ab[:, limits[0]:limits[1]], dat, atol=0.004)
145153

146154
def test_apodization(self):
147-
ifgs = {
148-
'even_sym': self.ifg_single.X[0],
149-
'odd_sym': self.ifg_single.X[0][1:],
150-
'even_asym': self.ifg_seq_ref.X[0][1:],
151-
'odd_asym': self.ifg_seq_ref.X[0],
152-
'even_asym_reverse': self.ifg_seq_ref.X[0][1:][::-1],
153-
'odd_asym_reverse': self.ifg_seq_ref.X[0][::-1],
154-
}
155155
for apod_func in ApodFunc:
156-
for k, ifg in ifgs.items():
156+
for k, ifg in self.ifgs.items():
157157
with self.subTest(apod_func=apod_func.name, ifg=k):
158158
zpd = find_zpd(ifg, PeakSearch.ABSOLUTE)
159159
out = apodize(ifg, zpd, apod_func)
160160
# Apodization should not change value at zpd
161161
self.assertAlmostEqual(ifg[zpd], out[zpd])
162+
163+
def test_ramp(self):
164+
ifg = self.ifgs['odd_asym']
165+
zpd = find_zpd(ifg, PeakSearch.ABSOLUTE)
166+
ramp_fwd = ramp(ifg, zpd)
167+
ifg_rev = self.ifgs['odd_asym_reverse']
168+
zpd_rev = find_zpd(ifg_rev, PeakSearch.ABSOLUTE)
169+
ramp_rev = ramp(ifg_rev, zpd_rev)
170+
np.testing.assert_array_equal(ramp_fwd, ramp_rev[::-1])

0 commit comments

Comments
 (0)