ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 sd

    matplotlib, 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 인 지점을 물체에 신호가 반사되어서 돌아온 신호라고 보고, 걸린 시간을 계산한다. 그리고 음속과 걸린 시간을 이용해 물체와의 거리를 계산하는 것이다.

Designed by Tistory.