File input/output

Touchstone import

import_touchstone_smatrix

Imports an S matrix frequency sweep from a touchstone file.

Example

import ipkiss3.all as i3
from ipkiss3.io.touchstone import import_touchstone_smatrix
import matplotlib.pyplot as plt
import numpy as np
touchstone_4port = """! 4-port S-parameter data, taken at three frequency points
# GHZ S MA R 50
5.00000 0.60 161.24 0.40 -42.20 0.42 -66.58 0.53 -79.34 !row 1
        0.40 -42.20 0.60 161.20 0.53 -79.34 0.42 -66.58 !row 2
        0.42 -66.58 0.53 -79.34 0.60 161.24 0.40 -42.20 !row 3
        0.53 -79.34 0.42 -66.58 0.40 -42.20 0.60 161.24 !row 4
6.00000 0.57 150.37 0.40 -44.34 0.41 -81.24 0.57 -95.77 !row 1
        0.40 -44.34 0.57 150.37 0.57 -95.77 0.41 -81.24 !row 2
        0.41 -81.24 0.57 -95.77 0.57 150.37 0.40 -44.34 !row 3
        0.57 -95.77 0.41 -81.24 0.40 -44.34 0.57 150.37 !row 4
7.00000 0.50 136.69 0.45 -46.41 0.37 -99.09 0.62 -114.19 !row 1
        0.45 -46.41 0.50 136.69 0.62 -114.19 0.37 -99.09 !row 2
        0.37 -99.09 0.62 -114.19 0.50 136.69 0.45 -46.41 !row 3
        0.62 -114.19 0.37 -99.09 0.45 -46.41 0.50 136.69 !row 4
"""
fn = "touchstone_4port_example.s4p"

with open(fn, 'w') as f:
    f.write(touchstone_4port)

term_mode_map = {("opt1", 0): 0,
                 ("opt2", 0): 1,
                 ("opt3", 0): 2,
                 ("opt4", 0): 3
                }

S = import_touchstone_smatrix(fn, term_mode_map=term_mode_map)

plt.figure()
plt.plot(S.sweep_parameter_values, np.abs(S["opt2", "opt1"])**2, 'o--', label='opt1->opt2', markersize=5)
plt.plot(S.sweep_parameter_values, np.abs(S["opt3", "opt1"])**2, 'o--', label='opt1->opt3', markersize=5)
plt.plot(S.sweep_parameter_values, np.abs(S["opt4", "opt1"])**2, 'o--', label='opt1->opt4', markersize=5)
plt.xlabel('frequency [GHz]')
plt.ylabel('magnitude')
plt.title('S-parameters')
plt.legend()
plt.show()
../../../_images/index-13.png

Touchstone export

export_touchstone_smatrix

Exports an S matrix frequency / wavelength sweep to a touchstone file.

Example

from ipkiss3.io.touchstone import import_touchstone_smatrix, export_touchstone_smatrix

term_mode_map = {
    ("opt1", 0): 0,
    ("opt2", 0): 1,
    ("opt3", 0): 2,
    ("opt4", 0): 3
}

S = import_touchstone_smatrix(filename="touchstone_4port_example.s4p", term_mode_map=term_mode_map)
# change the format to real / imaginary instead of magnitude / angle
export_touchstone_smatrix(smatrix1dsweep=S, filename="touchstone_4port_example_export", param_format='RI')

""" The resulting output should be the following

! Touchstone file export by IPKISS
! Luceda port opt4: mode 0:3
! Luceda port opt2: mode 0:1
! Luceda port opt3: mode 0:2
! Luceda port opt1: mode 0:0
# GHz S RI R 50.0
5.0  -0.56812440798159958   0.19296283853518795   0.29632183851470006  -0.26868823572919609 ...
      0.29632183851470006  -0.26868823572919609   -0.5679895560694177   0.19335941713830671 ...
      0.16693665375723588  -0.38539869438327984   0.09803970583787712  -0.52085335371793717 ...
      0.09803970583787712  -0.52085335371793717   0.16693665375723588  -0.38539869438327984 ...
6.0  -0.49546462429403598   0.28180632724119187   0.28608198939291601  -0.27956590519051411 ...
      0.28608198939291601  -0.27956590519051411  -0.49546462429403598   0.28180632724119187 ...
     0.062441313054034865  -0.40521732739862937 -0.057305158068901609  -0.56711208668013613 ...
     0.057305158068901609  -0.56711208668013613  0.062441313054034865  -0.40521732739862937 ...
7.0   -0.3638265243449566    0.3429726813946975   0.31027191362976669  -0.32593149527549903 ...
      0.31027191362976669  -0.32593149527549903   -0.3638265243449566    0.3429726813946975 ...
     0.058454719591767589  -0.36535331633563672  -0.25405357621626995  -0.56555882135435209 ...
     -0.25405357621626995  -0.56555882135435209 -0.058454719591767589  -0.36535331633563672 ...
"""