프로그램

[파이썬] 사인파 곡선에서 최저, 최고점 찾기 (scipy, argrelextrema)

오디세이99 2023. 7. 27. 12:57
728x90
반응형
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema

def min_max_indices(data):               # 최저, 최고잠 찾기
    max_indices = argrelextrema(np.array(data), np.greater)[0]
    max_values = data[max_indices]
    min_indices = argrelextrema(np.array(data), np.less)[0]
    min_values = data[min_indices]
    return max_indices, max_values, min_indices, min_values

def complex_sine_wave(amplitudes, frequencies, phases, num_samples=1000):
    # 시간축 생성 (2번 반복하도록 num_samples를 두 배로 증가)
    time = np.linspace(0, 4*np.pi, 2*num_samples)  # 0부터 4파이까지 num_samples의 2배만큼 등간격으로 생성

    # 복합 사인파 생성
    complex_sine_wave = np.zeros(2*num_samples)
    for amplitude, frequency, phase in zip(amplitudes, frequencies, phases):
        complex_sine_wave += amplitude * np.sin(frequency * time + phase)

    max_indices, max_values, min_indices, min_values = min_max_indices(complex_sine_wave)
        
    # 그래프 그리기
    plt.figure(figsize=(8, 4))
    plt.plot(complex_sine_wave, label="Complex Sine Wave")
    plt.plot(max_indices, max_values, 'b^', label='max')     # 최고점 표시
    plt.plot(min_indices, min_values, 'rv', label='min')     # 최저점 표시
    plt.xlabel('Time (radians)')
    plt.ylabel('Amplitude')
    plt.title('Complex Sine Wave')
    plt.legend()
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    amplitudes = [1.0, 0.5, 0.2, 0.3]        # 사인파들의 진폭 리스트
    frequencies = [1.0, 2.0, 3.0, 4.0]       # 사인파들의 주파수 리스트 (1주기당 완료하는 사이클 수)
    phases = [0.0, np.pi/4, np.pi/2, np.pi]   # 사인파들의 위상 리스트 (시작위치)

    complex_sine_wave(amplitudes, frequencies, phases)

728x90
반응형