ความสัมพันธ์ระหว่างความยาว FFT และความละเอียดความถี่คืออะไร


67

หากฉันสุ่มตัวอย่างสัญญาณโดยใช้วิธีการสุ่มตัวอย่างที่เหมาะสม (Nyquist, การกรอง ฯลฯ ) ฉันจะเชื่อมโยงความยาวของ FFT ของฉันกับความละเอียดความถี่ที่เกิดขึ้นได้อย่างไร

เช่นถ้าฉันมีคลื่นไซน์ 2,000 Hz และ 1,999 Hz ฉันจะกำหนดความยาวของ FFT ที่ต้องบอกความแตกต่างระหว่างคลื่นทั้งสองนี้ได้อย่างไร

คำตอบ:


81

ความละเอียดความถี่ขึ้นอยู่กับความสัมพันธ์ระหว่างความยาว FFT และอัตราการสุ่มตัวอย่างของสัญญาณอินพุต

ถ้าเรารวบรวมตัวอย่าง 8192 สำหรับ FFT เราจะได้:

8192 samples2=4096 FFT bins

หากอัตราการสุ่มตัวอย่างของเราคือ 10 kHz ทฤษฎีการสุ่มตัวอย่างของ Nyquist-Shannon กล่าวว่าสัญญาณของเราสามารถมีเนื้อหาความถี่ได้สูงสุด 5 kHz จากนั้นการแก้ปัญหาเรื่องความถี่ถังขยะของเราคือ:

5 kHz4096 FFT bins1.22 Hzbin

นี่คืออาจเป็นวิธีที่ง่ายต่อการอธิบายแนวคิดที่เรียบง่าย แต่: มติถังของคุณเป็นเพียงfsampNfsamp

เราเห็นได้จากข้างต้นว่าเพื่อให้ได้ถังขยะ FFT ที่เล็กลงเราสามารถใช้ FFT ที่ยาวขึ้น (นั่นคือใช้ตัวอย่างเพิ่มเติมในอัตราเดียวกันก่อนที่จะใช้ FFT) หรือลดอัตราการสุ่มตัวอย่างของเรา

จับ:

มักจะมีการแลกเปลี่ยนระหว่างการแก้ปัญหาชั่วคราวและการแก้ไขความถี่

ในตัวอย่างข้างต้นเราต้องรวบรวมตัวอย่าง 8192 ตัวอย่างก่อนที่เราจะสามารถเรียกใช้ FFT ซึ่งเมื่อการสุ่มตัวอย่างที่ 10 kHz ใช้เวลา 0.82 วินาที

หากเราพยายามรับ FFT ที่เล็กลงโดยการใช้ FFT ที่ยาวขึ้นมันจะใช้เวลานานขึ้นในการเก็บตัวอย่างที่ต้องการ

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

ในตัวอย่างนี้หากเสียง 1999 Hz เริ่มต้นและหยุดในครึ่งแรกของตัวอย่าง F19 8192 และเสียง 2002 Hz เล่นในครึ่งหลังของหน้าต่างเราจะเห็นทั้งสองอย่าง แต่ดูเหมือนว่าจะเกิดขึ้นในเวลาเดียวกัน เวลา.

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

ในตัวอย่างของคุณถ้าคุณลดอัตราการสุ่มตัวอย่างของคุณเป็น 4096 Hz คุณจะต้องใช้ 4096 point FFT เพื่อให้ได้ 1 Hz bins * 4096 Hz แล้วคุณจะต้อง 4096 point FFT เพื่อให้ได้ 1hz bins และยังสามารถแก้ไข a สัญญาณ 2khz สิ่งนี้จะลดขนาดถังขยะ FFT แต่ยังลดแบนด์วิดท์ของสัญญาณ

ในที่สุดด้วย FFT จะมีการแลกเปลี่ยนระหว่างความละเอียดความถี่และการแก้ปัญหาเวลาเสมอ คุณต้องทำตัวให้สมดุลเพื่อให้บรรลุเป้าหมายทั้งหมด


ด้วยแท็กส่วนหัวและการจัดรูปแบบบางโพสต์นี้อาจไปได้ดีถึงดีมาก คุณสัมผัสกับทุกสิ่งที่ฉันต้องการทราบและดีมาก แต่วิธีการโพสต์รูปแบบที่มีคนน้อยกว่าจะอ่านได้เนื่องจากความยาวของมันเป็นสิ่งต้องห้ามหากคุณให้ส่วนหัวกับแต่ละส่วนของสิ่งที่คุณคุยกับคนอื่น ๆ ชุดเหล่านั้นและจำนวน +1 ของคุณจะเพิ่มขึ้นเป็นจำนวนมาก ไม่ใช่จากฉันอย่างที่คุณได้รับแล้ว
Kortuk

@ เคิร์ตุกฉันคายอันนี้ออกมาอย่างเร่งด่วนฉันจะทำความสะอาดการจัดรูปแบบเมื่อฉันมีเวลาว่าง (หรืออย่าลังเลที่จะแก้ไขหากคุณต้องการ)
ทำเครื่องหมาย

1
@kortuk ชื่อขึ้นต้นด้วย 'o' ฉันคิดว่าคุณมีฉันแค่แบ่งปันมุมมองของฉันทั้งสำหรับคุณถ้าคุณไม่ได้รู้ แต่สำหรับชุมชนโดยรวม
Kortuk

1
โปรดทราบว่าคุณไม่จำเป็นต้องคำนวณ FFT หากคุณต้องการรู้เพียงไม่กี่ถังขยะก็มีราคาถูกกว่าในการคำนวณ DFT ของถังขยะเหล่านั้นมากกว่าที่จะเรียกใช้ FFT ที่ปรับให้เหมาะสมซึ่งจะคำนวณถังขยะทั้งหมดในครั้งเดียวด้วยการแบ่งปันการดำเนินการหลายอย่าง
Chris Stratton

นอกจากนี้ยังเป็นที่น่าสังเกตว่าการแลกเปลี่ยนโดเมน / เวลาที่คล้ายกันนี้ใช้กับตัวกรองแบบอะนาล็อกและ IIR
Caleb Reister

10

fsNfs

ความสามารถในการแยกสัญญาณที่มีระยะห่างสองสัญญาณอย่างใกล้ชิดขึ้นอยู่กับแอมพลิจูดสัมพัทธ์และฟังก์ชั่นหน้าต่าง

คุณอาจพบว่าการเล่นกับเครื่องวิเคราะห์สัญญาณ Baudlineเป็นวิธีที่ดีในการพัฒนาสัญชาตญาณในเรื่องนี้ - และไม่ใช่การใช้ FFTs และวางแผนสเปกตรัมหนึ่งครั้งใน Matlab หรือ Python / Numpy นั้นไม่เหมือนกัน

แก้ไข: นอกจากนี้ยังมีเคล็ดลับในการ pad อินพุตด้วยค่าศูนย์และรับ FFT ที่ใหญ่กว่า มันจะไม่พัฒนาความสามารถในการสร้างความแตกต่าง แต่อาจทำให้สเปกตรัมอ่านได้ง่ายขึ้น มันเป็นกลอุบายที่คล้ายกับการลดรอยหยักในกราฟิกแบบเวกเตอร์


ฉันเป็นคนเดียวที่ไม่เห็นรหัสลาเท็กซ์ที่จัดรูปแบบอย่างถูกต้องหรือไม่?
stevenvh

@stevenvh ไม่ทำงานสำหรับฉันเกินไป
เฉลียง

ใช้งานได้สำหรับฉัน น้ำยางมีเพียง 2 แห่ง
Kortuk

2
คงที่ (บางครั้งแล้ว) mathjax.org ส่วนเสริมของ NoScript ของ Firefox ถูกบล็อก
stevenvh

3

เป็นที่น่าสังเกตว่า FFT เป็นทางเลือกในการคำนวณจำนวนคู่ของจำนวนเงินที่แยกต่างหาก (k = 0..sample_length-1) ของตัวอย่าง [k] * SineRefWave [j] [k] และตัวอย่าง [j] * CosRefWave [j ] [k] สำหรับ j ทั้งหมดจนถึงความยาวตัวอย่างครึ่งหนึ่ง หากต้องการการอ่านค่าแอมพลิจูดที่ความถี่เหล่านี้ทั้งหมด FFT จะคำนวณพวกมันทั้งหมดในเวลา O (NlgN) ในขณะที่การคำนวณแต่ละตัวจะใช้เวลา O (N ^ 2) ในอีกทางหนึ่งหากต้องการเพียงแอมพลิจูด readouts ที่ความถี่ไม่กี่คนมักจะดีกว่าเพียงแค่คำนวณพวกเขาทีละคนโดยเฉพาะอย่างยิ่งหากมีการใช้โปรเซสเซอร์หรือ DSP ซึ่งสามารถคำนวณรูปแบบของผลรวมที่มีประสิทธิภาพ

นอกจากนี้ยังเป็นที่น่าสังเกตว่าในขณะที่ FFT ด้วยเช่นหน้าต่างสุ่มตัวอย่าง 20ms จะไม่สามารถแยกแยะระหว่างโทน 1975Hz เดียวหรือการรวมกันของความถี่ (1975-N) Hz และ (1975 + N) Hz สำหรับ N <25, สามารถใช้ในการวัดความถี่ที่แยกได้ด้วยความแม่นยำที่ดีกว่าหน้าต่างสุ่มตัวอย่างหากไม่มีเนื้อหาสเปกตรัมอื่น ๆ ในบริเวณใกล้เคียง ความถี่ 1975Hz เดียวจะรับได้เท่ากันในถังขยะ 1950Hz และ 2000Hz เช่นเดียวกับการรวมกันของเสียง 1974Hz และ 1976Hz อย่างไรก็ตามโทนเสียงที่แยกได้ 1974Hz จะรับสัญญาณได้ดีกว่าในถัง 1950Hz มากกว่าในถัง 2000Hz และเสียง 1976Hz จะรับแรงขึ้นอย่างมากในถัง 2000Hz


1

ความละเอียดความถี่ไม่ได้ขึ้นอยู่กับความยาวของ FFT แต่ความยาวของเวลาการสุ่มตัวอย่างทั้งหมด T คือ 1 / T ซึ่งเป็นองค์ประกอบความถี่ต่ำสุดที่คุณได้รับ

หมายเหตุการเพิ่มศูนย์เป็นศูนย์จะไม่เพิ่มการแก้ไขความถี่ DFT ของสัญญาณการเติมศูนย์เป็นเพียงการประมาณที่ดีกว่าของ DTFT ของสัญญาณเดิม


0

หากคุณทราบช่วงของความถี่ป้อนเข้าที่เป็นไปได้และช่วงแคบคุณอาจใช้การ Undersampling เพื่อลดจำนวนตัวอย่างและเวลาในการคำนวณ FFT ด้วย 256 ตัวอย่างและความถี่ตัวอย่างที่ 256 Hz คุณจะได้รับความละเอียด 1-Hz ที่ต้องการและแบนด์วิดท์ที่ไม่มีนามแฝงที่ 128 Hz


-3

ดูรูปนี้ ก็เป็นที่ชัดเจน. ความสัมพันธ์ระหว่าง fs และ fft resolution

ป้อนคำอธิบายรูปภาพที่นี่


5
ยังไม่ชัดเจนจากภาพนี้ว่าเกิดอะไรขึ้น (ไม่ช่วยว่ารูปภาพไม่ได้เป็นภาษาอังกฤษ) สิ่งนี้เพิ่มอะไรบ้างที่คำตอบอื่น ๆ ที่ไม่ได้กล่าวถึง
Greg d'Eon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.