728x90
반응형
오늘은 wav 파일을 바로 DAQ 에서 실행해보겠습니다.
예시 input wav는 macaron 에서 만들었습니다. :)
https://hapticdesign.github.io/macaron/
Macaron Editor
hapticdesign.github.io
In [3]:
import numpy as np
import soundfile as sf
import nidaqmx
import time
import matplotlib.pyplot as plt
# DAQ 설정값
samplingRate = 10000 # DAQ 샘플링 속도 (10kHz)
duration = 1 # 신호 지속 시간 (초)
# 1️⃣ WAV 파일 불러오기
wav_file = "input.wav" # 사용할 WAV 파일 경로
data, fs = sf.read(wav_file) # 오디오 데이터 불러오기
data
Out[3]:
array([ 0.046875 , 0.046875 , 0.0390625, ..., -0.0546875, -0.0625 , -0.0703125])
In [4]:
# 스테레오인 경우 한 채널만 사용
if len(data.shape) > 1:
data = np.mean(data, axis=1) # 모노 변환
# 2️⃣ DAQ 샘플링 속도에 맞게 리샘플링
num_samples = int(duration * samplingRate)
resampled_data = np.interp(np.linspace(0, duration, num_samples), np.linspace(0, duration, len(data)), data)
# 3️⃣ 신호 범위 스케일링 (진동자 전압 범위 고려)
max_voltage = 5 # 진동자 입력 전압 최대값 (±5V)
resampled_data = resampled_data / np.max(np.abs(resampled_data)) * max_voltage
# 4️⃣ DAQ 출력 전, 원본 WAV 신호 시각화
plt.figure(figsize=(10, 4))
plt.plot(np.linspace(0, duration, num_samples), resampled_data, label="Resampled WAV Signal", color='b')
plt.xlabel("Time (s)")
plt.ylabel("Amplitude (V)")
plt.legend()
plt.title("Resampled WAV Signal Before DAQ Output")
plt.grid()
plt.show()
In [6]:
# 5️⃣ DAQ를 이용하여 신호 출력 및 측정 함수
def accels_data(title, sig):
recorded_data = []
for i in range(1):
readtask = nidaqmx.Task()
writetask = nidaqmx.Task()
readtask.ai_channels.add_ai_voltage_chan("Dev1/ai0:2",
terminal_config=nidaqmx.constants.TerminalConfiguration.RSE,
min_val=-10, max_val=10)
readtask.timing.cfg_samp_clk_timing(samplingRate,
sample_mode=nidaqmx.constants.AcquisitionType.FINITE,
samps_per_chan=samplingRate * duration)
writetask.ao_channels.add_ao_voltage_chan("Dev1/ao0")
writetask.timing.cfg_samp_clk_timing(samplingRate,
sample_mode=nidaqmx.constants.AcquisitionType.FINITE,
samps_per_chan=samplingRate * duration)
writetask.write(sig)
writetask.start()
# DAQ에서 측정된 데이터 읽기
data = readtask.read(samplingRate * duration)
writetask.wait_until_done()
writetask.close()
readtask.close()
# 저장
with open(f"{title}_{i}.txt", "a") as f:
for j in range(samplingRate * duration):
f.write(f"{data[0][j]}\n") # X 축 데이터만 저장
time.sleep(2)
recorded_data.append(data)
return recorded_data
In [7]:
# 6️⃣ DAQ 출력 실행 및 측정
recorded_data = accels_data(title="Wav_Accels", sig=resampled_data)
In [8]:
# 7️⃣ DAQ 출력 후, 측정된 신호 시각화
plt.figure(figsize=(10, 4))
plt.plot(np.linspace(0, duration, samplingRate * duration), recorded_data[0][0], label="DAQ Measured Signal", color='r')
plt.xlabel("Time (s)")
plt.ylabel("Amplitude (V)")
plt.legend()
plt.title("DAQ Measured Signal After Output")
plt.grid()
plt.show()
해당 코드에는 아직 Calibration을 적용하지 않고 파형을 출력해서 그대로 나오지 않은 모습을 볼 수 있습니다 ㅜㅜ
728x90
반응형
'HCI > 이론' 카테고리의 다른 글
[Haptics - Dynamic compensation] Calibration Using NI DAQ, Python and Matlab (0) | 2025.02.25 |
---|---|
[Haptics - Dynamic compensation] Matlab에서 Chirp Signal 출력하기 (1) | 2025.02.25 |
[Haptics - Haptuator Single Frequency] Calibration Using NI DAQ and Python (0) | 2025.02.24 |
[Haptics] 진동 측정 캘리브레이션 이론 정리 (0) | 2025.02.18 |
[Haptics] Macaron 햅틱 디자인 툴 (0) | 2025.02.17 |