6.14. FFT¶
푸리에 변환은 시간 영역 신호를 그 구성 주파수로 분해합니다. 고속 푸리에 변환(FFT)은 이를 효율적으로 계산하는 표준 알고리즘으로, 이 모듈이 존재하는 이유이자 유용할 만큼 충분히 긴 변환(1024 포인트, 4096 포인트)이 애초에 마이크로컨트롤러에서 다룰 수 있게 되는 이유이기도 합니다.
카메라에서 입력은 일반적으로 마이크, 가속도계 축, 전류 센서 또는 진동 프로브에서 등간격으로 샘플링한 버퍼이며, 출력은 애플리케이션이 피크, 에너지 또는 분류기 특징을 찾기 위해 검사하는 스펙트럼입니다.
numpy.fft 는 1차원 이산 푸리에 변환을 제공합니다. 두 함수는 fft() (정변환)와 ifft() (역변환, N 으로 정규화됨)입니다.
변환 길이는 2의 거듭제곱이어야 합니다. 다른 길이는 ValueError를 발생시킵니다. N = 256과 N = 1024가 흔히 선택됩니다. 대부분의 임베디드 샘플레이트에서 사용 가능한 주파수 해상도를 얻을 만큼 충분히 길고, RAM에 들어가면서 한 프레임 주기 안에 충분히 끝날 만큼 짧습니다.
fft()는 입력의 실수부를 첫 번째 위치 인자로, 선택적인 허수부를 두 번째 인자로 받으며, 실수 배열의 2-튜플 (real, imag)을 반환합니다.
6.14.1. 실수 입력, 크기 출력¶
애플리케이션이 실수 입력만 공급하고 크기 스펙트럼만 필요한 경우:
real, imag = np.fft.fft(x)
magnitude = np.sqrt(real * real + imag * imag)
결과는 입력과 길이가 같은 실수 ndarray입니다. spectrogram() 헬퍼는 중간 할당 없이 정확히 이 작업을 수행하므로 스트리밍 루프 내부에서 올바른 호출입니다.
6.14.2. 역변환¶
ifft()는 왕복 변환이 부동소수점 오차 내에서 원래 입력을 반환하도록 정규화되어 있습니다. 두 호출 모두 실수 배열 쌍을 받고 반환합니다:
real, imag = np.fft.fft(y)
re_back, im_back = np.fft.ifft(real, imag)
6.14.3. 지배적 주파수 찾기¶
흔한 패턴은 샘플 버퍼(오디오, 진동, 변조된 IR)에서 가장 큰 피크를 찾는 것입니다. 그 방법은 다음과 같습니다:
N을 2의 거듭제곱으로 하여N개의 샘플을 캡처합니다.FFT를 수행합니다.
크기가 가장 큰 빈(bin)을 찾습니다.
샘플레이트를 사용해 빈 인덱스를 Hz로 변환합니다.
from ulab import numpy as np
N = 1024
fs = 8000.0 # sample rate, Hz
# ... fill ``samples`` with N data points ...
real, imag = np.fft.fft(samples)
spectrum = np.sqrt(real * real + imag * imag)
half = spectrum[:N // 2] # only first half is meaningful
peak_bin = np.argmax(half)
peak_hz = peak_bin * fs / N
print("peak at", peak_hz, "Hz")