-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWaveToCsvWithCalFile.py
More file actions
83 lines (60 loc) · 2.3 KB
/
WaveToCsvWithCalFile.py
File metadata and controls
83 lines (60 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import numpy as np
import pandas as pd
import os
import re
from scipy.io import wavfile
# ================= USER SETTINGS =================
cal_wav = r"F:\ONOSOKKI\LA7000\DATA\000001\REC\CAL_94dB_1kHz_TEST.wav"
test_wav_folder = r"F:\ONOSOKKI\LA7000\DATA\000001\REC\input"
output_folder = r"F:\ONOSOKKI\LA7000\DATA\000001\REC\output"
fs_expected = 64000 # Hz (confirmed from FAMOS)
dt_block = 0.01 # 10 ms
p_ref = 20e-6 # Pa
cal_skip = 0.5 # seconds to skip at start of cal file
cal_len = 3.0 # seconds used for calibration
eps = 1e-20
# =================================================
os.makedirs(output_folder, exist_ok=True)
# ---------- READ CALIBRATION WAV ----------
fs_cal, cal_sig = wavfile.read(cal_wav)
cal_sig = cal_sig.astype(np.float64)
if fs_cal != fs_expected:
print(f"⚠ Calibration fs = {fs_cal} Hz (expected {fs_expected})")
if cal_sig.ndim > 1:
cal_sig = cal_sig[:, 0]
i0 = int(cal_skip * fs_cal)
i1 = int((cal_skip + cal_len) * fs_cal)
cal_block = cal_sig[i0:i1]
Vrms_cal = np.sqrt(np.mean(cal_block * cal_block))
Pa_per_V = 1.0 / Vrms_cal # 94 dB = 1 Pa
print(f"Calibration applied: 1 Pa = {Vrms_cal:.6e} V")
# ---------- PROCESS TEST WAV FILES ----------
for fname in os.listdir(test_wav_folder):
if not fname.lower().endswith(".wav"):
continue
fs, sig = wavfile.read(os.path.join(test_wav_folder, fname))
sig = sig.astype(np.float64)
if fs != fs_expected:
print(f"⚠ Sample rate mismatch in {fname}: {fs} Hz")
if sig.ndim > 1:
sig = sig[:, 0]
sig_pa = sig * Pa_per_V
samples_per_block = int(fs * dt_block)
n_blocks = len(sig_pa) // samples_per_block
time = np.arange(n_blocks) * dt_block
dBA = []
for i in range(n_blocks):
block = sig_pa[i*samples_per_block:(i+1)*samples_per_block]
rms = np.sqrt(np.mean(block * block))
spl = 20 * np.log10(rms / p_ref + eps)
dBA.append(spl)
m = re.search(r"(A\d+)", fname)
run_id = m.group(1) if m else "UNK"
df = pd.DataFrame({
"Time": time,
f"dB_{run_id}": dBA
})
out_csv = fname.replace(".wav", "_10ms_dBA.csv")
df.to_csv(os.path.join(output_folder, out_csv), index=False)
print(f"Processed: {fname}")
print("✅ Calibrated WAV → dB(A) CSV conversion complete.")