본문 바로가기
프로그램

[파이썬] 사인파(Sine wave) 그리기

by 오디세이99 2022. 8. 17.
728x90
반응형

 

기본적인 사인파(Sine wave) 그리는 코드 입니다.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

# 신호정보 상수로 정의
SIG_AMPLITUDE = 10
SIG_OFFSET = 0
SIG_PERIOD = 100
NOISE_AMPLITUDE = 3
N_SAMPLES = 5 * SIG_PERIOD
INSTRUMENT_RANGE = 9

# 사인 곡선
times = np.arange(N_SAMPLES).astype(float)
signal = SIG_AMPLITUDE * np.sin(2 * np.pi * times / SIG_PERIOD) + SIG_OFFSET

# plot
matplotlib.style.use("ggplot")
plt.plot(times, signal)
plt.title("Sine wave signal")
plt.xlabel("Time")
plt.ylabel("Signal")

 

 

변화를 줄 수 있도록 수정한 코드 입니다.

data_type = 0 : 0 위로 보이는 일반적인 사인파

data_type = 1 : 점점 높아지는 사인파

data_type = 2 : 기본적인 사인파에 노이즈가 섞여있는 사인파

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

def genData(dataClass, lowSize):
    # 신호, 잡음, '악기' 정보를 상수로 정의한다.
    SIG_AMPLITUDE = 5  # 높이
    SIG_OFFSET = 2
    SIG_PERIOD = 20
    NOISE_AMPLITUDE = 3
    WAVE_CNT = 10  # 파의 수
    N_SAMPLES = WAVE_CNT * SIG_PERIOD  # 전체 데이터 수
    INSTRUMENT_RANGE = 9
    BIAS = 2  # 값을 일정 이상으로 올리는 상수

    # 사인 곡선을 구성하고 잡음을 섞어 넣는다.
    times = np.arange(N_SAMPLES).astype(float)
    signal = SIG_AMPLITUDE * np.sin(2 * np.pi * times / SIG_PERIOD) + SIG_OFFSET
    signal_normal = signal + abs(min(signal)) + BIAS     # 0+2 위로 데이터 만들기
    signal_short = SIG_AMPLITUDE * np.sin(2 * np.pi * times / int(SIG_PERIOD / 2)) + SIG_OFFSET
    signal_big = SIG_AMPLITUDE * np.sin(2 * np.pi * times / int(SIG_PERIOD * 4)) + SIG_OFFSET
    noise = NOISE_AMPLITUDE * np.random.normal(size=N_SAMPLES)

    signal_comp1 = []       # signal2에서 점점 상승
    signal_comp2 = []       # 더 파형인 signal_big에 signal_com1을 합쳐 signal_big에 따른 파형
    cnt = len(signal) / WAVE_CNT
    loop = 0
    change_flag = False
    for i in range(len(signal_normal)):
        a = signal_normal[i] + (i * 0.01)
        signal_comp1.append(a)
        b = signal_big[i] + (signal_short[i] * 0.4)
        signal_comp2.append(b)

    signal_comp2 = signal_comp2 + np.abs(np.min(signal_comp2)) + BIAS
    rtn = []
    if dataClass == 0:     # 0 위로 곡선이 나타남
        rtn = signal_normal
    elif dataClass == 1:   #  곡석이 점점 상승하여 나타남
        rtn = signal_comp1
    elif dataClass == 2:   # 곡선에 잡음이 썩이 형태로 나타냄
        rtn = signal_comp2

    d_X = []
    d_Y = []
    for i in range(len(rtn) - lowSize):
        tmp = []
        for i2 in range(lowSize):
            tmp.append(rtn[i+i2])
        d_X.append(tmp)
        if rtn[lowSize + i - 1] < rtn[lowSize + i]:
            d_Y.append([0,1])           # Up
        else:
            d_Y.append([1,0])           # Down

    return d_X, d_Y, rtn


data_type = 2
X_size = 10
X, Y, rtn = genData(data_type, X_size)

# matplotlib.style.use("ggplot")
fig = plt.figure(figsize=(30, 16))
plt.plot(rtn)
plt.title("Sine Wave signal")
plt.xlabel("Time")
plt.ylabel("Signal + noise")
# plt.ylim(ymin = -SIG_AMPLITUDE, ymax = SIG_AMPLITUDE)

data_type = 0  (0 위로 보이는 일반적인 사인파)

 

data_type = 1 (점점 높아지는 사인파)

 

data_type = 2 (기본적인 사인파에 노이즈가 섞여있는 사인파)

728x90
반응형

댓글