-
SONAR (Sound Of Navigation And Ranging, 음파탐지기) 구현 - 002사이드 프로젝트 2026. 4. 12. 15:09
코드가 길지 않으니 한줄씩 살펴보겠다.
import matplotlib.pyplot as plt import numpy as np from scipy.signal import chirp import sounddevice as sdmatplotlib, numpy 는 설명할 필요 없을것 같고, chirp 는 scipy 안의 signal 이라는 신호처리용 라이브러리의 chirp를 사용한다.
그리고 sounddevice 는 소리 관련 장치를 사용하기 위한 라이브러리이다.fs = 44100 t = np.linspace(0, 0.02, int(fs*0.02)) # 20ms # chirp 생성 (100Hz → 8kHz) signal = chirp(t, f0=100, f1=8000, t1=0.02)fs 는 sampling rate 인데, 1초에 몇개의 샘플을 뽑을 것이냐 하는 비율이다. 44,100 은 1초에 샘플을 44,100개 뽑겠다는 뜻.
t = np.linspace(0, 0.02, int(fs*0.02)) # 20ms
0 부터 0.02 까지 int(fs*0.02) 개 시간 포인트를 생성한다. → 0.02/882 간격으로 882개 샘플 생성signal = chirp(t, f0=100, f1=8000, t1=0.02)
이 뜻은 t 시간 포인트들에 대해 주파수를 100Hz부터 8000Hz 까지 t1 값인 0.02 초 동안 올리며 신호를 생성해라. 라는 뜻이다.
이때 t1 값은 t의 끝점 값과 맞추는게 관례라고 한다. 이렇게 만들어진 신호는 아래와 같은 모양이 된다.
생성된 chrip 신호 다음 줄인
recording = sd.playrec(signal, samplerate=fs, channels=1) sd.wait()은 신호를 내보내고 녹음을 한다는 뜻이다.
recording = sd.playrec(signal, samplerate=fs, channels=1)
playrec: play + record, 즉 스피커로 소리를 내보내면서 마이크로 녹음을 하겠다는 뜻- signal: 출력할 소리 데이터
- numpy 배열
- 실제로 스피커에서 출력되는 파형
- samplerate: 1초에 몇개 샘플을 쓸지 (fs: 44,100)
- channels: 채널 수
- 1: mono (마이크 한개)
- 2: stereo (왼쪽/오른쪽)
sd.wait(): 재생 + 녹음 끝날 때까지 기다려라.
즉 이 코드까지 실행한 뒤에는 signal을 생성하고, 출력하고, 녹음까지 완료되게 된다. 그리고 그렇게 녹음된 recording와 출력했던 신호인 signal 을 이용해 correlation(상관관계) 를 구한다. corr 값이 max 인 지점을 물체에 신호가 반사되어서 돌아온 신호라고 보고, 걸린 시간을 계산한다. 그리고 음속과 걸린 시간을 이용해 물체와의 거리를 계산하는 것이다.
'사이드 프로젝트' 카테고리의 다른 글
SONAR (Sound Of Navigation And Ranging, 음파탐지기) 구현 - 003 (0) 2026.04.12 SONAR (Sound Of Navigation And Ranging, 음파탐지기) 구현 - 001 (0) 2026.04.11 - signal: 출력할 소리 데이터