PyQa40x-i2c 0.2.2__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/PKG-INFO +1 -1
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/RELEASE_NOTES.md +8 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/_version.py +3 -3
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/analyzer.py +65 -13
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/stream.py +26 -14
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x_i2c.egg-info/PKG-INFO +1 -1
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x_i2c.egg-info/scm_file_list.json +46 -46
- pyqa40x_i2c-0.3.1/src/PyQa40x_i2c.egg-info/scm_version.json +8 -0
- pyqa40x_i2c-0.2.2/src/PyQa40x_i2c.egg-info/scm_version.json +0 -8
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/.github/workflows/code_checker.yml +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/.github/workflows/publish_package.yml +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/.github/workflows/unit_tests.yml +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/.gitignore +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/.pylint_ignore +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LICENSE +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/FirstPrinciples.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_acoustic_chirp_spl_bt.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_acoustic_dbspl.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_acoustic_energy_decay_bt.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_coherent_averaging.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_cross_correlation.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_freq_response_with_mask.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_pinknoise.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/PyQa40x_thdn.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/mask_freq.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/LibTest/mask_phase.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/MANIFEST.in +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/README.md +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/_ci/is_dev_version.sh +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/pyproject.toml +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/requirements-dev.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/requirements-test.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/requirements.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/setup.cfg +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/__init__.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/analyzer_params.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/bluetooth.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/control.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/cross_correlation.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/fft_processor.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/freq_series_plotter.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/helpers.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/math_chirp.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/math_energy.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/math_general.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/math_sines.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/math_windows.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/registers.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/series_plotter.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/sig_proc.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/wave.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/wave_chirp.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x/wave_sine.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x.egg-info/PKG-INFO +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x.egg-info/SOURCES.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x.egg-info/dependency_links.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x.egg-info/requires.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x.egg-info/top_level.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x_i2c.egg-info/SOURCES.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x_i2c.egg-info/dependency_links.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x_i2c.egg-info/requires.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/src/PyQa40x_i2c.egg-info/top_level.txt +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/tests/__init__.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/tests/test_template.py +0 -0
- {pyqa40x_i2c-0.2.2 → pyqa40x_i2c-0.3.1}/tox.ini +0 -0
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
### 0.3.1
|
|
2
|
+
|
|
3
|
+
[PATCH] Fix Stream.write() - ensure transfer queues not empty.
|
|
4
|
+
|
|
5
|
+
### 0.3.0
|
|
6
|
+
|
|
7
|
+
[MINOR] `Analyzer.init()` accepts `usb_serial` to open a specific QA402/QA403 by its USB serial number, so a PC with several analyzers can drive a chosen one. The argument is last and optional; without it the first analyzer found is opened, exactly as before.
|
|
8
|
+
|
|
1
9
|
### 0.2.2
|
|
2
10
|
|
|
3
11
|
[PATCH] Allow reliable streaming for higher sample rates (`96kHz`, `192kHz`).
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.
|
|
22
|
-
__version_tuple__ = version_tuple = (0,
|
|
21
|
+
__version__ = version = '0.3.1'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 3, 1)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'gaf795ecc5'
|
|
@@ -27,6 +27,9 @@ TRANSFER_BYTES_MAP = {
|
|
|
27
27
|
|
|
28
28
|
class Analyzer:
|
|
29
29
|
|
|
30
|
+
VENDOR_ID = 0x16C0
|
|
31
|
+
PRODUCT_IDS = (0x4E37, 0x4E39) # QA402, QA403
|
|
32
|
+
|
|
30
33
|
def __init__(self):
|
|
31
34
|
"""
|
|
32
35
|
Initializes the Analyzer class.
|
|
@@ -45,6 +48,55 @@ class Analyzer:
|
|
|
45
48
|
self._dac_writer: threading.Thread | None = None # set in start_capture()
|
|
46
49
|
self._dac_writer_error: Exception | None = None # error from DAC writer thread
|
|
47
50
|
|
|
51
|
+
def _open_analyzer(self, usb_serial: str | None = None):
|
|
52
|
+
"""
|
|
53
|
+
Opens a QA402/QA403 analyzer on the USB bus.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
usb_serial (str | None): USB serial number of the analyzer to open.
|
|
57
|
+
None opens the first analyzer found, which is the behaviour of
|
|
58
|
+
every release before serial selection was added.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
usb1.USBDeviceHandle: Handle of the opened analyzer.
|
|
62
|
+
|
|
63
|
+
Raises:
|
|
64
|
+
SystemExit: If no analyzer is connected, or if none of the connected
|
|
65
|
+
analyzers has the requested serial number.
|
|
66
|
+
"""
|
|
67
|
+
if usb_serial is None:
|
|
68
|
+
for product_id in self.PRODUCT_IDS:
|
|
69
|
+
device = self.context.openByVendorIDAndProductID(
|
|
70
|
+
self.VENDOR_ID, product_id
|
|
71
|
+
)
|
|
72
|
+
if device is not None:
|
|
73
|
+
return device
|
|
74
|
+
raise SystemExit("No QA402/QA403 analyzer found")
|
|
75
|
+
|
|
76
|
+
connected: list[str] = []
|
|
77
|
+
for device in self.context.getDeviceList(skip_on_error=True):
|
|
78
|
+
if (
|
|
79
|
+
device.getVendorID() != self.VENDOR_ID
|
|
80
|
+
or device.getProductID() not in self.PRODUCT_IDS
|
|
81
|
+
):
|
|
82
|
+
continue
|
|
83
|
+
try:
|
|
84
|
+
serial = device.getSerialNumber()
|
|
85
|
+
except usb1.USBError as error:
|
|
86
|
+
# Unreadable serial (usually missing udev permissions): the
|
|
87
|
+
# device cannot be matched, so report it as unknown.
|
|
88
|
+
logging.warning("Cannot read serial of a QA40x analyzer: %s", error)
|
|
89
|
+
serial = None
|
|
90
|
+
if serial == usb_serial:
|
|
91
|
+
logging.info("Opening QA40x analyzer with serial %s", serial)
|
|
92
|
+
return device.open()
|
|
93
|
+
connected.append(repr(serial))
|
|
94
|
+
|
|
95
|
+
raise SystemExit(
|
|
96
|
+
f"No QA402/QA403 analyzer with serial {usb_serial!r} found "
|
|
97
|
+
f"(connected: {', '.join(connected) or 'none'})"
|
|
98
|
+
)
|
|
99
|
+
|
|
48
100
|
def init(
|
|
49
101
|
self,
|
|
50
102
|
sample_rate: int = 48000,
|
|
@@ -57,6 +109,7 @@ class Analyzer:
|
|
|
57
109
|
amplitude_unit: str = "dbv",
|
|
58
110
|
distortion_unit: str = "db",
|
|
59
111
|
bt_device_name: str = "",
|
|
112
|
+
usb_serial: str | None = None,
|
|
60
113
|
) -> AnalyzerParams:
|
|
61
114
|
"""
|
|
62
115
|
Initializes the analyzer hardware with the specified parameters.
|
|
@@ -72,6 +125,9 @@ class Analyzer:
|
|
|
72
125
|
amplitude_unit (str): Unit for amplitude measurements, default is "dbv".
|
|
73
126
|
distortion_unit (str): Unit for distortion measurements, default is "db".
|
|
74
127
|
bt_device_name (str): Name of the Bluetooth device to use. Default is empty.
|
|
128
|
+
usb_serial (str | None): USB serial number of the analyzer to open,
|
|
129
|
+
e.g. "4334_E3B6". Needed only when several analyzers are
|
|
130
|
+
connected. Default None opens the first QA402/QA403 found.
|
|
75
131
|
|
|
76
132
|
Returns:
|
|
77
133
|
AnalyzerParams: A class instance containing the hardware and parameter settings.
|
|
@@ -87,16 +143,12 @@ class Analyzer:
|
|
|
87
143
|
)
|
|
88
144
|
self.context = usb1.USBContext()
|
|
89
145
|
self.context.open()
|
|
90
|
-
self.chunk_size = TRANSFER_BYTES_MAP.get(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
0x16C0, 0x4E39
|
|
97
|
-
) # QA403
|
|
98
|
-
if self.device is None:
|
|
99
|
-
raise SystemExit("No QA402/QA403 analyzer found")
|
|
146
|
+
self.chunk_size = TRANSFER_BYTES_MAP.get(
|
|
147
|
+
sample_rate, Stream.DEFAULT_TRANSFER_BYTES
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Attempt to open the requested QA402/QA403 device, or the first one
|
|
151
|
+
self.device = self._open_analyzer(usb_serial)
|
|
100
152
|
self.device.resetDevice()
|
|
101
153
|
self.device.claimInterface(0)
|
|
102
154
|
|
|
@@ -330,7 +382,7 @@ class Analyzer:
|
|
|
330
382
|
interleaved_dac_data[1::2] = right_dac_data_float
|
|
331
383
|
|
|
332
384
|
# Convert to bytes, multiplying by max int value
|
|
333
|
-
max_int_value = 2
|
|
385
|
+
max_int_value = 2**31 - 1
|
|
334
386
|
interleaved_dac_data = (interleaved_dac_data * max_int_value).astype(np.int32)
|
|
335
387
|
|
|
336
388
|
num_ints_per_chunk = self.chunk_size // 4 # 32-bit ints, so 4 bytes per int
|
|
@@ -347,8 +399,8 @@ class Analyzer:
|
|
|
347
399
|
try:
|
|
348
400
|
for i in range(total_chunks):
|
|
349
401
|
chunk = interleaved_dac_data[
|
|
350
|
-
|
|
351
|
-
|
|
402
|
+
i * num_ints_per_chunk : (i + 1) * num_ints_per_chunk
|
|
403
|
+
]
|
|
352
404
|
buffer = struct.pack("<%di" % len(chunk), *chunk)
|
|
353
405
|
self.stream.write(buffer)
|
|
354
406
|
finally:
|
|
@@ -193,22 +193,34 @@ class Stream:
|
|
|
193
193
|
|
|
194
194
|
def write(self, buffer: bytes) -> None:
|
|
195
195
|
"""Submit one DAC playback buffer and one matching ADC read transfer."""
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
dac = self.device.getTransfer()
|
|
201
|
-
dac.setBulk(self.endpoint_write, buffer, self.transfer_helper,
|
|
202
|
-
self._epoch, self.TRANSFER_TIMEOUT_MS)
|
|
203
|
-
dac.submit()
|
|
204
|
-
self._pending_transfers.add(dac)
|
|
205
|
-
read = self.device.getTransfer()
|
|
206
|
-
read.setBulk(self.endpoint_read, len(buffer), self.transfer_helper,
|
|
207
|
-
self._epoch, self.TRANSFER_TIMEOUT_MS)
|
|
208
|
-
read.submit()
|
|
209
|
-
self._pending_transfers.add(read)
|
|
196
|
+
dac = self.device.getTransfer()
|
|
197
|
+
read = self.device.getTransfer()
|
|
198
|
+
# Enqueue before submit: a transfer can complete, and its callback
|
|
199
|
+
# drain the queue, before submit() returns.
|
|
210
200
|
self.dacQueue.put(dac)
|
|
211
201
|
self.adcQueue.put(read)
|
|
202
|
+
dac_submitted = read_submitted = False
|
|
203
|
+
with self._transfer_lock:
|
|
204
|
+
try:
|
|
205
|
+
if not self.running:
|
|
206
|
+
raise RuntimeError(
|
|
207
|
+
"Stream is not running; call start() first.")
|
|
208
|
+
dac.setBulk(self.endpoint_write, buffer, self.transfer_helper,
|
|
209
|
+
self._epoch, self.TRANSFER_TIMEOUT_MS)
|
|
210
|
+
dac.submit()
|
|
211
|
+
dac_submitted = True
|
|
212
|
+
self._pending_transfers.add(dac)
|
|
213
|
+
read.setBulk(self.endpoint_read, len(buffer), self.transfer_helper,
|
|
214
|
+
self._epoch, self.TRANSFER_TIMEOUT_MS)
|
|
215
|
+
read.submit()
|
|
216
|
+
read_submitted = True
|
|
217
|
+
self._pending_transfers.add(read)
|
|
218
|
+
except Exception:
|
|
219
|
+
if not dac_submitted:
|
|
220
|
+
self.dacQueue.get_nowait()
|
|
221
|
+
if not read_submitted:
|
|
222
|
+
self.adcQueue.get_nowait()
|
|
223
|
+
raise
|
|
212
224
|
|
|
213
225
|
def write_zeros(self, chunk_bytes: int = DEFAULT_TRANSFER_BYTES) -> None:
|
|
214
226
|
"""Feed the ADC pipeline with a zero DAC buffer (continuous capture)."""
|
|
@@ -1,58 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": [
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"MANIFEST.in",
|
|
8
|
-
"pyproject.toml",
|
|
3
|
+
".github/workflows/code_checker.yml",
|
|
4
|
+
".github/workflows/publish_package.yml",
|
|
5
|
+
".github/workflows/unit_tests.yml",
|
|
6
|
+
".gitignore",
|
|
9
7
|
".pylint_ignore",
|
|
10
8
|
"LICENSE",
|
|
11
|
-
"
|
|
9
|
+
"LibTest/FirstPrinciples.py",
|
|
10
|
+
"LibTest/PyQa40x_acoustic_chirp_spl_bt.py",
|
|
11
|
+
"LibTest/PyQa40x_acoustic_dbspl.py",
|
|
12
|
+
"LibTest/PyQa40x_acoustic_energy_decay_bt.py",
|
|
13
|
+
"LibTest/PyQa40x_coherent_averaging.py",
|
|
14
|
+
"LibTest/PyQa40x_cross_correlation.py",
|
|
15
|
+
"LibTest/PyQa40x_freq_response_with_mask.py",
|
|
16
|
+
"LibTest/PyQa40x_pinknoise.py",
|
|
17
|
+
"LibTest/PyQa40x_thdn.py",
|
|
18
|
+
"LibTest/mask_freq.txt",
|
|
19
|
+
"LibTest/mask_phase.txt",
|
|
20
|
+
"MANIFEST.in",
|
|
12
21
|
"README.md",
|
|
13
|
-
".
|
|
14
|
-
"
|
|
15
|
-
".
|
|
16
|
-
".
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"src/PyQa40x/
|
|
20
|
-
"src/PyQa40x/
|
|
21
|
-
"src/PyQa40x/
|
|
22
|
-
"src/PyQa40x/
|
|
23
|
-
"src/PyQa40x/
|
|
24
|
-
"src/PyQa40x/
|
|
25
|
-
"src/PyQa40x/registers.py",
|
|
26
|
-
"src/PyQa40x/math_windows.py",
|
|
27
|
-
"src/PyQa40x/math_energy.py",
|
|
28
|
-
"src/PyQa40x/math_chirp.py",
|
|
22
|
+
"RELEASE_NOTES.md",
|
|
23
|
+
"_ci/is_dev_version.sh",
|
|
24
|
+
"pyproject.toml",
|
|
25
|
+
"requirements-dev.txt",
|
|
26
|
+
"requirements-test.txt",
|
|
27
|
+
"requirements.txt",
|
|
28
|
+
"src/PyQa40x.egg-info/PKG-INFO",
|
|
29
|
+
"src/PyQa40x.egg-info/SOURCES.txt",
|
|
30
|
+
"src/PyQa40x.egg-info/dependency_links.txt",
|
|
31
|
+
"src/PyQa40x.egg-info/requires.txt",
|
|
32
|
+
"src/PyQa40x.egg-info/top_level.txt",
|
|
33
|
+
"src/PyQa40x/__init__.py",
|
|
29
34
|
"src/PyQa40x/analyzer.py",
|
|
30
35
|
"src/PyQa40x/analyzer_params.py",
|
|
31
|
-
"src/PyQa40x/
|
|
32
|
-
"src/PyQa40x/math_general.py",
|
|
36
|
+
"src/PyQa40x/bluetooth.py",
|
|
33
37
|
"src/PyQa40x/control.py",
|
|
34
|
-
"src/PyQa40x/
|
|
35
|
-
"src/PyQa40x/series_plotter.py",
|
|
38
|
+
"src/PyQa40x/cross_correlation.py",
|
|
36
39
|
"src/PyQa40x/fft_processor.py",
|
|
40
|
+
"src/PyQa40x/freq_series_plotter.py",
|
|
41
|
+
"src/PyQa40x/helpers.py",
|
|
42
|
+
"src/PyQa40x/math_chirp.py",
|
|
43
|
+
"src/PyQa40x/math_energy.py",
|
|
44
|
+
"src/PyQa40x/math_general.py",
|
|
45
|
+
"src/PyQa40x/math_sines.py",
|
|
46
|
+
"src/PyQa40x/math_windows.py",
|
|
47
|
+
"src/PyQa40x/registers.py",
|
|
48
|
+
"src/PyQa40x/series_plotter.py",
|
|
49
|
+
"src/PyQa40x/sig_proc.py",
|
|
37
50
|
"src/PyQa40x/stream.py",
|
|
38
|
-
"src/PyQa40x/
|
|
39
|
-
"src/PyQa40x/
|
|
40
|
-
"src/PyQa40x
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"src/PyQa40x.egg-info/top_level.txt",
|
|
45
|
-
"_ci/is_dev_version.sh",
|
|
46
|
-
"LibTest/PyQa40x_thdn.py",
|
|
47
|
-
"LibTest/PyQa40x_freq_response_with_mask.py",
|
|
48
|
-
"LibTest/mask_phase.txt",
|
|
49
|
-
"LibTest/PyQa40x_coherent_averaging.py",
|
|
50
|
-
"LibTest/FirstPrinciples.py",
|
|
51
|
-
"LibTest/PyQa40x_cross_correlation.py",
|
|
52
|
-
"LibTest/PyQa40x_pinknoise.py",
|
|
53
|
-
"LibTest/mask_freq.txt",
|
|
54
|
-
"LibTest/PyQa40x_acoustic_energy_decay_bt.py",
|
|
55
|
-
"LibTest/PyQa40x_acoustic_dbspl.py",
|
|
56
|
-
"LibTest/PyQa40x_acoustic_chirp_spl_bt.py"
|
|
51
|
+
"src/PyQa40x/wave.py",
|
|
52
|
+
"src/PyQa40x/wave_chirp.py",
|
|
53
|
+
"src/PyQa40x/wave_sine.py",
|
|
54
|
+
"tests/__init__.py",
|
|
55
|
+
"tests/test_template.py",
|
|
56
|
+
"tox.ini"
|
|
57
57
|
]
|
|
58
58
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|