Study/Forensics

Spectrogram

imaginefuture-1 2025. 3. 13. 22:14

🎧 스펙트로그램(Spectrogram) 완벽 정리!


🔍 1. 스펙트로그램이란?

스펙트로그램(Spectrogram)은 소리(오디오)의 주파수 변화를 시각적으로 보여주는 그래프야.
즉, "소리를 눈으로 볼 수 있게 만든 것" 이라고 생각하면 돼.

💡 쉽게 말하면, 스펙트로그램은 "소리의 색깔"을 보여주는 지도야.


🛠 2. 스펙트로그램의 구성

스펙트로그램 그래프는 다음과 같은 축을 가짐:

축 설명

X축 (가로축) 시간 (Time, 초 단위)
Y축 (세로축) 주파수 (Frequency, Hz 단위)
색상 (Brightness) 소리의 강도 (Amplitude, dB 단위)
  • X축: 시간이 흐르면서 소리가 어떻게 변하는지 나타냄.
  • Y축: 소리의 주파수를 나타냄 (낮은 Hz → 저음, 높은 Hz → 고음).
  • 색상 (밝기): 밝을수록 소리가 강함(시끄러움), 어두울수록 소리가 약함(조용함).

🎨 3. 스펙트로그램 예시

📌 예제 1: 단순한 "삐-" 소리 (단일 주파수)

  • 한 개의 주파수(예: 1000Hz)만 존재하면 얇은 가로선 하나가 나타남.

📌 예제 2: 사람이 말하는 소리

  • 다양한 주파수가 변하면서 복잡한 패턴이 보임.
  • 자음과 모음이 다르게 나타남.

📌 예제 3: 음악 (노래)

  • 다양한 주파수가 혼합되어 층층이 쌓인 복잡한 패턴을 형성함.

📌 예제 4: 오디오 스테가노그래피 (숨겨진 메시지)

  • 특정 패턴이 스펙트로그램에서 QR 코드 형태숨겨진 글자로 보일 수 있음.

🏗 4. 스펙트로그램은 어떻게 계산될까?

스펙트로그램을 만들려면 시간-주파수 변환이 필요해.
이걸 하기 위해 푸리에 변환 (Fourier Transform, FFT) 을 사용해!

🎵 💡 푸리에 변환이란?

모든 소리는 **여러 개의 주파수(파동)**가 합쳐진 것이야.
푸리에 변환을 사용하면, 복잡한 소리를 낮은 주파수, 높은 주파수로 분리할 수 있어.

📌 스펙트로그램 생성 과정

1️⃣ 오디오 신호를 작은 조각(윈도우, window)으로 나눔
→ 예: 0.01초 단위로 잘라서 분석

2️⃣ 각 조각에 대해 푸리에 변환 (FFT) 수행
해당 시점의 주파수 정보 추출

3️⃣ 주파수 세기에 따라 색상을 입힘
→ 강한 소리는 밝게, 약한 소리는 어둡게 표시

4️⃣ 모든 조각을 이어 붙이면 스펙트로그램 완성!

📝 결론

  • 오디오를 짧게 나눠서 분석 → 각각의 시간에서 푸리에 변환(FFT) 수행
  • 결과를 이미지로 표현하면 스펙트로그램이 됨.

🔥 5. 실전: 직접 스펙트로그램 만들기

📌 Linux에서 sox 사용

sox audio.wav -n spectrogram -o spectrogram.png

→ spectrogram.png 파일을 열어보면 소리의 패턴을 볼 수 있음.

📌 Python으로 스펙트로그램 만들기

import matplotlib.pyplot as plt
import numpy as np
from scipy.io import wavfile
from scipy.signal import spectrogram

# WAV 파일 불러오기
samplerate, data = wavfile.read("audio.wav")

# 스펙트로그램 계산
frequencies, times, Sxx = spectrogram(data, samplerate)

# 시각화
plt.pcolormesh(times, frequencies, 10 * np.log10(Sxx))
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [s]')
plt.colorbar(label='Intensity [dB]')
plt.show()

🎯 6. 결론

스펙트로그램 = 오디오의 주파수 변화를 시각적으로 보여주는 것
X축 = 시간, Y축 = 주파수, 색상 = 강도
✔ **푸리에 변환(FFT)**을 사용하여 소리를 주파수로 변환
오디오 스테가노그래피(숨겨진 메시지) 탐지에 유용
sox, Python을 활용하면 직접 분석 가능


🔥 이제 직접 spectrogram을 생성해서 숨겨진 패턴이 있는지 확인해보면 돼! 🚀