import%20marimo%0A%0A__generated_with%20%3D%20%220.23.9%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20%E3%81%93%E3%81%AE%E6%95%99%E6%9D%90%E3%81%A7%E4%BD%BF%E3%81%86%E5%85%AC%E9%96%8BAPI%E3%81%A8%E8%A1%A8%E5%BD%A2%E5%BC%8F%E3%81%AE%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%0A%20%20%20%20import%20io%0A%20%20%20%20import%20pathlib%0A%20%20%20%20import%20tempfile%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20soundfile%20as%20sf%0A%0A%20%20%20%20import%20wandas%20as%20wd%0A%20%20%20%20from%20wandas%20import%20pipeline%20as%20pipeline_api%0A%0A%20%20%20%20return%20io%2C%20mo%2C%20np%2C%20pathlib%2C%20pd%2C%20pipeline_api%2C%20sf%2C%20tempfile%2C%20wd%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20%E5%8F%82%E7%85%A7%E4%BF%A1%E5%8F%B7%E3%81%8B%E3%82%89%E6%A0%A1%E6%AD%A3%E3%81%97%E3%80%81%E6%97%A2%E7%9F%A5%E3%81%AE%E6%A0%A1%E6%AD%A3%E5%80%A4%E3%82%82%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%B8%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E3%83%9E%E3%82%A4%E3%82%AF%E3%82%84%E5%8A%A0%E9%80%9F%E5%BA%A6%E8%A8%88%E3%81%AF%E3%80%81%E6%97%A2%E7%9F%A5%E3%81%AE%E7%89%A9%E7%90%86%E5%85%A5%E5%8A%9B%E3%82%92%E5%88%A5%E3%80%85%E3%81%AB%E5%8F%8E%E9%8C%B2%E3%81%97%E3%81%A6%E6%A0%A1%E6%AD%A3%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60derive_calibration()%60%E3%81%A7%E5%8F%82%E7%85%A7%E5%8F%8E%E9%8C%B2%E3%81%8B%E3%82%89%E4%BF%82%E6%95%B0%E3%82%92%E5%B0%8E%E5%87%BA%E3%81%97%E3%80%81%60with_calibration()%60%E3%81%A7%E6%B8%AC%E5%AE%9A%E3%81%B8%E9%81%A9%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%80%81%E8%A8%AD%E5%82%99%E5%8F%B0%E5%B8%B3%E3%80%81CSV%E3%81%A7%E3%81%99%E3%81%A7%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%9F%E4%BF%82%E6%95%B0%E3%81%AB%E3%82%82%E5%90%8C%E3%81%98%E9%81%A9%E7%94%A8API%E3%82%92%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E6%95%99%E6%9D%90%E3%81%A7%E3%81%AF%E6%AC%A1%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%201.%20%E5%88%A5%E9%8C%B2%E3%82%8A%E3%81%AE94%20dB%E3%83%9E%E3%82%A4%E3%82%AF%E5%8F%82%E7%85%A7%E3%81%A81%20m%2Fs%C2%B2%E5%8A%A0%E9%80%9F%E5%BA%A6%E5%8F%82%E7%85%A7%E3%82%92%60wd.read()%60%E3%81%A7%E8%AA%AD%E3%82%80%0A%20%20%20%202.%20%E5%B0%8E%E5%87%BA%E3%81%97%E3%81%9Flabel%20mapping%E3%82%92%E7%B5%90%E5%90%88%E3%81%97%E3%80%81%E5%A4%9Ach%E6%B8%AC%E5%AE%9A%E3%81%B8%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%20%20%20%203.%20CSV%E3%82%84list%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%9F%E6%97%A2%E7%9F%A5%E4%BF%82%E6%95%B0%E3%82%82%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%20%20%20%204.%20%E6%A0%A1%E6%AD%A3%E5%BE%8C%E3%81%AE%E5%80%A4%E3%82%92%60frame.data%60%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81Recipe%E3%82%84WDF%E3%81%A7%E3%82%82%E5%86%8D%E7%8F%BE%E3%81%99%E3%82%8B%0A%0A%20%20%20%20Wandas%E3%81%8C%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AFdecode%E8%A6%8F%E5%89%87%E3%81%A8transport%E9%96%93%E3%81%AE%E5%90%8C%E4%B8%80%E6%80%A7%E3%81%A7%E3%81%99%E3%80%82%E5%8F%82%E7%85%A7%E5%8F%8E%E9%8C%B2%E3%81%A8%E6%B8%AC%E5%AE%9A%E5%8F%8E%E9%8C%B2%E3%81%A7%0A%20%20%20%20%E3%82%A2%E3%83%B3%E3%83%97gain%E3%82%92%E5%90%AB%E3%82%80%E5%8F%8E%E9%8C%B2%E7%B3%BB%E3%81%8C%E5%90%8C%E3%81%98%E3%81%93%E3%81%A8%E3%81%AF%E3%80%81%E5%88%A9%E7%94%A8%E8%80%85%E3%81%8C%E6%BA%80%E3%81%9F%E3%81%99%E7%89%A9%E7%90%86%E7%9A%84%E5%89%8D%E6%8F%90%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%88%A5%E3%80%85%E3%81%AE%E5%8F%82%E7%85%A7%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8B%E3%82%89%E4%BF%82%E6%95%B0%E3%82%92%E5%B0%8E%E5%87%BA%E3%81%99%E3%82%8B%0A%0A%20%20%20%201%E5%9B%9E%E3%81%AE%E5%B0%8E%E5%87%BA%E3%81%AF%E3%80%8C1%E3%81%A4%E3%81%AE%E6%97%A2%E7%9F%A5%E7%89%A9%E7%90%86target%E3%82%92%E6%8C%81%E3%81%A4%E6%A0%A1%E6%AD%A3%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82%E3%83%9E%E3%82%A4%E3%82%AF%E3%81%A8%E5%8A%A0%E9%80%9F%E5%BA%A6%E8%A8%88%E3%81%AF%0A%20%20%20%20target%E3%80%81unit%E3%80%81%E5%8F%8E%E9%8C%B2%E6%99%82%E5%88%BB%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E5%88%A5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E3%80%81%E5%B0%8E%E5%87%BA%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E7%B5%90%E5%90%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%90%8C%E3%81%98target%E3%81%A7%E5%90%8C%E6%99%82%E3%81%AB%E5%8F%8E%E9%8C%B2%E3%81%97%E3%81%9F%E5%A4%9Ach%E5%8F%82%E7%85%A7%E3%81%AA%E3%82%89%E3%80%81scalar%20target%E3%81%8C%E5%85%A8ch%E3%81%B8broadcast%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pathlib%2C%20pd%2C%20sf%2C%20tempfile%2C%20wd)%3A%0A%20%20%20%20%23%203%E3%81%A4%E3%81%AE%E5%88%A5%E9%8C%B2%E3%82%8A%E9%9F%B3%E5%A3%B0%E3%82%92%E4%BD%9C%E3%82%8A%E3%80%81%E5%85%AC%E9%96%8Breader%E3%81%A0%E3%81%91%E3%81%A7%E5%8F%82%E7%85%A7%E3%81%A8%E6%B8%AC%E5%AE%9A%E3%82%92%E8%AA%AD%E3%82%80%0A%20%20%20%20calibration_directory%20%3D%20tempfile.TemporaryDirectory()%0A%20%20%20%20_calibration_root%20%3D%20pathlib.Path(calibration_directory.name)%0A%20%20%20%20_microphone_path%20%3D%20_calibration_root%20%2F%20%22microphone-reference.wav%22%0A%20%20%20%20_acceleration_path%20%3D%20_calibration_root%20%2F%20%22acceleration-reference.wav%22%0A%20%20%20%20_measurement_path%20%3D%20_calibration_root%20%2F%20%22measurement.wav%22%0A%20%20%20%20sf.write(_microphone_path%2C%20np.array(%5B0.5%2C%20-0.5%5D)%2C%208_000%2C%20subtype%3D%22DOUBLE%22)%0A%20%20%20%20sf.write(_acceleration_path%2C%20np.array(%5B0.25%2C%20-0.25%5D)%2C%208_000%2C%20subtype%3D%22DOUBLE%22)%0A%20%20%20%20sf.write(_measurement_path%2C%20np.array(%5B%5B1.0%2C%202.0%5D%2C%20%5B-1.0%2C%20-2.0%5D%5D)%2C%208_000%2C%20subtype%3D%22DOUBLE%22)%0A%0A%20%20%20%20microphone_reference%20%3D%20wd.read(_microphone_path%2C%20ch_labels%3D%5B%22microphone%22%5D)%0A%20%20%20%20acceleration_reference%20%3D%20wd.read(_acceleration_path%2C%20ch_labels%3D%5B%22accelerometer%22%5D)%0A%20%20%20%20multichannel_measurement%20%3D%20wd.read(%0A%20%20%20%20%20%20%20%20_measurement_path%2C%0A%20%20%20%20%20%20%20%20ch_labels%3D%5B%22microphone%22%2C%20%22accelerometer%22%5D%2C%0A%20%20%20%20)%0A%20%20%20%20_derived_by_label%20%3D%20%7B%0A%20%20%20%20%20%20%20%20**microphone_reference.derive_calibration(target_level%3D94.0%2C%20unit%3D%22Pa%22)%2C%0A%20%20%20%20%20%20%20%20**acceleration_reference.derive_calibration(target_rms%3D1.0%2C%20unit%3D%22m%2Fs%5E2%22)%2C%0A%20%20%20%20%7D%0A%20%20%20%20derived_measurement%20%3D%20multichannel_measurement.with_calibration(_derived_by_label)%0A%20%20%20%20_derived_summary%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22channel%22%3A%20derived_measurement.labels%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20derived_measurement.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%22%3A%20%5Bchannel.unit%20for%20channel%20in%20derived_measurement.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22physical%20first%20sample%22%3A%20derived_measurement.data%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%E5%88%A5%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E4%BF%82%E6%95%B0%E3%82%92%E7%B5%90%E5%90%88%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C**%22)%2C%20_derived_summary%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%8F%8E%E9%8C%B2%E5%80%A4%E3%81%A8%E7%89%A9%E7%90%86%E5%80%A4%E3%81%AE%E9%96%A2%E4%BF%82%E3%82%92%E4%BD%9C%E3%82%8B%0A%0A%20%20%20%20%E5%90%84%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AE%E6%95%B0%E5%80%A4%E5%87%A6%E7%90%86%E3%81%AB%E3%81%AF%20%60physical%20%3D%20recorded%20*%20factor%60%20%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60unit%60%E3%81%AF%E7%B5%90%E6%9E%9C%E3%81%AE%E7%89%A9%E7%90%86%E5%8D%98%E4%BD%8D%E3%80%81%60ref%60%E3%81%AF%E3%83%AC%E3%83%99%E3%83%AB%E5%80%A4%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E5%9F%BA%E6%BA%96%E5%80%A4%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%60ref%60%E3%81%AF%E5%8F%8E%E9%8C%B2%E5%80%A4%E3%81%B8%E6%8E%9B%E3%81%91%E3%82%8B%E4%BF%82%E6%95%B0%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%0A%20%20%20%20%E3%81%BE%E3%81%9A%E3%80%81%E3%83%9E%E3%82%A4%E3%82%AF%E3%81%A8%E5%8A%A0%E9%80%9F%E5%BA%A6%E8%A8%88%E3%82%92%E5%90%8C%E3%81%98Frame%E3%81%AB%E6%8C%81%E3%81%A4%E5%B0%8F%E3%81%95%E3%81%AA2ch%E4%BF%A1%E5%8F%B7%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20wd)%3A%0A%20%20%20%20%23%20%E9%9F%B3%E3%81%A8%E5%8A%A0%E9%80%9F%E5%BA%A6%E3%81%AE%E6%A0%A1%E6%AD%A3%E5%89%8D%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%92%E6%8C%81%E3%81%A42ch%20Frame%E3%82%92%E4%BD%9C%E3%82%8B%0A%20%20%20%20recorded_signal%20%3D%20wd.from_numpy(%0A%20%20%20%20%20%20%20%20np.array(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B10.0%2C%2020.0%2C%2030.0%2C%2040.0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.1%2C%200.2%2C%200.3%2C%200.4%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20sampling_rate%3D8_000%2C%0A%20%20%20%20%20%20%20%20ch_labels%3D%5B%22microphone%22%2C%20%22accelerometer%22%5D%2C%0A%20%20%20%20)%0A%20%20%20%20_recorded_preview%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20recorded_signal.data.T%2C%0A%20%20%20%20%20%20%20%20columns%3Drecorded_signal.labels%2C%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%E6%A0%A1%E6%AD%A3%E5%89%8D%E3%81%AE%E5%8F%8E%E9%8C%B2%E5%80%A4**%22)%2C%20_recorded_preview%5D)%0A%20%20%20%20return%20(recorded_signal%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20recorded_signal%2C%20wd)%3A%0A%20%20%20%20%23%202%E3%81%A4%E3%81%AE%E3%82%BB%E3%83%B3%E3%82%B5%E3%81%B8%E3%80%81%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E6%97%A2%E7%9F%A5%E4%BF%82%E6%95%B0%E3%81%A8%E7%89%A9%E7%90%86%E9%A0%98%E5%9F%9F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%0A%20%20%20%20configured_signal%20%3D%20recorded_signal.with_calibration(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20wd.ChannelCalibration(factor%3D0.02%2C%20unit%3D%22Pa%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wd.ChannelCalibration(factor%3D9.81%2C%20unit%3D%22m%2Fs%5E2%22%2C%20ref%3D1.0)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20_recorded_values%20%3D%20recorded_signal.data%0A%20%20%20%20_physical_values%20%3D%20configured_signal.data%0A%20%20%20%20np.testing.assert_allclose(%0A%20%20%20%20%20%20%20%20_physical_values%2C%0A%20%20%20%20%20%20%20%20_recorded_values%20*%20np.array(%5B%5B0.02%5D%2C%20%5B9.81%5D%5D)%2C%0A%20%20%20%20)%0A%20%20%20%20_calibration_summary%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22channel%22%3A%20configured_signal.labels%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22recorded%20(first%20sample)%22%3A%20_recorded_values%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22physical%20(first%20sample)%22%3A%20_physical_values%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%22%3A%20%5Bchannel.unit%20for%20channel%20in%20configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ref%22%3A%20%5Bchannel.ref%20for%20channel%20in%20configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%E5%8F%8E%E9%8C%B2%E5%80%A4%20%C3%97%20factor%20%E3%81%8C%E7%89%A9%E7%90%86%E5%80%A4%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D**%22)%2C%20_calibration_summary%5D)%0A%20%20%20%20return%20(configured_signal%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A81%E6%AC%A1%E5%85%83NumPy%E9%85%8D%E5%88%97%E3%81%AF%E3%80%81**%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E9%A0%86%E3%81%AB%E5%AE%8C%E5%85%A8%E7%BD%AE%E6%8F%9B**%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E9%95%B7%E3%81%95%E3%81%8C%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82%60Pa%60%E3%81%AE%60ref%60%E3%81%AF%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B%E3%81%A8%0A%20%20%20%20%602e-5%60%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E5%8A%A0%E9%80%9F%E5%BA%A6%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%88%A5%E3%81%AE%E5%9F%BA%E6%BA%96%E5%80%A4%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AF%E6%98%8E%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E6%95%B0%E5%80%A4%E3%81%A0%E3%81%91%E3%82%92%E6%B8%A1%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E7%8F%BE%E5%9C%A8%E3%81%AE%60unit%60%E3%81%A8%60ref%60%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%97%E3%81%A6factor%E3%81%A0%E3%81%91%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%89%8D%E3%81%AEfactor%E3%81%A8%E3%81%AE%E6%8E%9B%E3%81%91%E7%AE%97%E3%81%AB%E3%81%AF%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E5%85%83%E3%81%AEFrame%E3%82%82%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(configured_signal%2C%20mo%2C%20pd)%3A%0A%20%20%20%20%23%20%E5%86%8D%E7%99%BA%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%9F%E4%BF%82%E6%95%B0%E3%81%A7factor%E3%81%A0%E3%81%91%E3%82%92%E7%BD%AE%E6%8F%9B%E3%81%97%E3%80%81%E5%85%83Frame%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%0A%20%20%20%20_reissued_signal%20%3D%20configured_signal.with_calibration(%5B0.025%2C%209.75%5D)%0A%20%20%20%20assert%20configured_signal.channels%5B0%5D.calibration.factor%20%3D%3D%200.02%0A%20%20%20%20assert%20_reissued_signal.channels%5B0%5D.unit%20%3D%3D%20%22Pa%22%0A%20%20%20%20assert%20_reissued_signal.channels%5B1%5D.ref%20%3D%3D%201.0%0A%0A%20%20%20%20_replacement_summary%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22channel%22%3A%20configured_signal.labels%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22before%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22after%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20_reissued_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%20preserved%22%3A%20%5Bchannel.unit%20for%20channel%20in%20_reissued_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**factor%E3%81%AF%E7%BD%AE%E6%8F%9B%E3%81%95%E3%82%8C%E3%80%81%E5%85%83Frame%E3%81%AF%E4%B8%8D%E5%A4%89**%22)%2C%20_replacement_summary%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20CSV%E7%AE%A1%E7%90%86%E8%A1%A8%E3%82%92%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E9%95%B7%E6%9C%9F%E9%81%8B%E7%94%A8%E3%81%A7%E3%81%AF%E3%80%81%E9%A0%86%E5%BA%8F%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%83%A9%E3%83%99%E3%83%AB%E6%8C%87%E5%AE%9A%E3%81%8C%E5%9F%BA%E6%9C%AC%E3%81%A7%E3%81%99%E3%80%82CSV%E3%81%AE%E8%A1%8C%E3%82%92%0A%20%20%20%20%60label%20-%3E%20ChannelCalibration%60%20%E3%81%AE%E8%BE%9E%E6%9B%B8%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8C%E3%81%B0%E3%80%81CSV%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%80%81%0A%20%20%20%20%E8%A8%AD%E5%82%99%E7%AE%A1%E7%90%86API%E3%81%AE%E3%81%A9%E3%82%8C%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%82Frame%E5%81%B4%E3%81%AE%E5%A5%91%E7%B4%84%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AECSV%E3%81%AF%E3%80%81Frame%E3%81%A8%E3%81%AF%E9%80%86%E3%81%AE%E9%A0%86%E5%BA%8F%E3%81%A7%E5%8A%A0%E9%80%9F%E5%BA%A6%E8%A8%88%E3%82%92%E5%85%88%E3%81%AB%E8%A8%98%E9%8C%B2%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(io%2C%20mo%2C%20pd)%3A%0A%20%20%20%20%23%20Frame%E3%81%A8%E3%81%AF%E9%80%86%E9%A0%86%E3%81%AECSV%E3%82%92%E8%AA%AD%E3%81%BF%E3%80%81%E5%A4%96%E9%83%A8%E7%AE%A1%E7%90%86%E8%A1%A8%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E8%A6%8B%E3%81%88%E3%82%8B%E5%BD%A2%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20calibration_table%20%3D%20pd.read_csv(%0A%20%20%20%20%20%20%20%20io.StringIO(%22channel%2Cfactor%2Cunit%2Cref%5Cnaccelerometer%2C9.79%2Cm%2Fs%5E2%2C1.0%5Cnmicrophone%2C0.021%2CPa%2C0.00002%5Cn%22)%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%E3%82%BB%E3%83%B3%E3%82%B5%E3%81%94%E3%81%A8%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%9F%E6%A0%A1%E6%AD%A3%E5%80%A4**%22)%2C%20calibration_table%5D)%0A%20%20%20%20return%20(calibration_table%2C)%0A%0A%0A%40app.cell%0Adef%20_(calibration_table%2C%20mo%2C%20pd%2C%20recorded_signal%2C%20wd)%3A%0A%20%20%20%20%23%20CSV%E3%81%AE%E5%90%84%E8%A1%8C%E3%82%92%E5%AE%8C%E5%85%A8%E3%81%AA%E6%A0%A1%E6%AD%A3%E5%80%A4%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%80%81%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E5%AF%BE%E5%BF%9C%E4%BB%98%E3%81%91%E3%82%8B%0A%20%20%20%20_calibration_by_label%20%3D%20%7B%0A%20%20%20%20%20%20%20%20str(row.channel)%3A%20wd.ChannelCalibration(%0A%20%20%20%20%20%20%20%20%20%20%20%20factor%3Dfloat(row.factor)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20unit%3Dstr(row.unit)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ref%3Dfloat(row.ref)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20for%20row%20in%20calibration_table.itertuples(index%3DFalse)%0A%20%20%20%20%7D%0A%20%20%20%20_csv_configured_signal%20%3D%20recorded_signal.with_calibration(_calibration_by_label)%0A%20%20%20%20_csv_result%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22frame%20order%22%3A%20_csv_configured_signal.labels%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20_csv_configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%22%3A%20%5Bchannel.unit%20for%20channel%20in%20_csv_configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20assert%20_csv_result%5B%22factor%22%5D.tolist()%20%3D%3D%20%5B0.021%2C%209.79%5D%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**CSV%E3%81%AE%E8%A1%8C%E9%A0%86%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C**%22)%2C%20_csv_result%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20unit%E3%81%A8ref%E3%81%8C%E3%81%99%E3%81%A7%E3%81%AB%E6%AD%A3%E3%81%97%E3%81%84Frame%E3%81%AA%E3%82%89%E3%80%81%E4%BF%82%E6%95%B0%E5%88%97%E3%81%A0%E3%81%91%E3%82%921%E6%AC%A1%E5%85%83NumPy%E9%85%8D%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E6%B8%A1%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E9%85%8D%E5%88%97%E3%81%AF%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E9%A0%86%E3%81%A7%E3%81%82%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E7%AE%A1%E7%90%86%E8%A1%A8%E3%82%92%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E4%B8%A6%E3%81%B9%E7%9B%B4%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(calibration_table%2C%20configured_signal%2C%20mo%2C%20pd)%3A%0A%20%20%20%20%23%20CSV%E3%81%AE%E4%BF%82%E6%95%B0%E5%88%97%E3%82%92Frame%E3%81%AE%E9%A0%86%E5%BA%8F%E3%81%B8%E4%B8%A6%E3%81%B9%E3%80%81NumPy%E9%85%8D%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%8C%E5%85%A8%E7%BD%AE%E6%8F%9B%E3%81%99%E3%82%8B%0A%20%20%20%20_ordered_factors%20%3D%20calibration_table.set_index(%22channel%22).loc%5Bconfigured_signal.labels%2C%20%22factor%22%5D.to_numpy()%0A%20%20%20%20_array_configured_signal%20%3D%20configured_signal.with_calibration(_ordered_factors)%0A%20%20%20%20_array_result%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22channel%22%3A%20_array_configured_signal.labels%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%20from%20array%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20_array_configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%20preserved%22%3A%20%5Bchannel.unit%20for%20channel%20in%20_array_configured_signal.channels%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%E4%BF%82%E6%95%B0%E5%88%97%E3%82%92%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E9%A0%86%E3%81%A7%E9%81%A9%E7%94%A8**%22)%2C%20_array_result%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20100ch%E3%82%921%E5%9B%9E%E3%81%AE%E6%93%8D%E4%BD%9C%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%81%8C%E5%A2%97%E3%81%88%E3%81%A6%E3%82%82%E3%80%81ch%E3%81%94%E3%81%A8%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%91%BC%E5%87%BA%E3%81%97%E3%81%AF%E4%B8%8D%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%E5%85%A8ch%E3%81%AA%E3%82%89%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%83%AA%E3%82%B9%E3%83%88%E3%80%81%0A%20%20%20%20%E4%B8%80%E9%83%A8%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%A0%E3%81%91%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E5%AF%BE%E8%B1%A1%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE%E8%BE%9E%E6%9B%B8%E3%82%921%E5%9B%9E%E6%B8%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%83%AA%E3%82%B9%E3%83%88%E3%82%82%E8%BE%9E%E6%9B%B8%E3%82%82ch%E6%95%B0%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E7%B7%9A%E5%BD%A2%E3%81%AB%E6%A4%9C%E8%A8%BC%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E5%90%8C%E3%81%98%E7%89%A9%E7%90%86%E9%A0%98%E5%9F%9F%E3%82%92%E6%8C%81%E3%81%A4%0A%20%20%20%20100%E5%8F%B0%E3%81%AE%E5%8A%A0%E9%80%9F%E5%BA%A6%E8%A8%88%E3%82%92%E6%83%B3%E5%AE%9A%E3%81%97%E3%80%81%E5%88%9D%E5%9B%9E%E3%81%AFfactor%E3%80%81unit%E3%80%81ref%E3%82%92%E5%90%AB%E3%82%80%E5%AE%8C%E5%85%A8%E3%81%AA%E6%A0%A1%E6%AD%A3%E5%80%A4%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20wd)%3A%0A%20%20%20%20%23%20%E7%AE%A1%E7%90%86%E8%A1%A8%E3%81%8B%E3%82%89%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F100%E6%A0%A1%E6%AD%A3%E5%80%A4%E3%82%92%E4%B8%80%E6%8B%AC%E8%A8%AD%E5%AE%9A%E3%81%97%E3%80%8110ch%E3%81%94%E3%81%A8%E3%81%AEfactor%E6%9B%B4%E6%96%B0%E3%82%92%E9%87%8D%E3%81%AD%E3%82%8B%0A%20%20%20%20_channel_count%20%3D%20100%0A%20%20%20%20_labels%20%3D%20%5Bf%22sensor-%7Bindex%3A03d%7D%22%20for%20index%20in%20range(_channel_count)%5D%0A%20%20%20%20_hundred_recorded%20%3D%20wd.from_numpy(%0A%20%20%20%20%20%20%20%20np.ones((_channel_count%2C%2016))%2C%0A%20%20%20%20%20%20%20%20sampling_rate%3D8_000%2C%0A%20%20%20%20%20%20%20%20ch_labels%3D_labels%2C%0A%20%20%20%20)%0A%20%20%20%20_all_factors%20%3D%201.0%20%2B%20np.arange(_channel_count)%20%2F%201_000%0A%20%20%20%20_all_calibrations%20%3D%20%5Bwd.ChannelCalibration(factor%3Dfloat(factor)%2C%20unit%3D%22m%2Fs%5E2%22%2C%20ref%3D1.0)%20for%20factor%20in%20_all_factors%5D%0A%20%20%20%20_configured_hundred%20%3D%20_hundred_recorded.with_calibration(_all_calibrations)%0A%20%20%20%20_partially_updated%20%3D%20_configured_hundred.with_calibration(%0A%20%20%20%20%20%20%20%20%7Bf%22sensor-%7Bindex%3A03d%7D%22%3A%202.0%20for%20index%20in%20range(0%2C%20_channel_count%2C%2010)%7D%0A%20%20%20%20)%0A%0A%20%20%20%20_hundred_values%20%3D%20_partially_updated.data%0A%20%20%20%20assert%20_partially_updated.n_channels%20%3D%3D%20100%0A%20%20%20%20assert%20_hundred_values.shape%20%3D%3D%20(100%2C%2016)%0A%20%20%20%20_inspect_indices%20%3D%20%5B0%2C%201%2C%2010%2C%2090%2C%2091%5D%0A%20%20%20%20_hundred_result%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22index%22%3A%20_inspect_indices%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22channel%22%3A%20%5B_partially_updated.labels%5Bindex%5D%20for%20index%20in%20_inspect_indices%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%22%3A%20%5B_partially_updated.channels%5Bindex%5D.calibration.factor%20for%20index%20in%20_inspect_indices%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22physical%20(first%20sample)%22%3A%20_hundred_values%5B_inspect_indices%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%22%3A%20%5B_partially_updated.channels%5Bindex%5D.unit%20for%20index%20in%20_inspect_indices%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**100ch%E3%81%AE%E3%81%86%E3%81%A1%E4%BB%A3%E8%A1%A85ch%E3%82%92%E7%A2%BA%E8%AA%8D**%22)%2C%20_hundred_result%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E6%A0%A1%E6%AD%A3%E5%BE%8C%E3%81%AE%E5%80%A4%E3%82%92%60data%60%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E5%88%A9%E7%94%A8%E8%80%85%E3%81%8C%E6%95%B0%E5%80%A4%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99%E5%85%A5%E5%8F%A3%E3%81%AF%60frame.data%60%E3%81%A7%E3%81%99%E3%80%82%60with_calibration()%60%E3%81%AF%E5%85%83%E3%81%AEFrame%E3%82%92%0A%20%20%20%20%E5%A4%89%E6%9B%B4%E3%81%9B%E3%81%9A%E3%80%81%E6%96%B0%E3%81%97%E3%81%84Frame%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82FFT%E3%81%AA%E3%81%A9%E3%81%AE%E5%BE%8C%E7%B6%9A%E5%87%A6%E7%90%86%E3%81%AB%E3%82%82%E6%A0%A1%E6%AD%A3%E5%BE%8C%E3%81%AE%E7%89%A9%E7%90%86%E5%80%A4%E3%81%8C%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E6%B8%A1%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(configured_signal%2C%20mo%2C%20np%2C%20pd%2C%20recorded_signal%2C%20wd)%3A%0A%20%20%20%20%23%20%E5%85%83Frame%E3%81%AE%E4%B8%8D%E5%A4%89%E6%80%A7%E3%81%A8%E3%80%81%E5%BE%8C%E7%B6%9A%E5%87%A6%E7%90%86%E3%81%8C%E6%A0%A1%E6%AD%A3%E6%B8%88%E3%81%BF%E3%81%AE%E5%80%A4%E3%82%92%E4%BD%BF%E3%81%86%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%0A%20%20%20%20_recorded_values%20%3D%20recorded_signal.data%0A%20%20%20%20_calibrated_values%20%3D%20configured_signal.data%0A%20%20%20%20np.testing.assert_array_equal(_recorded_values%5B0%5D%2C%20%5B10.0%2C%2020.0%2C%2030.0%2C%2040.0%5D)%0A%20%20%20%20np.testing.assert_allclose(_calibrated_values%5B0%5D%2C%20%5B0.2%2C%200.4%2C%200.6%2C%200.8%5D)%0A%20%20%20%20_spectrum%20%3D%20configured_signal.fft(n_fft%3D4%2C%20window%3D%22boxcar%22)%0A%20%20%20%20_expected_spectrum%20%3D%20wd.from_numpy(%0A%20%20%20%20%20%20%20%20_calibrated_values%2C%0A%20%20%20%20%20%20%20%20sampling_rate%3Dconfigured_signal.sampling_rate%2C%0A%20%20%20%20%20%20%20%20ch_labels%3Dconfigured_signal.labels%2C%0A%20%20%20%20%20%20%20%20ch_units%3D%5Bchannel.unit%20for%20channel%20in%20configured_signal.channels%5D%2C%0A%20%20%20%20).fft(n_fft%3D4%2C%20window%3D%22boxcar%22)%0A%20%20%20%20np.testing.assert_allclose(_spectrum.data%2C%20_expected_spectrum.data)%0A%0A%20%20%20%20_boundary_result%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%E7%A2%BA%E8%AA%8D%E5%AF%BE%E8%B1%A1%22%3A%20%5B%22%E6%A0%A1%E6%AD%A3%E5%89%8DFrame%E3%81%AE%E5%85%88%E9%A0%AD%E5%80%A4%22%2C%20%22%E6%A0%A1%E6%AD%A3%E5%BE%8CFrame%E3%81%AE%E5%85%88%E9%A0%AD%E5%80%A4%22%2C%20%22FFT%E3%81%8C%E7%89%A9%E7%90%86%E5%80%A4%E3%82%92%E4%BD%BF%E7%94%A8%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%E7%B5%90%E6%9E%9C%22%3A%20%5B_recorded_values%5B0%2C%200%5D%2C%20_calibrated_values%5B0%2C%200%5D%2C%20%22yes%22%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%60data%60%E3%81%8B%E3%82%89%E5%BE%8C%E7%B6%9A%E5%87%A6%E7%90%86%E3%81%BE%E3%81%A7%E5%90%8C%E3%81%98%E7%89%A9%E7%90%86%E5%80%A4%E3%82%92%E4%BD%BF%E7%94%A8**%22)%2C%20_boundary_result%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Recipe%E3%81%A8WDF%E3%81%A7%E5%AF%BE%E5%BF%9C%E9%96%A2%E4%BF%82%E3%82%92%E6%8C%81%E3%81%A1%E9%81%8B%E3%81%B6%0A%0A%20%20%20%20Recipe%E3%81%AF%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E4%BD%8D%E7%BD%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%E8%A7%A3%E6%B1%BA%E6%B8%88%E3%81%BF%E3%81%AE%E5%AE%89%E5%AE%9Ach%20ID%E3%81%A8%E6%A0%A1%E6%AD%A3%E5%80%A4%E3%81%AE%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E4%BF%9D%E6%8C%81%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20WDF%E3%81%AFFrame%E3%81%A8%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%A0%A1%E6%AD%A3%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20pipeline_api%2C%20recorded_signal%2C%20wd)%3A%0A%20%20%20%20%23%20%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E5%BE%8C%E3%81%AE%E6%A0%A1%E6%AD%A3%E6%93%8D%E4%BD%9C%E3%82%92Recipe%E5%8C%96%E3%81%97%E3%80%81%E5%85%83%E5%85%A5%E5%8A%9B%E3%81%B8%E5%90%8C%E3%81%98%E5%AF%BE%E5%BF%9C%E9%96%A2%E4%BF%82%E3%81%A7%E5%86%8D%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%0A%20%20%20%20_workflow%20%3D%20recorded_signal.get_channel(%5B1%2C%200%5D).with_calibration(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20wd.ChannelCalibration(9.81%2C%20%22m%2Fs%5E2%22%2C%201.0)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20wd.ChannelCalibration(0.02%2C%20%22Pa%22)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20_plan%20%3D%20pipeline_api.RecipePlan.from_frame(_workflow%2C%20input_names%3D(%22signal%22%2C))%0A%20%20%20%20_replayed%20%3D%20_plan.apply(%7B%22signal%22%3A%20recorded_signal%7D)%0A%20%20%20%20np.testing.assert_allclose(_replayed.data%2C%20_workflow.data)%0A%0A%20%20%20%20_recipe_result%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22channel%22%3A%20_replayed.labels%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%22%3A%20%5Bchannel.calibration.factor%20for%20channel%20in%20_replayed.channels%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22unit%22%3A%20%5Bchannel.unit%20for%20channel%20in%20_replayed.channels%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E3%82%92%E5%90%AB%E3%82%80Recipe%20replay%E3%81%AE%E7%B5%90%E6%9E%9C**%22)%2C%20_recipe_result%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(configured_signal%2C%20mo%2C%20np%2C%20pathlib%2C%20pd%2C%20tempfile%2C%20wd)%3A%0A%20%20%20%20%23%20%E4%B8%80%E6%99%82WDF%E3%82%92%E5%BE%80%E5%BE%A9%E3%81%97%E3%80%81data%E3%81%A8%E6%A0%A1%E6%AD%A3%E5%80%A4%E3%81%8C%E5%BE%A9%E5%85%83%E3%81%95%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%0A%20%20%20%20with%20tempfile.TemporaryDirectory()%20as%20_temporary_directory%3A%0A%20%20%20%20%20%20%20%20_wdf_path%20%3D%20pathlib.Path(_temporary_directory)%20%2F%20%22calibrated.wdf%22%0A%20%20%20%20%20%20%20%20configured_signal.save(_wdf_path)%0A%20%20%20%20%20%20%20%20_loaded_signal%20%3D%20wd.load(_wdf_path)%0A%20%20%20%20%20%20%20%20_loaded_physical%20%3D%20_loaded_signal.data%0A%20%20%20%20%20%20%20%20_loaded_factors%20%3D%20%5Bchannel.calibration.factor%20for%20channel%20in%20_loaded_signal.channels%5D%0A%0A%20%20%20%20np.testing.assert_allclose(_loaded_physical%2C%20configured_signal.data)%0A%20%20%20%20_wdf_result%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22preserved%22%3A%20%5B%22frame.data%22%2C%20%22calibration%20factors%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22result%22%3A%20%5B%22yes%22%2C%20str(_loaded_factors)%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bmo.md(%22**WDF%20round-trip%E3%81%A7%E4%BF%9D%E6%8C%81%E3%81%95%E3%82%8C%E3%81%9F%E5%86%85%E5%AE%B9**%22)%2C%20_wdf_result%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%BE%E3%81%A8%E3%82%81%0A%0A%20%20%20%20-%20%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%84CSV%E3%81%A7%E7%A2%BA%E5%AE%9A%E3%81%97%E3%81%9F%E5%8F%8E%E9%8C%B2%E5%80%A4%E3%81%8B%E3%82%89%E7%89%A9%E7%90%86%E5%80%A4%E3%81%B8%E3%81%AE%E4%BF%82%E6%95%B0%E3%82%92%60with_calibration()%60%E3%81%B8%E6%B8%A1%E3%81%99%0A%20%20%20%20-%20%E6%9C%80%E5%88%9D%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AF%60ChannelCalibration%60%E3%81%A7factor%E3%80%81unit%E3%80%81ref%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E9%95%B7%E6%9C%9F%E9%81%8B%E7%94%A8%E3%82%84%E9%83%A8%E5%88%86%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%AF%E3%83%A9%E3%83%99%E3%83%AB%E8%BE%9E%E6%9B%B8%E3%80%81%E5%AE%8C%E5%85%A8%E7%BD%AE%E6%8F%9B%E3%81%A7%E3%81%AF%E7%8F%BE%E5%9C%A8%E9%A0%86%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%8F1%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20-%20100ch%E3%81%A7%E3%82%82%E7%AE%A1%E7%90%86%E8%A1%A8%E3%81%8B%E3%82%89%E5%80%A4%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%80%811%E5%9B%9E%E3%81%AE%E6%93%8D%E4%BD%9C%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E6%A0%A1%E6%AD%A3%E5%BE%8C%E3%81%AE%E7%89%A9%E7%90%86%E5%80%A4%E3%81%AF%60frame.data%60%E3%81%8B%E3%82%89NumPy%E9%85%8D%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%0A%20%20%20%20-%20%E5%85%83%E3%81%AEFrame%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%89%E3%81%9A%E3%80%81%E6%B4%BE%E7%94%9FFrame%E3%80%81Recipe%E3%80%81WDF%E3%81%A7%E3%82%82%E5%90%8C%E3%81%98%E7%89%A9%E7%90%86%E5%80%A4%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%A7%E3%81%8D%E3%82%8B%0A%0A%20%20%20%20API%20signature%E3%81%AF%5BFrames%20API%20reference%5D(..%2Fapi%2Fframes%2F)%E3%82%92%E3%80%81WDF%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%AF%0A%20%20%20%20%5BWDF%20File%20I%2FO%5D(..%2Fapi%2Fwdf_io%2F)%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
e8e65b988bed91e1b2fe2690d0ad606b