FFT에서 각 값의 주파수를 어떻게 얻습니까?


148

FFT 결과가 있습니다. 이들은 double실제 부품 배열과 가상 부품 배열의 두 배열 로 저장됩니다 . 이 배열의 각 요소에 해당하는 주파수를 어떻게 결정합니까?

다시 말해, FFT의 각 실제 및 가상 구성 요소에 대한 주파수를 저장하는 배열을 만들고 싶습니다.


C # .net에서 수행합니다. 도와주세요?
랑고

9
FFT의 실제 및 가상 부분의 관련성을 이해하지 못하면 의미있는 결과를 얻지 못하므로 결과를 해석하는 방법을 이해하기 위해 FFT 및 신호 처리 자습서를 찾아야합니다. 나는 당신이 무엇을 사용하든 FFT 또는 Power Spectral Density의 크기를 원할 것입니다.
the_mandrill

감사합니다! 각 프레임의 피크 주파수를 얻고 싶습니다 (프레임 길이는 창 길이와 이동 길이에 따라
다름

답변:


350

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.


8
참고-대답이 약간 잘못되었습니다. 512 번째 버킷에는 가장 낮은 한계 인 22050의 레벨이 포함되어 있습니다. 빈 0 ~ N / 2에는 유용한 값이 포함됩니다.
david van brink

4
편집 및 설명 주셔서 감사합니다 ... 나는 이것이 실용성이 부족한 곳이라고 생각합니다. 나 :하지만 스승님, FFT는 가장 까다로운 일입니다! 당신 : Padawan, 당신은 정말로 그것을 걸러 내야합니다.
david van brink 0

5
별표를 표시 할 수 있으면 좋겠습니다. 이 답변은 원래 질문보다 훨씬 좋습니다!
Skylion

14
@PaulR-지난 몇 년 동안 저에게 도움을 주신이 훌륭한 답변에 감사드립니다. StackOverflow 계정을 사용하기 전에이 답변을 방문하고 실제로 가입 한 후 감사하는 것을 잊었습니다. 나는 최근에 FFT 자료를 살펴 보았고 귀하의 답변을 기억하고 방금 방문했습니다. 내가 여기에 도착하면, 나는 당신에게 감사하는 것을 기억했다. 그래서 감사합니다! FFT의 가로 축의 각 점이 무엇인지 해석하는 것에 대해 누군가와 토론 할 때 마다이 링크를 가리 킵니다.
rayryeng

6
@rayryeng : 정말 고마워요-5 년 동안 질문에 답한 최고의 답변이라고 생각합니다.
Paul R

55

내 대답을 살펴보세요 여기를 .

의견 답변 :

FFT는 실제로 동일한 간격의 주파수 범위에서 사인 및 코사인 함수 (기본 함수)를 사용하여 입력 신호 의 교차 상관 을 계산합니다 . 주어진 FFT 출력의 경우, 내가 게시 한 답변으로 주어진 해당 주파수 (F)가 있습니다. 출력 샘플의 실제 부분은 입력 신호와의 상호 상관 관계이고 cos(2*pi*F*t)가상 부분은 입력 신호와 와의 상호 상관 관계입니다 sin(2*pi*F*t). 입력 신호가 서로 관련 sin되고 cos기능 하는 이유는 입력 신호와 기본 기능 간의 위상차를 설명하기위한 것입니다.

복잡한 FFT 출력의 크기를 사용하면 입력 신호 위상에 관계없이 입력 신호가 일련의 주파수에서 정현파와 얼마나 관련이 있는지 측정 할 수 있습니다. 신호의 주파수 내용 만 분석하는 경우 거의 항상 FFT의 복잡한 출력의 크기 또는 크기의 제곱을 취합니다.


실수와 허수 부분은 FFT의 결과물입니까? 설명해주세요. 감사합니다
Rango

5
이 대답은 더 많은 사랑이 필요합니다.
밝은 별

1
복잡한 출력의 크기가 각각 두 배가되어야합니까? (내 해석을 하반기로 제한하는 경우)
Wolf

18

나는 다음을 사용했다.

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 벡터의 크기

7
사람들은 samples또는로 무엇을 대표하는지 정확히 알 수 없습니다 nFFT. 좀 더 설명해주세요.
mostar

14
수락 된 답변은 이것이되어야한다고 말합니다 i * samples / nFFT. 왜 여분 2이 있습니까? 뭔가 빠졌습니까?
yati sagade

13

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

5

k 번째 FFT 결과의 주파수는 2 * pi * k / N입니다.


6
나는 이것이 라디안
Barnaby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.