2017-03-19 16 views
1

나는 보수계 응용 프로그램에서 일하고 있는데 Arduino 101에서 arduinoFFT (kosme) 라이브러리를 사용하는 가속도계 데이터에서 실시간 fft를 실행하고 있습니다.fft 출력에서 ​​주파수를 알아내는 방법은 무엇입니까?

샘플링 주파수가 100Hz라고 가정 해 봅시다. 나는 걷거나 뛰는 주파수와 약 1-4Hz에서 일치하는 신체의 아래쪽 움직임에 관심이있다. 내가 사용하고있는 라이브러리를 포함하여 많은 라이브러리가 연산 크기 함수를 갖고있는 것처럼 보입니다. 이것은 효과적으로 진폭의 수를 사용하는 bin의 수를 절반으로 줄 것입니다 (64 개의 샘플을 입력하면 32 개의 진폭을 보입니다).

제 질문은 이러한 진폭이 어떤 주파수에 해당합니까? 내가 진정으로이 경우 이유를 이해하고 그것에 대해 완전히 바보되는하고 경우에 저를 용서하십시오하지 않는

for (int i=0; i<(noofbins>>1); i++) { 
    freq[i]=((i*samplingfreq)/(noofbins>>1)); 
} 

다음과 같이 라이브러리가 제공하는 예제 코드에서 는 주파수가 계산됩니다. 게다가 이것은 실제로 0에서 100Hz (내가 사용하는 샘플링 주파수)의 주파수를 제공합니다. 샘플링 빈도를 낮추지 않고 관심 주파수에 대해 fft를 미세 조정하는 방법이 있습니까 (이 경우 끔찍한 생각 일 수 있습니다).

+1

[FFT에서 각 값의 주파수는 어떻게 구할 수 있습니까?] (http://stackoverflow.com/questions/4364823/how-do-i-obtain-the-frequencies-of-each- -f-fft) –

+0

각 FFT bin의 해상도는'Fs/N = 100/64 = 1.5625 Hz'이므로 빈 인덱스 3은'3 * 1.5625 = 4.6875 Hz'의 빈도에 해당합니다 자세한 내용은 [링크 된 중복 답변] (http://stackoverflow.com/a/4371627/253056)을 참조하십시오. –

답변

1

이러한 진폭은 어떤 주파수에 해당합니까?

정확히 어디서 그런 예제를 얻었는지, 그리고 그것이 noofbins>>1으로 나눌 이유가 확실하지 않습니다. 각각의 주파수 빈에 대한 올바른 수식에 의해 주어진다 :

for (int i=0; i<(noofbins>>1); i++) { 
    freq[i]=((i*samplingfreq)/noofbins); 
} 

이것은 나이 퀴 스트 주파수 (샘플링 주파수의 절반) 0 내지에게 주파수를 제공한다. 특정 경우, 0에서 50Hz (100/64 = 1.5625Hz 씩 증가)입니다.

샘플링 주파수 [...]을 저하시키지 않고 관심 주파수에 대해 FFT를 정제의 방법이 있습니까?

더 많은 데이터를 캡처하면 FFT 입력의 샘플 수가 늘어나므로 FFT의 주파수 해상도가 향상됩니다. 예를 들어, 64 대신 128 샘플 (1 초보다 약간 큰 데이터)을 사용하면 1.5625Hz에서 0.78125Hz까지 주파수가 증가합니다. 샘플 수를 256 (약 2.5 초)으로 늘리면 주파수 증가가 ~ 0.39Hz로 감소합니다.

+0

예, 많은 의미가 있습니다. 내가해야 할 일은 10Hz에서 50Hz까지 미사용까지 여전히 가지고 있지만 더 많은 데이터를 얻는 것입니다. 샘플링 주파수를 10Hz로 낮추고 충분한 데이터가 도착할 때까지 기다리는 것이 현명합니다 (예 : 128 개의 저장소? 어쨌든 100Hz 샘플을 10Hz 샘플 10 개로 쪼개지는 못했습니까? – thephysicsguy

+1

신호에 5Hz 이상의 에너지가 포함되어 있지 않으면 실제로 샘플링 주파수를 10Hz까지 줄일 수 있습니다. 그러나 동일한 지속 시간 (예 : 1 초)을 기다리면 동일한 주파수 해상도가됩니다 (처리시 절약 할 수는 있지만).100Hz 샘플을 10Hz에서 10 묶음으로 자르기까지는 신호가 5Hz 이상의 에너지를 포함하지 않지만 그 신호는 무엇이겠습니까? – SleuthEye