I saw Dielectric constant measurement for thin material at microwave frequencies and wanted to give it a try. This was done in WR-42 waveguide from 18 to 26.5 GHz. Samples were cut to 0.17 x 0.42 inches to fit the waveguide.
Relative Permittivity (Er)
|Material||Thickness||Er (measured)||Er (ref)|
|Polypropylene (pp)||736 μm||2.14||2.26 at 9.4 GHz|
|Polycarbonate (pc)||583 μm||2.7||2.77 at 11 GHz|
|Rogers RO4350B||509 μm||3.59||3.48/3.66 at 10 GHz|
|OSHPark 4 layer prepreg||205 μm||3.3||3.26 - 4.01|
|OSHPark 4 layer core||531 μm||4.02||3.26 - 4.01|
|GE Silicone II (white)||1.875 mm||2.64||unspecified|
The OSHPark 4 layer PCBs are made from Isola FR408. As shown in this document, the thicker cores and prepregs have higher glass content and thus higher Er. The 47 mil thick core is not listed in the above PDF, but would presumably be the heaviest glass and have an Er of around 4.0. The prepreg used for the outer layers is a fine glass weave with high resin content, so the measured value of 3.3 seems reasonable. The prepreg sample is very thin and has some taper, so that value may be the least reliable of the group. The core and prepreg samples were obtained by mechanically delaminating a finished PCB.
The RO4350B has a 10 GHz dielectric constant of 3.48 +- 0.05 using a clamped stripline method that tends to underestimate Er on hard materials like RO4350B. The recommended value for design is 3.66, so this measured value of 3.59 seems reasonable.
This is white caulk from a hardware store which I had purchased for my bathtub. The data on this one is questionable as it was hard to cut a precise block of this soft material. A silicone might be interesting as a directional coupler overlay.
These values are less reliable and noisy as the dissipation loss of the samples is on the order of 0.015 dB. The polypropylene has such low loss that errors are causing it to appear to have a negative loss tangent. The waveguide shim used as a sample holder was bare brass which certainly didn't help repeatability. The spikes in the silicone and osh_core traces are likely due to resonance within the sample as the section of guide containing the sample can support higher order modes.
Approximation not valid
The plot above shows the amount of error introduced by the assumption in the paper that the samples are thin. The data with _est uses the approximations for small values, \(\sin(kz_2\tau) \approx kz_2\tau\). With the smaller guide and higher frequencies used here versus the original paper, the assumption is not valid with reasonable thickness samples.
The value of Er is solved for using SciPy optimize.minimize. It's a bit ugly as it doesn't directly handle complex numbers, but gets the job done.
Try to do something similar in 7 mm coax.
The SParameter library (used for opening .s2p files, wgsection, S parameter concatenation) has not yet been released, so this is only useful for reference. The library is in C++ with SWIG wrappers and will be released as open source (GPLv3) when it is ready.
#!/usr/bin/env python3 import numpy as np import matplotlib.pyplot as plt import sys sys.path.append("../../") import SParameter as scpp from scipy.constants import c, inch import scipy.optimize a = 0.42 * inch # wide waveguide dimension in meters samples = [ # file name, thickness in meters ['pc.s2p', 583.0e-6], ['pp.s2p', 736.0e-6], ['ro4350b.s2p', 509e-6], ['osh_prepreg.s2p', 205e-6], ['osh_core.s2p', 531e-6], ['silicone.s2p', 1875e-6], ] for sample in samples: fn = sample t = sample # thickness sp = scpp.SParameter(fn) sp.reducefreqrange(50e6, 18e9, 26.5e9) # add an air filled section of guide the length of the sample te = scpp.wgsection(sp, a, t) sp = scpp.SParameter(te, sp) s = np.array(sp.s) s21 = 0.5 * (s[1::4] + s[2::4]) # average of s21, s12 f = np.array(sp.f) e = np.zeros(len(f), dtype=complex) for i in range(len(f)): wavelength = c / f[i] # free space wavelength kz = (np.pi/(wavelength*a)) * np.sqrt( 4.0*np.square(a)-np.square(wavelength)) def func(z): c = s21[i] - 1.0 / (np.cos(z) + 0.5j*kz*t*(1+np.square(z/(kz*t))) * np.sin(z)/(z)) return c.real*c.real + c.imag*c.imag b0 = [a.real, a.imag] # estimate, assumes Er = 1.0 res = scipy.optimize.minimize(lambda z: func(complex(z,z)), b0, tol=1e-6) kz2 = complex(res.x, res.x)/t e[i] = (np.square(kz2 * wavelength * a / np.pi) + np.square(wavelength))/(4*a*a) if sys.argv != 'loss': plt.plot(f/1e9,np.real(e), label=fn) plt.ylabel('Er') else: losstan = -np.imag(e)/np.real(e) plt.plot(f/1e9,losstan, label=fn) plt.ylabel('loss tangent') plt.xlabel('Frequency (GHz)') plt.legend(loc=4) plt.grid(True) plt.show()