ฉันจะรับความถี่ของแต่ละค่าใน FFT ได้อย่างไร


148

ฉันมีผลลัพธ์ FFT สิ่งเหล่านี้ถูกจัดเก็บในสองdoubleอาร์เรย์: อาร์เรย์จริงและอาร์เรย์ส่วนจินตภาพ ฉันจะกำหนดความถี่ที่สอดคล้องกับแต่ละองค์ประกอบในอาร์เรย์เหล่านี้ได้อย่างไร

กล่าวอีกนัยหนึ่งฉันต้องการสร้างอาร์เรย์ที่เก็บความถี่สำหรับองค์ประกอบจริงและจินตภาพของ FFT ของฉัน


ฉันทำใน C # .net คุณสามารถช่วยฉันได้ไหม?
Rango

9
หากคุณไม่เข้าใจความเกี่ยวข้องของส่วนที่เป็นจริงและจินตภาพของ FFT คุณจะไม่ได้รับผลลัพธ์ที่มีความหมายดังนั้นคุณควรค้นหา FFT และแบบฝึกหัดการประมวลผลสัญญาณเพื่อทำความเข้าใจวิธีตีความผลลัพธ์ ฉันคิดว่ามันค่อนข้างเป็นไปได้ว่าสิ่งที่คุณกำลังใช้งานอยู่นั้นคุณต้องการขนาดของ FFT หรือ Power Spectral Density
the_mandrill

ขอบคุณ! ฉันต้องการความถี่สูงสุดของแต่ละเฟรม (ความยาวของเฟรมขึ้นอยู่กับความยาวของหน้าต่างและความยาวของการ
เลื่อน

คำตอบ:


350

ถังขยะแรกใน FFT คือ DC (0 Hz), ถังขยะที่สองคือFs / Nที่ซึ่งFsเป็นอัตราตัวอย่างและNขนาดของ FFT 2 * Fs / Nถังต่อไปคือ ในการแสดงนี้ในแง่ทั่วไปที่ nn * 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

โปรดทราบว่าสำหรับสัญญาณเข้าจริง (ส่วนจินตภาพทั้งหมดเป็นศูนย์) ในช่วงครึ่งหลังของ FFT (ถังขยะจากN / 2 + 1ถึงN - 1) ไม่มีข้อมูลเพิ่มเติมที่เป็นประโยชน์ (พวกเขามีสมมาตรที่ซับซ้อนสมมาตรกับN / 2 - 1ถังขยะแรก) Bin สุดท้ายที่มีประโยชน์ (สำหรับการใช้งานจริง) อยู่ที่N / 2 - 1ซึ่งสอดคล้องกับ 22006.9 Hz ในตัวอย่างข้างต้น ถังที่N / 2หมายถึงพลังงานที่ความถี่ Nyquist คือFs / 2(= 22,050 เฮิร์ตซ์ในตัวอย่างนี้) แต่นี่คือโดยทั่วไปไม่ได้มาจากการใช้งานจริงใด ๆ ตั้งแต่ฟิลเตอร์ anti-aliasing โดยทั่วไปแล้วจะลดทอนสัญญาณใด ๆ Fs / 2และเหนือ


8
หมายเหตุ - คำตอบนั้นผิดเล็กน้อย - ที่ฝากข้อมูลชุดที่ 512 มีระดับสำหรับ 22050 ซึ่งเป็นขีด จำกัด nyquist การรวม 0 ถึง N / 2 ช่องเก็บประกอบด้วยค่าที่มีประโยชน์
David van brink

4
ขอบคุณสำหรับการแก้ไข & ความกระจ่าง ... ฉันคิดว่านี่เป็นที่ที่ฉันเปิดเผยว่าการใช้งานไม่ได้จริง ฉัน: แต่ปรมาจารย์ FFT ทำงานเพื่อนักชก! คุณ: Padawan คุณควรกรองสิ่งนั้นออกไป
david van brink

5
ฉันหวังว่าฉันจะตอบดาวได้ คำตอบนี้ดียิ่งกว่าคำถามเดิม!
Skylion

14
@ PaulR - ฉันอยากจะขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ที่ให้บริการฉันในช่วงหลายปีที่ผ่านมา ฉันจะไปที่คำตอบนี้ก่อนที่ฉันจะมีบัญชี StackOverflow และจริง ๆ แล้วฉันลืมขอบคุณเมื่อคุณลงทะเบียน ฉันเพิ่งดูสิ่ง FFT และฉันจำคำตอบของคุณและเพิ่งเข้าชมตอนนี้ เมื่อฉันมาถึงที่นี่ฉันจำได้ว่าต้องขอบคุณ ... ขอบคุณมาก! เมื่อใดก็ตามที่ฉันมีการถกเถียงกับใครบางคนเกี่ยวกับการตีความสิ่งที่แต่ละจุดบนแกนนอนของ FFT คือฉันแค่ชี้พวกเขาไปที่ลิงค์นี้
rayryeng

6
@rayryeng: ขอบคุณมาก - ฉันคิดว่านั่นเป็นคำตอบที่ดีที่สุดที่ฉันเคยเจอในการตอบคำถามที่นี่ประมาณ 5 ปี!
พอล R

55

ลองดูที่คำตอบของฉันที่นี่

ตอบความคิดเห็น:

FFT จะคำนวณความสัมพันธ์ข้ามของสัญญาณอินพุตด้วยฟังก์ชันไซน์และโคไซน์ (ฟังก์ชันพื้นฐาน) ที่ช่วงความถี่ที่เท่ากัน สำหรับเอาต์พุต FFT ที่กำหนดมีความถี่ (F) ที่สอดคล้องกันตามคำตอบที่ฉันโพสต์ ส่วนที่แท้จริงของกลุ่มตัวอย่างออกเป็นข้ามความสัมพันธ์ของสัญญาณอินพุทที่มีและส่วนจินตภาพเป็นข้ามความสัมพันธ์ของสัญญาณเข้ากับcos(2*pi*F*t) sin(2*pi*F*t)เหตุผลที่สัญญาณอินพุตมีความสัมพันธ์กับsinและcosฟังก์ชั่นคือการบัญชีสำหรับความแตกต่างของเฟสระหว่างสัญญาณอินพุตและฟังก์ชั่นพื้นฐาน

ด้วยการวัดขนาดของเอาต์พุต FFT ที่ซับซ้อนคุณจะได้รับการวัดว่าสัญญาณอินพุทมีความสัมพันธ์กับไซนัสอยด์ที่ความถี่เท่าใดโดยไม่คำนึงถึงเฟสสัญญาณเข้า หากคุณเป็นเพียงการวิเคราะห์เนื้อหาความถี่ของสัญญาณคุณมักจะใช้ขนาดหรือขนาดกำลังสองของเอาต์พุตที่ซับซ้อนของ FFT


ชิ้นส่วนจริงและจินตภาพคือผลลัพธ์ของ FFT ที่ใช้สำหรับ? กรุณาอธิบายให้ฉัน ขอบคุณ
Rango

5
คำตอบนี้สมควรได้รับความรักมากขึ้น
bright-star

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: Bin เพื่อเข้าถึง
  • samples: อัตราการสุ่มตัวอย่างเป็นเฮิรตซ์ (เช่น 8000 Hz, 44100Hz และอื่น ๆ )
  • nFFT: ขนาดของเวกเตอร์ FFT

7
คนไม่สามารถทราบว่าสิ่งที่คุณแทนด้วยหรือsamples nFFTดังนั้นโปรดอธิบายให้มากขึ้น
Mostar

14
i * samples / nFFTคำตอบที่ได้รับการยอมรับว่านี้ควรจะเป็น ทำไมมีพิเศษ2หรือไม่ ฉันพลาดอะไรไปรึเปล่า?
yati sagade

13

ค่าสัมประสิทธิ์การส่งออก FFT (สำหรับการป้อนข้อมูลที่ซับซ้อนขนาด N) อยู่ระหว่าง 0 ถึง N - 1 จัดกลุ่มเป็นความถี่ [LOW, MID, HI, HI, HI, MID, LOW]

ฉันจะพิจารณาว่าองค์ประกอบที่ k มีความถี่เช่นเดียวกับองค์ประกอบที่ Nk เนื่องจากข้อมูลจริง FFT [Nk] = คอนจูเกตที่ซับซ้อนของ FFT [k]

ลำดับการสแกนจากความถี่ต่ำถึงสูงคือ

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

มี [N / 2] +1 กลุ่มความถี่จากดัชนี i = 0 ถึง [N / 2] แต่ละกลุ่มมี 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 th FFT ของคุณคือ 2 * pi * k / N


6
ฉันเดาว่านี่จะเป็นเรเดียน
Barnaby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.