FFT 결과가 있습니다. 이들은 double
실제 부품 배열과 가상 부품 배열의 두 배열 로 저장됩니다 . 이 배열의 각 요소에 해당하는 주파수를 어떻게 결정합니까?
다시 말해, FFT의 각 실제 및 가상 구성 요소에 대한 주파수를 저장하는 배열을 만들고 싶습니다.
FFT 결과가 있습니다. 이들은 double
실제 부품 배열과 가상 부품 배열의 두 배열 로 저장됩니다 . 이 배열의 각 요소에 해당하는 주파수를 어떻게 결정합니까?
다시 말해, FFT의 각 실제 및 가상 구성 요소에 대한 주파수를 저장하는 배열을 만들고 싶습니다.
답변:
FFT의 첫 번째 빈은 DC (0Hz)이고 두 번째 빈은입니다 Fs / N
. 여기서 Fs
샘플 속도 N
는 FFT의 크기입니다. 다음 빈은 2 * Fs / N
입니다. 이것을 일반적인 용어로 표현하면 n 번째 bin은 n * Fs / N
입니다.
따라서 샘플 속도 Fs
가 44.1 kHz이고 FFT 크기 N
가 1024 인 경우 FFT 출력 빈은 다음과 같습니다.
0: 0 * 44100 / 1024 = 0.0 Hz
1: 1 * 44100 / 1024 = 43.1 Hz
2: 2 * 44100 / 1024 = 86.1 Hz
3: 3 * 44100 / 1024 = 129.2 Hz
4: ...
5: ...
...
511: 511 * 44100 / 1024 = 22006.9 Hz
실제 입력 신호 (가상 부분은 모두 0)에 대해 FFT의 후반 (빈에서 N / 2 + 1
~까지 N - 1
)에는 유용한 추가 정보가 포함되어 있지 않습니다 (첫 번째 N / 2 - 1
빈 과 복잡한 켤레 대칭이 있음 ). (실제적인 응용을위한) 마지막 유용한 빈은에 N / 2 - 1
있으며, 위의 예에서 22006.9 Hz에 해당합니다. bin at N / 2
는 나이키 스트 주파수에서의 에너지, 즉 Fs / 2
(이 예에서는 = 22050 Hz)를 나타내지 만, 앤티 앨리어싱 필터는 일반적으로 및 그 이상에서 모든 신호를 감쇠 시키기 때문에 실용적이지는 않습니다 Fs / 2
.
내 대답을 살펴보세요 여기를 .
의견 답변 :
FFT는 실제로 동일한 간격의 주파수 범위에서 사인 및 코사인 함수 (기본 함수)를 사용하여 입력 신호 의 교차 상관 을 계산합니다 . 주어진 FFT 출력의 경우, 내가 게시 한 답변으로 주어진 해당 주파수 (F)가 있습니다. 출력 샘플의 실제 부분은 입력 신호와의 상호 상관 관계이고 cos(2*pi*F*t)
가상 부분은 입력 신호와 와의 상호 상관 관계입니다 sin(2*pi*F*t)
. 입력 신호가 서로 관련 sin
되고 cos
기능 하는 이유는 입력 신호와 기본 기능 간의 위상차를 설명하기위한 것입니다.
복잡한 FFT 출력의 크기를 사용하면 입력 신호 위상에 관계없이 입력 신호가 일련의 주파수에서 정현파와 얼마나 관련이 있는지 측정 할 수 있습니다. 신호의 주파수 내용 만 분석하는 경우 거의 항상 FFT의 복잡한 출력의 크기 또는 크기의 제곱을 취합니다.
나는 다음을 사용했다.
public static double Index2Freq(int i, double samples, int nFFT) {
return (double) i * (samples / nFFT / 2.);
}
public static int Freq2Index(double freq, double samples, int nFFT) {
return (int) (freq / (samples / nFFT / 2.0));
}
입력은 다음과 같습니다
i
: 액세스 할 수있는 저장소samples
: 헤르츠 샘플링 속도 (예 : 8000Hz, 44100Hz 등)nFFT
: FFT 벡터의 크기samples
또는로 무엇을 대표하는지 정확히 알 수 없습니다 nFFT
. 좀 더 설명해주세요.
i * samples / nFFT
. 왜 여분 2
이 있습니까? 뭔가 빠졌습니까?
FFT 출력 계수 (N 크기의 복잡한 입력에 대한)는 0에서 N-1 사이이며 [LOW, MID, HI, HI, MID, LOW] 주파수로 그룹화됩니다.
실제 데이터의 경우 FFT [Nk] = FFT [k]의 켤레 복소수이므로 k의 요소는 Nk의 요소와 주파수가 같다고 생각합니다.
LOW에서 HIGH로 스캔하는 순서는 다음과 같습니다.
0,
1,
N-1,
2,
N-2
...
[N/2] - 1,
N - ([N/2] - 1) = [N/2]+1,
[N/2]
인덱스 i = 0에서 [N / 2]까지의 [N / 2] +1 그룹의 주파수가 있으며 frequency = i * SamplingFrequency / N
bin FFT [k]의 주파수는 다음과 같습니다.
if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N