← .mpy 공유

FFT로 반복 주기 찾기

반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다

English

Finds the dominant repeating period of a signal using FFT

실행 결과 미리보기가 없는 스크립트입니다

README

FFT로 반복 주기 찾기

설명

반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다

필요 데이터

수치형 신호 컬럼 1개 이상 (실행 시 선택)

출력

컬럼별 주기(샘플 수) 표

필요 패키지

  • numpy
  • pandas

태그

science, timeseries

작성자

SDSL | MDS 1.0

Source · 39줄
# MDS_TITLE: FFT로 반복 주기 찾기
# MDS_REQUIRES: numpy, pandas
# MDS_DESC: 반복 패턴이 있는 신호에서 가장 강한 주기(몇 샘플마다 반복되는지)를 FFT로 찾는다
# MDS_DESC[en]: Finds the dominant repeating period of a signal using FFT
# MDS_TAGS: science, timeseries
# MDS_INPUT: 수치형 신호 컬럼 1개 이상 (실행 시 선택)
# MDS_OUTPUT: 컬럼별 주기(샘플 수) 표
# MDS_AUTHOR: SDSL
# MDS_VERSION: 1.0
def dominant_period(series: pd.Series) -> float | None:
    s = pd.to_numeric(series, errors='coerce').dropna()
    if len(s) < 4:
        return None
    normalized = (s - s.mean()) / (s.std() + 1e-10)
    power = np.abs(np.fft.rfft(normalized.to_numpy())) ** 2
    freqs = np.fft.rfftfreq(len(s))
    peak = int(np.argmax(power[1:])) + 1
    return float(1.0 / freqs[peak]) if freqs[peak] > 0 else None


def run_period_detect(df: pd.DataFrame) -> pd.DataFrame | None:
    numeric_cols = df.select_dtypes(include='number').columns.tolist()
    if not numeric_cols:
        mIO.print('수치형 컬럼이 없습니다.')
        return None
    chosen = mIO.checkboxes('주기를 찾을 컬럼을 선택하세요', numeric_cols, default_checked=numeric_cols[:1])
    if not chosen:
        return None
    rows = []
    for col in chosen:
        period = dominant_period(df[col])
        rows.append({'컬럼': col, '주기(샘플)': round(period, 3) if period else None})
    table = pd.DataFrame(rows)
    mIO.show_df(table, title='검출된 주기')
    return table


result = run_period_detect(df)