고속 푸리에 변환(FFT)이란? AI에서 소리와 신호를 주파수 성분으로 빠르게 바꾸는 방법
TL;DR
고속 푸리에 변환(FFT)은 일정한 간격으로 기록한 신호의 이산 푸리에 변환을 빠르게 계산하는 알고리즘입니다. 시간 순서의 파형을 주파수별 복소수 계수로 바꿔 반복 성분을 살핍니다. 소리의 특징을 준비하거나 센서 신호를 분석할 때 쓰지만 말의 내용이나 고장 원인을 직접 판정하지는 않습니다. 샘플링 주파수·분석 길이·정규화와 위상 정보를 함께 확인합니다.[1][7]
핵심 3줄 요약
- 핵심 1
변환의 정의와 계산법을 구분합니다. DFT는 구하려는 변환이고 FFT는 그 변환을 효율적으로 계산하는 방법입니다. - 핵심 2
결과는 주파수별 복소수입니다. 크기는 성분의 세기와 연결되고 위상은 파형의 시간적 위치를 읽는 데 필요합니다. - 핵심 3
주파수 축과 척도를 함께 봅니다. 같은 배열도 샘플링 간격과 정규화 규칙에 따라 Hz와 표시 크기의 해석이 달라집니다.
이 글에서 다룰 내용
- FFT의 한 문장 정의
- 여덟 표본으로 이해하는 2Hz 성분
- 파형·주파수 축·복소수 출력의 작동 순서
- 길이·축·정규화와 실수 입력의 처리
- DFT·STFT·ICA·음성 인식과의 차이
- 오디오·센서 분석의 사용처와 체크리스트
- 누설·패딩·위상·샘플링의 주의점
고속 푸리에 변환을 한 문장으로 정의하면 무엇인가요?
고속 푸리에 변환은 유한한 표본 열을 주파수별 계수로 표현하는 이산 푸리에 변환을, 반복 계산의 구조를 활용해 효율적으로 구하는 알고리즘입니다.[1][2]
영문명은 Fast Fourier Transform이며 FFT로 줄여 씁니다. 이산 푸리에 변환은 DFT입니다. 같은 입력 길이와 정의·정규화라면 FFT는 다른 근사 목표를 푸는 것이 아니라 같은 DFT를 계산합니다. 부동소수점 반올림 오차는 별도로 남습니다.[1][2]
여기서는 일정한 시간 간격으로 측정한 실수 신호의 1차원 변환을 중심으로 설명합니다. 소리 파형의 가로축이 시간이면 변환 결과의 가로축은 주파수입니다. 출력값 자체는 Hz 숫자가 아니라 해당 주파수의 복소수 계수이며 주파수 좌표는 따로 계산합니다.[3][4]
한 줄 정리: FFT는 신호를 새로 학습하는 모델이 아닙니다. 주어진 표본을 정해진 주파수 기준으로 다시 표현하는 계산입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 1초에 8번 측정한 작은 신호
[0,1,0,-1,0,1,0,-1]
을 살핀다고 가정해 보겠습니다. 8개 표본으로 두 주기를 기록한 합성 예시입니다. 실제 음성이나 고객 자료를 측정한 값은 아닙니다.
설치된 NumPy의
np.fft.rfft(x)
를 실행하면
[0,0,-4j,0,0]
가 나옵니다.
np.fft.rfftfreq(8,d=1/8)
로 구한 대응 주파수는
[0,1,2,3,4]
Hz입니다. 세 번째 칸이 2Hz를 가리키며 그 복소수의 절댓값은 4입니다.
기본 정규화에서 이 예시의 2Hz 성분을 한쪽 진폭으로 표시하면
2*4/8
로 1을 얻습니다. 이는 창 함수를 곱하지 않았고 주파수가 구간 중심에 정확히 맞는 실수 정현파의 내부 주파수 칸에 적용한 계산입니다. 직류와 짝수 길이의 나이퀴스트 칸은 같은 방식으로 두 배 하지 않습니다.[6]
원래 복소수 계수를 보존한 채
np.fft.irfft(X,n=8)
을 실행하면 입력 여덟 값으로 돌아옵니다. 이 실행에서는 최대 복원 오차가 0이었습니다. 합성 배열의 NumPy 계산을 확인한 결과이며 SciPy 실행이나 음성 AI의 인식 정확도를 측정한 결과는 아닙니다.
쉬운 예시: 출력의 세 번째 칸은 세 번째 시점이 아닙니다. 그 칸에 대응하는 2Hz 성분을 뜻합니다. 주파수 배열과 계수 배열을 같은 위치끼리 읽습니다.
왜 AI에서 고속 푸리에 변환이 중요한가요?
파형에서 반복 성분을 살핍니다
시간 파형에서는 여러 진동이 겹쳐 보입니다. 주파수 표현에서는 어느 대역에 큰 성분이 있는지 살핍니다. Hugging Face 오디오 과정도 파형과 주파수 스펙트럼을 구분하고 오디오 일부에 rfft를 적용합니다. 모든 음성 모델이 같은 변환을 요구하는 것은 아닙니다.[7]
시간별 오디오 표현의 기초가 됩니다
짧은 구간마다 변환을 반복하면 시간에 따른 주파수 변화를 다룰 수 있습니다. 이런 단시간 푸리에 변환을 바탕으로 크기나 파워를 표시한 스펙트로그램을 만듭니다. AI 입력을 준비할 때는 모델이 요구하는 길이·이동 간격·스케일을 따로 맞춥니다.[7]
변환과 의미 판정을 나눠 점검합니다
큰 주파수 봉우리가 있다고 특정 화자나 고장 유형이 결정되지는 않습니다. 변환 단계에서는 신호와 축·척도가 맞는지 확인하고, 후속 모델은 정답과 비교합니다. 주파수 특징의 계산 성공과 실제 분류 성능을 나눠 기록하는 편이 오류 원인을 찾기 좋습니다.
핵심 인사이트: FFT는 소리나 신호를 비교할 수치 표현을 계산합니다. 어떤 성분을 남기고 어떤 의미로 판단할지는 후속 처리와 평가의 몫입니다.
고속 푸리에 변환은 어떤 순서로 작동하나요?
1. 표본의 간격과 분석 구간을 정합니다
먼저 시간 순서대로 놓인 값과 샘플링 주파수 fs를 확인합니다. 샘플링 간격 d는
1/fs
입니다. 간격이 불규칙한 기록을 아무 설명 없이 같은 배열로 넣으면 일반 FFT가 가정한 시간축과 실제 측정 시각이 어긋납니다.[3][6]
분석할 구간을 자르고 필요하면 평균 제거와 창 함수를 선택합니다. 창은 구간의 양끝을 완만하게 조절해 스펙트럼 누설의 양상을 바꾸지만 주된 봉우리를 넓히기도 합니다. 항상 적용하면 더 정확해지는 보정으로 보지 않습니다.[1][6]
2. 여러 주파수의 계수를 효율적으로 계산합니다
DFT는 각 주파수의 복소 진동과 입력을 결합해 계수를 구합니다. FFT는 계산에 반복되는 구조와 대칭을 이용합니다. 길이가 2의 거듭제곱일 때만 실행되는 것은 아닙니다. SciPy는 잘 나뉘지 않는 길이에도 대응하는 알고리즘을 사용합니다.[1][2]
3. 주파수 좌표와 출력 표현을 연결합니다
실수 입력의 rfft 결과에는 음이 아닌 주파수 쪽 계수만 남습니다. 음의 주파수 쪽은 대응하는 양의 주파수 계수의 복소켤레라서 중복을 줄일 수 있습니다. 크기만 취하는 것은 이 중복 생략과 다른 작업이며 위상 정보까지 버립니다.[4][5]
실전 팁: 파형, 복소수 계수, 주파수 배열, 표시용 크기를 따로 보관하세요. 화면을 그리려고 만든 값으로 원래 계수를 덮어쓰지 않습니다.
주요 설정과 결과는 어떻게 읽나요?
n과 axis는 분석 길이와 배열 방향입니다
NumPy rfft에서
n
이 입력보다 작으면 해당 축의 입력을 자르고, 크면 뒤에 0을 채웁니다. 생략하면 선택한 축의 길이를 씁니다. 기본
axis=-1
은 마지막 축이므로 시간 축이 마지막인지 먼저 확인합니다.[4]
이번 합성 시험에서 시간 8개 × 채널 2개의 배열에 기본 rfft를 적용한 모양은
(8,2)
였습니다. 채널 방향을 변환한 결과입니다.
axis=0
으로 시간 방향을 지정하면
(5,2)
가 됩니다. 배열 모양이 그럴듯해도 올바른 축을 처리했다는 증거는 아닙니다.
샘플링 간격이 주파수 단위를 정합니다
변환 길이를 n, 간격을 d로 두면 주파수 칸 간격은
1/(n*d)
입니다. d를 초 단위로 주면 결과 단위는 Hz입니다. 생략한 d의 기본값은 1이므로 실제 녹음의 샘플링 정보를 자동으로 읽었다고 생각하지 않습니다.[3]
rfft 출력 길이는
n//2+1
입니다. n이 짝수이면 마지막 칸이 fs/2인 나이퀴스트 주파수지만 홀수이면 그 주파수에 정확히 놓인 칸이 없습니다. 첫 칸은 0Hz 직류 성분이며 기본 정규화에서는 입력값의 합입니다.[1][4]
norm과 역변환 길이를 함께 맞춥니다
norm="backward"
는 기본값으로 순변환을 그대로 두고 역변환에 길이의 역수를 적용합니다.
norm="forward"
는 순변환에 그 배율을 적용하고
norm="ortho"
는 양방향을 길이 제곱근으로 나눕니다. 비교할 자료의 규칙을 같게 둡니다.[2]
홀수 길이는 역변환에 원래 n을 전달합니다. 이번에 길이 5인 배열을 rfft로 바꾼 뒤 irfft의 n을 생략하면 길이 4가 나왔고
n=5
를 주면 원래 배열이 복원됐습니다. 계수 개수만으로 원래 길이의 홀짝이 정해지지 않기 때문입니다.[5]
고속 푸리에 변환과 헷갈리는 용어는 무엇이 다른가요?
DFT·STFT·스펙트로그램과의 차이
DFT는 변환의 정의, FFT는 효율적인 계산법입니다. STFT는 짧은 시간 구간마다 변환을 반복하는 분석이고 스펙트로그램은 그 결과의 세기를 시간·주파수별로 나타낸 표현입니다. FFT 한 번이 전체 녹음의 시간별 변화까지 자동으로 반환하지는 않습니다.[1][7]
크기·파워·위상과의 차이
복소수 계수의 절댓값과 절댓값 제곱은 다릅니다. 전자는 크기, 후자는 파워 표현의 재료이며 파워 스펙트럼 밀도는 샘플링·창 정규화까지 따져야 합니다. 임의의 절댓값 그래프를 곧바로 PSD나 물리적인 음압으로 부르지 않습니다.[6]
위상은 복소수의 각도입니다. 이번 시험에서 파형을 한 표본 순환 이동해도 rfft의 크기는 같았지만 파형은 달랐습니다. 따라서 크기만 같은 두 결과를 같은 시간 신호로 판정하거나 절댓값만 역변환해 원본이라고 할 수 없습니다.[5][6]
독립 성분 분석·음성 인식과의 차이
독립 성분 분석(ICA)은 여러 관측에 섞인 잠재 원천을 통계적 독립성으로 추정합니다. FFT는 정해진 주파수 기준의 계수를 구합니다. 여러 사람의 목소리를 각각 분리하는 것과 한 신호의 주파수를 분석하는 것은 다릅니다.
음성 인식(STT)의 출력은 글자나 문장입니다. FFT의 출력은 복소수 배열입니다. 주파수 변환은 오디오 처리의 재료가 될 수 있지만 변환 함수 하나가 문장을 받아쓰지는 않습니다.[7]
비교 정리: 변환 계산, 시간별 표현, 원천 분리, 의미 인식의 역할을 구분합니다. 같은 소리를 다뤄도 출력이 답하는 질문이 다릅니다.
실전에서는 어디에 쓰이나요?
오디오 전처리와 입력을 점검합니다
음성이나 음악의 짧은 구간을 변환해 대역별 성분을 살핍니다. 공식 오디오 과정의 주파수·스펙트로그램 예제를 출발점으로 삼되 실제 모델의 입력 형식은 따로 확인합니다. 파형을 직접 받는 모델에 임의의 FFT 배열을 대신 보내지 않습니다.[7]
센서 신호의 반복 성분을 비교합니다
장비의 일정 간격 진동 기록을 분석한다면 같은 측정 조건의 정상 구간과 다른 구간을 비교하는 자료로 검토할 수 있습니다. 이는 응용 예시이며 이번 실행에서 장비를 진단한 것은 아닙니다. 회전 속도·부하·측정 위치가 다른 결과를 한 봉우리만 보고 비교하지 않습니다.
고속 푸리에 변환을 적용할 때 어떤 순서로 확인하나요?
1. 입력의 시간·채널·단위를 기록합니다
원본 표본 수, 샘플링 주파수, 선택 구간과 시간 축을 먼저 남깁니다. 샘플링 주파수라는 숫자만 바꾸는 일과 실제 리샘플링은 구분합니다. 전처리 사본을 만들고 원본은 보존하는 방식으로 시작합니다.[7]
2. 작은 신호로 변환과 복원을 시험합니다
상수 신호와 주파수를 아는 정현파를 먼저 확인합니다. 실수 입력의 출력 개수, 주파수 배열 길이와 복원 길이가 맞는지 봅니다. 홀수·짝수 길이, 여러 채널, 패딩과 자르기도 포함하면 잘못된 기본값을 일찍 발견하기 좋습니다.
3. 표시 결과와 후속 성능을 따로 평가합니다
창 종류·길이·정규화·크기 또는 파워·로그 변환을 기록합니다. 그림이 선명해진 결과와 후속 분류 오류가 줄어든 결과는 구분합니다. 학습 모델과 결합한다면 같은 원본의 겹친 구간이 훈련·평가 양쪽에 섞이지 않도록 평가 단위를 정합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 0 채우기를 새로운 측정으로 보지 않습니다. 위 여덟 표본에
n=16
을 주면 주파수 칸 간격은 1Hz에서 0.5Hz로 촘촘해집니다. 그러나 실제 관측한 소리가 늘지는 않습니다. 가까운 두 성분을 분리할 능력은 관측 길이와 창의 영향까지 봅니다.[6]
이번 시험의 패딩 결과도 2Hz 봉우리의 크기는 4였습니다. 원래 표본 수 8 대신 늘어난 변환 길이 16으로 단순히 진폭을 나누면 1이던 값이 0.5가 됩니다. 패딩·창·정규화를 섞어 쓰면서 같은 수치 척도라고 가정하지 않습니다.
둘째, 누설과 실제 여러 성분을 구별합니다. 유한 구간을 잘라 분석하면 한 진동의 성분이 주변 주파수에도 퍼집니다. 창으로 주변 봉우리를 낮출 때 주된 봉우리의 폭도 달라집니다. 더 많은 칸이 0이 아니라고 그만큼 소리 원천이 많은 것은 아닙니다.[6]
셋째, 샘플링 때 잃은 정보를 복원한다고 기대하지 않습니다. 나이퀴스트 범위를 벗어난 성분의 겹침인 앨리어싱은 입력을 얻는 과정의 문제입니다. 이미 잘못 샘플링한 신호에 FFT를 적용하거나 뒤에 0을 붙이는 일만으로 원래 고주파를 되찾지는 못합니다.[6]
넷째, 위상과 평균 성분을 무조건 버리지 않습니다. 크기만 저장하면 시간 파형 복원에 필요한 정보가 줄고 평균 제거는 0Hz 성분을 바꿉니다. 분석 목적과 후속 모델의 요구를 확인하고 원래 계수를 별도로 보관합니다.[1][5]
주의: 변환이 빠르게 끝났다는 사실은 신호 해석이나 AI 판단의 정확성을 보증하지 않습니다. 주파수 축·정규화·복원과 실제 작업의 오류를 함께 검증합니다.
자주 묻는 질문
Q1. FFT는 AI 모델인가요?
정해진 입력의 DFT를 빠르게 계산하는 알고리즘입니다. 정답 예시로 가중치를 학습하지 않습니다. 오디오 AI의 전처리나 특징 계산과 결합할 수 있지만 분류기는 별도입니다.[1][7]
Q2. DFT보다 빠르면 결과도 근사값인가요?
같은 정의와 설정의 DFT를 효율적으로 계산합니다. FFT라는 이유로 다른 목표를 근사하는 것은 아닙니다. 실제 부동소수점 계산의 수치 오차는 남으므로 복원은 허용오차로 확인합니다.[1][2]
Q3. 입력 길이는 꼭 2의 거듭제곱이어야 하나요?
아닙니다. SciPy는 다른 길이도 처리합니다. 길이의 인수 구조는 속도에 영향을 주지만 길이를 바꾸면 자르기·패딩과 출력 주파수 칸도 함께 달라집니다.[2]
Q4. rfft의 r은 출력이 모두 실수라는 뜻인가요?
실수 입력에 맞춘 변환이라는 뜻입니다. 출력은 일반적으로 복소수입니다. 직류와 짝수 길이의 나이퀴스트 계수에만 별도의 실수 조건이 있습니다.[4]
Q5. abs를 취한 결과만으로 원래 파형을 복원하나요?
일반적으로 원래 파형을 유일하게 복원할 수 없습니다. 복소수 계수의 위상도 필요합니다. 원본 길이와 정규화를 맞춘 역변환을 시험하고 크기 그림과 원래 계수를 따로 보관합니다.[5][7]
Q6. 가장 큰 봉우리가 곧 소리의 정체인가요?
큰 성분이 있는 주파수를 알려 주는 단서입니다. 화자·악기·결함의 이름을 바로 확정하지 않습니다. 여러 성분과 시간 변화, 측정 조건, 후속 모델의 정답 비교를 함께 봅니다.
출처
마무리
고속 푸리에 변환은 시간 순서의 표본을 주파수별 계수로 바꾸는 DFT의 효율적인 계산법입니다. 변환과 인식, 복소수 계수와 크기 그림, 실제 관측 길이와 0 채우기를 구분하면 오디오 처리 문서를 더 정확히 읽을 수 있습니다.
처음에는 주파수를 아는 작은 신호부터 시험해 보세요. 표본 간격과 축, 출력 개수와 정규화를 기록하고 원래 길이로 역변환합니다. 그다음 실제 음성·센서 자료에서 필요한 정보가 남는지 확인하고 후속 모델의 성능은 별도 자료로 평가합니다.
