단시간 푸리에 변환(STFT)이란? AI에서 짧은 구간을 옮겨 소리의 주파수 변화를 읽는 방법
TL;DR
단시간 푸리에 변환(STFT)은 짧은 구간에 창을 곱하고 위치를 옮기며 푸리에 변환을 반복하는 시간·주파수 분석입니다. 어느 성분이 언제 나타나는지 복소수 행렬로 표현합니다. 창 길이·이동 간격·FFT 길이와 가장자리 처리를 구분해야 합니다. 크기 그림만 남기면 원래 위상을 잃으므로 변환 결과와 표시용 값을 따로 보관합니다. [1] [2] [7]
핵심 3줄 요약
- 핵심 1
시간별 주파수를 나란히 놓습니다. 한 열은 짧은 시간 구간이고 한 행은 주파수 칸입니다. 출력은 보통 복소수입니다. - 핵심 2
창 길이와 이동 간격은 다릅니다. 창은 한 번에 관측하는 범위이고 이동 간격은 다음 구간까지 옮기는 표본 수입니다. - 핵심 3
같은 숫자도 같은 전처리가 아닙니다. 창 함수·중심 정렬·패딩·척도까지 맞춰야 라이브러리와 학습·실행 환경을 비교할 수 있습니다.
이 글에서 다룰 내용
- STFT의 한 문장 정의
- 두 주파수가 바뀌는 합성 신호 예시
- 창·이동·변환·복원의 작동 순서
- 창 길이·FFT 길이·중심 정렬과 출력 축
- FFT·스펙트로그램·멜 표현과의 차이
- 오디오 특징의 사용처와 실전 체크리스트
- 경계·위상·실시간 처리·평가의 주의점
단시간 푸리에 변환을 한 문장으로 정의하면 무엇인가요?
단시간 푸리에 변환은 시간축을 따라 유한한 창을 옮기고 각 창의 신호를 주파수별 복소수 계수로 바꾸는 분석 방법입니다. [1] [6]
영문명은 Short-Time Fourier Transform이며 STFT로 줄입니다. 하나의 긴 녹음을 한 번 변환하는 대신 구간마다 스펙트럼을 구해 변화 순서를 남깁니다. 창 사이가 겹치는 구성이 흔하지만 겹침 비율 하나가 모든 신호에 맞는 정답은 아닙니다. [2] [6]
여기서는 일정한 간격으로 얻은 실수 파형의 분석을 다룹니다. 시간별 계수는 입력을 정해진 규칙으로 바꾼 값입니다. 별도의 정답 자료로 가중치를 학습하거나 소리의 이름을 직접 예측하지 않습니다. [1] [7]
한 줄 정리: STFT는 짧은 주파수 분석을 시간 순서로 모은 표현입니다. 언제 변했는지를 보려면 주파수 좌표와 시간 좌표를 함께 읽습니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 앞 1초는 2Hz, 뒤 1초는 6Hz인 정현파를 살핀다고 가정해 보겠습니다. 초당 16개씩 총 32개 표본을 만든 합성 신호입니다. 실제 음성이나 장비를 측정한 자료는 아닙니다.
교육용 계산에서는 길이 8의 직사각형 창을 4표본씩 옮겼습니다. 중심 정렬과 양끝 패딩을 쓰지 않고 완전히 들어가는 창만 계산했습니다. 각 창에 설치된 NumPy의
np.fft.rfft
를 적용하자 주파수 5칸 × 시간 7칸의
(5,7)
복소수 행렬을 얻었습니다.
주파수 좌표는
[0,2,4,6,8]
Hz입니다. 창 시작 시각은 0초부터 1.5초까지 0.25초 간격입니다. 앞의 세 창에서는 2Hz, 뒤의 세 창에서는 6Hz 칸의 크기가 가장 컸습니다. 바뀌는 경계를 걸친 가운데 창에는 여러 칸의 성분이 나타났습니다.
창 길이 8은 0.5초를 관측하고 이동 간격 4는 0.25초마다 다음 결과를 만든다는 뜻입니다. 이 계산은 NumPy로 짧은 구간의 변환을 직접 구성한 시험이며 SciPy·librosa·PyTorch의 STFT 함수를 실행한 결과는 아닙니다.
쉬운 예시: 한 번의 긴 분석으로 두 성분이 있다는 사실을 볼 수는 있습니다. 짧은 창을 옮긴 결과에서는 앞쪽과 뒤쪽에 서로 다른 성분이 나타나는 순서까지 살핍니다.
왜 AI에서 단시간 푸리에 변환이 중요한가요?
변화하는 소리의 입력 표현을 준비합니다
음성이나 음악은 시간에 따라 성분이 달라집니다. Hugging Face 오디오 과정은 짧은 구간별 변환으로 스펙트로그램을 만들고 일부 머신러닝 모델이 이를 입력이나 출력으로 쓴다고 설명합니다. 모든 오디오 모델이 STFT 배열을 직접 받는 것은 아닙니다. [7]
시간 위치와 전처리의 조건을 드러냅니다
같은 파형도 창의 길이와 정렬 방식이 달라지면 열의 의미가 바뀝니다. 모델 학습 때 사용한 특징을 서비스에서도 재현하려면 샘플링 주파수뿐 아니라 창·이동 간격·패딩·크기 또는 파워 변환을 기록합니다. 화면에 비슷한 그림이 나왔다는 이유만으로 같은 입력으로 보지 않습니다. [2] [4] [7]
핵심 인사이트: 변환 단계가 맞는지와 AI가 정답을 맞히는지는 따로 확인합니다. 행렬을 성공적으로 계산해도 화자나 사건의 이름이 자동으로 확정되지는 않습니다.
단시간 푸리에 변환은 어떤 순서로 작동하나요?
1. 입력 축과 분석 창을 정합니다
파형의 시간 축과 샘플링 주파수 fs를 확인하고 실제 관측 길이에 맞는 창을 고릅니다. 창 함수는 구간 안의 표본마다 가중치를 줍니다. Hann처럼 끝을 완만하게 낮춘 창과 모든 가중치가 1인 직사각형 창은 서로 다른 결과를 냅니다. [2] [4]
2. 정한 간격으로 창을 옮깁니다
이동 간격인 hop은 표본 수입니다. 시간 간격은
hop/fs
초입니다. 창 길이를 고정한 채 hop을 줄이면 이웃 열이 더 많이 겹치고 열 수도 늘지만 한 창이 관측한 시간은 그대로입니다. 가까운 두 주파수를 분리하는 능력이 자동으로 좋아지지는 않습니다. [1] [2]
3. 각 구간을 변환해 행렬로 모읍니다
각 창의 신호를 푸리에 변환하고 주파수와 시간을 서로 다른 축에 놓습니다. 실수 입력의 한쪽 주파수 출력도 일반적으로 복소수입니다. 크기는 계수의 절댓값, 위상은 복소수의 각도이며 두 값이 같은 정보는 아닙니다. [2] [5]
4. 계수 보관과 역변환을 분리합니다
역변환은 각 열을 시간 구간으로 되돌리고 창의 가중치와 겹침을 반영해 합칩니다. 아무 창·hop 조합이나 복원 가능한 것은 아닙니다. SciPy는 쌍대 창과 가역성을 다루고 librosa는 창 제곱의 합으로 정규화하는 복원을 설명합니다. [1] [3] [6]
앞의 교육용 직사각형 시험에서는 각 열을 역변환한 뒤 겹친 횟수로 나누어 합쳤습니다. 원본 32개 표본과의 최대 차이는 0.000000000001 미만이었습니다. 이 결과를 다른 창이나 크기만 남긴 행렬의 복원 보증으로 확대하지 않습니다.
주요 설정과 결과는 어떻게 읽나요?
창 길이와 FFT 길이를 구별합니다
librosa 0.11.0에서
win_length
는 창 길이이고
n_fft
는 0 채우기 뒤의 변환 길이입니다. 창 길이를 생략하면 FFT 길이와 같게 씁니다. 같은 8표본 창을 16칸으로 패딩한 교육용 시험에서는 행렬이
(9,7)
로 바뀌고 주파수 칸 간격은 2Hz에서 1Hz가 됐지만 실제 관측 시간은 여전히 0.5초였습니다. [2]
중심 정렬과 양끝 패딩을 확인합니다
librosa의
center=True
는 열의 기준 표본이 창의 중심에 놓이도록 입력 양끝을 채웁니다.
center=False
는 해당 표본에서 창을 시작합니다. 같은 열 번호를 창의 시작 시각과 중심 시각으로 혼용하지 않습니다. SciPy ShortTimeFFT는 신호와 일부라도 겹치는 가장자리 창을 포함해 음수 시각의 열도 만들 수 있습니다. [1] [2] [5]
라이브러리 기본값을 그대로 옮기지 않습니다
확인한 librosa 0.11.0 문서는 Hann 창과
pad_mode="constant"
를 기본값으로 둡니다. 확인한 PyTorch 2.15 문서는 창을 생략하면 직사각형 창을 쓰고
pad_mode="reflect"
를 기본값으로 둡니다. 두 함수의 이름이 STFT라고 해서 양끝과 가중치가 같지는 않습니다. PyTorch의 실수 입력에는
return_complex=True
도 명시합니다. [2] [4]
hop의 생략 규칙도 다릅니다. librosa는
win_length//4
, PyTorch는
n_fft//4
를 사용합니다. 창 길이가 FFT 길이보다 작다면 두 기본값이 달라질 수 있으므로 비교할 때 직접 지정하는 편이 분명합니다. [2] [4]
출력 축과 수치 척도를 따로 읽습니다
SciPy ShortTimeFFT의 1차원 입력은 주파수 × 시간의 복소수 배열로 나옵니다. 다차원 입력에서는 처리할
axis
를 확인합니다.
scale_to="magnitude"
와
scale_to="psd"
는 창의 척도 설정이며 원시 계수의 절댓값을 계산하는 일과 같다고 가정하지 않습니다. [1] [5]
단시간 푸리에 변환과 헷갈리는 용어는 무엇이 다른가요?
FFT·스펙트로그램과의 차이
고속 푸리에 변환(FFT)은 푸리에 변환의 효율적인 계산법입니다. STFT는 짧은 창을 옮기며 그 계산을 반복하는 분석입니다. 스펙트로그램은 보통 시간·주파수별 크기나 파워를 표시하며 SciPy의 해당 메서드는 STFT 절댓값의 제곱을 사용합니다. 복소수 행렬과 색으로 표시한 그림을 구별합니다. [1] [6]
멜 스펙트로그램·음성 인식과의 차이
멜 스펙트로그램은 STFT에서 얻은 스펙트럼에 멜 필터뱅크를 적용하는 추가 표현입니다. 단순히 그래프 세로축 이름을 바꾸는 작업은 아닙니다. 필터·파워·로그 변환의 규칙도 맞춰야 합니다. 음성 인식(STT)의 최종 출력은 글자나 문장이고 STFT의 출력은 수치 배열입니다. [7]
비교 정리: FFT는 변환 계산, STFT는 시간별 분석, 스펙트로그램은 세기 표현, 멜 변환은 대역을 다시 모으는 처리입니다. 최종 의미 판정은 별도의 모델과 검증이 맡습니다.
실전에서는 어디에 쓰이나요?
오디오 특징과 시간별 그림을 점검합니다
음성·음악 자료에서 시간에 따른 대역 변화를 살피거나 모델의 전처리를 이해할 때 사용합니다. 파형·복소수 행렬·크기 그림을 따로 남기면 창 정렬 오류와 표시 척도의 차이를 추적하기 좋습니다. 실제 입력은 모델이 요구하는 파형 또는 특징 형식에 맞춥니다. [7]
센서 변화의 비교 자료를 만듭니다
일정 간격의 진동 기록에서 어느 구간의 성분이 달라졌는지 살피는 응용도 가능합니다. 이는 사용 예시이며 이번 합성 시험으로 장비 고장을 판정한 것은 아닙니다. 같은 측정 위치와 시간 단위로 비교하고 변화가 잡음인지 업무상 사건인지는 정답 자료로 확인합니다. [1] [6]
단시간 푸리에 변환을 적용할 때 어떤 순서로 확인하나요?
1. 입력과 전처리 계약을 기록합니다
원본 길이·샘플링 주파수·시간 축·채널 수를 남깁니다. 창 종류와 길이, hop, FFT 길이, 중심 정렬, 경계 패딩, 한쪽 출력과 척도를 함께 고정합니다. 문서의 버전과 실행 환경의 버전도 대조합니다.
2. 작은 신호와 경계 사례를 시험합니다
주파수를 아는 정현파와 중간에 주파수가 바뀌는 신호를 확인합니다. 첫 창과 마지막 창의 시간 범위도 표시합니다. 교육용 시험에서 hop만 4에서 2로 줄이면 결과가
(5,13)
이 됐습니다. 행 수와 창 관측 길이는 그대로이고 시간 열만 늘었습니다.
3. 복원과 후속 모델 평가를 나눕니다
원래 복소수 계수로 복원 길이와 오차를 먼저 확인합니다. librosa 역변환은
length
로 출력 길이를 지정하며 홀수 FFT 길이는
n_fft
를 명시해 해석을 맞춥니다. 길이가 같다는 사실만으로 끝부분 정보까지 복구됐다고 판단하지 않습니다. [3]
분류기와 연결할 때는 같은 녹음의 겹친 창이 훈련·평가에 흩어지지 않도록 원본 녹음 단위로 나눕니다. 변환 설정을 고른 자료와 최종 평가 자료를 구분하고 인식 오류와 실행 비용을 각각 남기는 것이 이 글의 실전 점검 제안입니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 짧은 창과 작은 hop을 같은 효과로 보지 않습니다. 짧은 창은 순간 변화를 구별하기 쉽지만 가까운 주파수를 나누는 데 불리할 수 있습니다. 작은 hop은 결과를 더 자주 계산합니다. 두 설정을 따로 바꾸며 비교합니다. [2]
둘째, 중심 정렬을 지연 없는 실시간 처리로 보지 않습니다. 창 중심의 시각을 붙여도 그 창에는 뒤쪽 표본이 필요합니다. librosa의 스트림 분석 안내는
center=False
를 요구합니다. 왼쪽 정렬도 창이 채워질 때까지 기다리므로 시간 표기와 실제 대기 시간을 구분합니다. [2]
셋째, 가장자리의 채워진 값을 실제 측정으로 보지 않습니다. 0 채우기와 반사 패딩은 서로 다른 가정입니다. 원본 밖을 포함한 열은 가운데 열과 조건이 다릅니다. 긴 자료를 조각내 처리할 때도 겹침과 경계를 고려하지 않고 열을 이어 붙이지 않습니다. [1] [5]
넷째, 크기만 남긴 뒤 원본 복원을 약속하지 않습니다. 위상을 버린 크기 그림은 원래 복소수 행렬과 다릅니다. 위상을 추정하는 별도 방법은 있을 수 있지만 원래 파형을 그대로 되찾는다는 보증은 아닙니다. [3] [7]
주의: 멋진 시간·주파수 그림은 AI 정확도의 증거가 아닙니다. 좌표·척도·경계와 원본 정보 보존을 확인하고 실제 인식 결과는 별도의 정답으로 평가합니다.
자주 묻는 질문
Q1. STFT는 학습이 필요한 AI 모델인가요?
아닙니다. 선택한 창과 이동 간격으로 신호를 변환하는 계산입니다. 학습된 모델의 입력을 준비하는 데 쓸 수 있지만 STFT 함수가 소리의 종류를 스스로 배우지는 않습니다. [1] [7]
Q2. hop을 줄이면 주파수 분해능이 좋아지나요?
창 길이를 고정하면 결과의 시간 간격과 열 수가 바뀝니다. 한 창이 관측한 길이는 늘지 않습니다. 가까운 주파수의 구별과 시간축의 촘촘함을 분리해서 봅니다. [2]
Q3. FFT 길이를 두 배 하면 관측 길이도 두 배인가요?
창 길이는 그대로 두고 0만 채웠다면 아닙니다. 주파수 칸을 더 촘촘히 계산한 것이며 새로운 표본을 측정한 것은 아닙니다. 창 길이와 FFT 길이를 각각 기록합니다. [1] [2]
Q4. 출력이 실수 입력보다 한 차원 늘면 오류인가요?
일반적인 형태입니다. 한 시간 축이 주파수와 시간 구간의 두 축으로 표현됩니다. SciPy는 마지막 축을 시간 구간으로 두므로 배치·채널이 있을 때 축의 의미를 확인합니다. [5]
Q5. 크기 스펙트로그램만 역변환하면 원본이 나오나요?
일반적으로 원래 파형을 유일하게 정할 수 없습니다. 위상과 창·hop·정렬·길이의 일관성이 필요합니다. 원본 복원이 목적이면 복소수 계수를 보관하고 실제 오차를 측정합니다. [3] [7]
Q6. librosa와 PyTorch에 같은 길이만 넣으면 같은가요?
그렇지 않습니다. 확인한 문서의 기본 창과 양끝 패딩이 다르고 hop 생략 규칙도 다릅니다. 창과 hop을 명시하고 중심 정렬·출력 척도까지 맞춘 뒤 비교합니다. [2] [4]
출처
마무리
단시간 푸리에 변환은 짧은 창을 옮기며 신호의 주파수 성분을 시간별로 모읍니다. 창 길이와 이동 간격, 원래 복소수 계수와 크기 그림, 측정 구간과 0 채우기를 나누어 이해하면 오디오 AI의 전처리 문서를 읽기 수월합니다.
처음에는 성분이 바뀌는 작은 합성 신호부터 확인해 보세요. 시간·주파수 좌표와 양끝 창을 표시하고 원본 길이로 복원해 봅니다. 그다음 실제 자료에서 필요한 단서가 남는지 살피고 후속 모델은 따로 평가합니다.
