This commit is contained in:
Arne van Iterson 2024-04-11 10:47:45 +02:00
commit 48169776dc
6 changed files with 110 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
doc/*/*.* doc/*/*.*
!doc/*/*.tex !doc/*/*.tex
!doc/*/*.bib !doc/*/*.bib
*.cpython-311.pyc

View File

@ -38,3 +38,15 @@ Description of PCB design choices.
Measurement reports for aforementioned experiments. Measurement reports for aforementioned experiments.
- Arne van Iterson - Arne van Iterson
- Tom Selier - Tom Selier
## Scripts
This repository contains scripts to assist in parsing data obtained from a Tektronix oscilloscope
### `./scripts/reflection.py`
A script containing the neccessary steps to find peaks and measure the peaks and throughs of a 1d signal.
### `./scripts/reader.py`
A module containing a class to read data from a tektronix oscilloscope.
### `./scripts/helper.py`
A module containing a function that slices array based on time.

BIN
requirements.txt Normal file

Binary file not shown.

17
scripts/helper.py Normal file
View File

@ -0,0 +1,17 @@
# {'TIME': [data], 'CH1': [data], 'CH2': [data]}
def cut_time(data : dict, start : float, end : float) -> dict:
idx_start = 0
idx_end = 0
for idx, t in enumerate(data['TIME']):
if t > start and idx_start == 0:
idx_start = idx
if t > end and idx_end == 0:
idx_end = idx
if idx_end != 0 and idx_start != 0:
break
if idx_end != 0 and idx_start != 0:
return {key: value[idx_start:idx_end] for key, value in data.items()}
else:
return None

35
scripts/reader.py Normal file
View File

@ -0,0 +1,35 @@
import csv
class Reader():
def __init__(self) -> None:
pass
def read_file(self, filename) -> dict:
with open(filename, 'r') as file:
data = list(csv.reader(file, delimiter=','))
# Delete metadata for now
for i in range(15):
data.pop(0)
# {'TIME': [data], 'CH1': [data], 'CH2': [data]}
channels = []
for i in range(len(data[0])):
channels.append([])
for step in data[1:]:
for idx, point in enumerate(step):
channels[idx].append(float(point))
result = {}
for idx, label in enumerate(data[0]):
result[label] = channels[idx]
return result
if __name__ == '__main__':
reader = Reader()
data = reader.read_file(r".\data\T0007ALL.csv")
print(data)

45
scripts/reflection.py Normal file
View File

@ -0,0 +1,45 @@
from matplotlib import pyplot as plt
from scipy import signal
import numpy as np
import reader
import helper
# load data
data_reader = reader.Reader()
data = data_reader.read_file(r".\data\T0004CH1.csv")
# slice empty space, start and end time is in seconds
data = helper.cut_time(data, -1e-7, 5e-7)
# find peaks, use max to find the highest, or a threshold
# adjust width to find the middle of a peak (width is in indices)
# peaks, _ = signal.find_peaks(data['CH1'], max(data['CH1']))
peaks, _ = signal.find_peaks(data['CH1'], 2, width=10)
# find throughs, comment away it finds too many throughs
# invert = [-x for x in data['CH1']]
# throughs, _ = signal.find_peaks(invert, max(invert))
# peaks = np.concatenate([peaks, throughs])
# store time step
step = data['TIME'][1] - data['TIME'][0]
# do some calcs
idx_diff = peaks[-1] - peaks[0]
tim_diff = idx_diff*step
print(f"Time between peaks: {tim_diff*1e9:.1f} ns")
c = 299792458
k = 0.66
c_coax = c * k
print(f"Measured distance: {(tim_diff/2)*c_coax:.2f} m")
# Plot data
plt.plot(data['TIME'], data['CH1'])
if len(peaks) > 0:
for peak in peaks:
plt.vlines(
peak*step+data['TIME'][0],
min(data['CH1']),
max(data['CH1']), 'red', 'dashed')
plt.grid()
plt.show()