안녕하세요. 파이썬으로 사인파, 사각파, 삼각파, 톱니파 음원을 만들어보겠습니다.
WAVE_TYPE에 원하는 파형을 입력하면 됩니다. ("sine" or "square" or "triangle" or "sawtooth")
WAV파일 파라미터에는 원하는 WAV파일 정보를 입력하면 됩니다.
파이썬을 실행시키면 아래와같은 wav파일이 소스코드가있는 디렉토리에 만들어집니다.
파일명은 <파형타입>_<주파수>Hz_<샘플레이트>Hz_<비트깊이>bit_<진폭(dBFS)>_<파일시간>sec.wav가 됩니다.

import numpy as np
import wave
import os
# === 파형 종류 선택 ===
# "sine", "square", "triangle", "sawtooth"
WAVE_TYPE = "square"
# WAV 파일 파라미터
sample_rate = 48000 # 48 kHz
duration = 10.0 # 11초
freq = 1000 # 1000 Hz
bit_depth = 16 # 비트 깊이 (샘플당 비트 수)
# === 진폭을 dBFS 단위로 지정 ===
# 예: "0dB", "-6dB", "-12dB"
amp_db = "0dB"
# 1) dB → 실제 amplitude 값 변환
max_val = 2**(bit_depth - 1) - 1 # 16-bit 최대치 32767
db_value = float(amp_db.replace("dB", "")) # "–6dB" -> –6.0
amplitude = int(max_val * 10**(db_value / 20))
# 2) 시간축 생성
num_samples = int(sample_rate * duration)
t = np.linspace(0, duration, num_samples, endpoint=False)
# 3) 파형 생성
if WAVE_TYPE == "sine":
wave_data = amplitude * np.sin(2 * np.pi * freq * t)
elif WAVE_TYPE == "square":
wave_data = amplitude * np.sign(np.sin(2 * np.pi * freq * t))
elif WAVE_TYPE == "triangle":
wave_data = (2 * amplitude / np.pi) * np.arcsin(np.sin(2 * np.pi * freq * t))
elif WAVE_TYPE == "sawtooth":
wave_data = (2 * amplitude / np.pi) * np.arctan(np.tan(np.pi * freq * t))
else:
raise ValueError("지원하지 않는 파형 타입입니다!")
wave_data = wave_data.astype(np.int16)
# 4) 스테레오 신호 변환
stereo_data = np.column_stack((wave_data, wave_data)).flatten()
# 5) 파일 이름 자동 생성
script_dir = os.path.dirname(os.path.abspath(__file__))
filename = os.path.join(
script_dir,
f"{WAVE_TYPE}_{freq}Hz_{sample_rate}Hz_{bit_depth}bit_{amp_db}_{int(duration)}sec.wav"
)
# 6) WAV 파일 저장
with wave.open(filename, 'w') as wf:
wf.setnchannels(2)
wf.setsampwidth(bit_depth // 8)
wf.setframerate(sample_rate)
wf.writeframes(stereo_data.tobytes())
print(f"WAV 파일 생성 완료: {filename}")'프로그래밍 언어 > 유용한코드' 카테고리의 다른 글
| C언어로 링버퍼 구현하기 (1) | 2025.08.31 |
|---|---|
| C언어로 배열에있는 값을 대문자or소문자로 치환하기 (0) | 2024.01.28 |
| FCFS(FIFO)스케줄링 C언어로 구현하기 (0) | 2020.11.15 |
| C언어로 상승엣지,하강엣지 기능 구현하기 (1) | 2020.02.22 |
| 센서의 전류값 계산하기(직선의 방정식 코드로 나타내기) (0) | 2019.10.27 |