ทำไมฉันต้องเป็นศูนย์สัญญาณก่อนที่จะทำการแปลงฟูริเยร์?


77

ในคำตอบของคำถามก่อนหน้านี้มีการระบุว่าควร

zero-pad สัญญาณอินพุต (เพิ่มศูนย์ไปยังจุดสิ้นสุดเพื่อให้คลื่นอย่างน้อยครึ่งหนึ่งเป็น "ช่องว่าง")

เหตุผลนี้คืออะไร


ขึ้นอยู่กับสิ่งที่คุณทำ นี่อาจเป็นความเห็นต่อคำตอบของฉัน ฉันเพิ่มคำอธิบายลงไป
endolith

@endolith: ตอนแรกฉันคิดว่าจะใส่มันเป็นความคิดเห็น แต่ฉันคิดว่าคำถามอาจเป็นที่สนใจทั่วไปและมันจะน่าเสียดายถ้าคำตอบที่ดีกับมันถูกฝังอยู่ในความคิดเห็นที่ไหนสักแห่ง หากคุณไม่เห็นด้วยฉันจะลบคำถามนี้
Jonas

9
มันเป็นคำถามทั่วไปมาก คุณสามารถเป็นศูนย์แผ่นเพื่อทำให้บางสิ่งบางอย่างพลังงานของ 2 คุณสามารถเป็นศูนย์แผ่นเพื่อให้การแปลงแบบวงกลมทำตัวเหมือนการแปลงแบบไม่เป็นวงกลมคุณสามารถทำมันเพื่อสุ่มสัญญาณใหม่เปลี่ยนความละเอียดความถี่ ฯลฯ
endolith

ที่เกี่ยวข้องเพิ่มเติม: dsp.stackexchange.com/questions/331/…
finnw

คำตอบ:


82

การซ้อนศูนย์เป็นศูนย์อนุญาตให้ใช้ FFT ที่ยาวขึ้นซึ่งจะทำให้เวกเตอร์ผลลัพธ์ FFT ที่ยาวขึ้น

ผลลัพธ์ FFT ที่ยาวขึ้นจะมีช่องเก็บความถี่มากขึ้น แต่พวกเขาจะให้ผลเช่นเดียวกับการแก้ไข Sinc ที่มีคุณภาพสูงของ FFT ที่ไม่เป็นศูนย์ที่สั้นกว่าของข้อมูลต้นฉบับ

ซึ่งอาจส่งผลให้สเปกตรัมดูนุ่มนวลขึ้นเมื่อลงจุดโดยไม่มีการแก้ไขเพิ่มเติม

แม้ว่าการแก้ไขนี้จะไม่ช่วยในการแก้ไขหรือความละเอียดของและ / หรือระหว่างความถี่ที่อยู่ติดกันหรือใกล้เคียง แต่ก็อาจทำให้ง่ายต่อการแก้ไขจุดสูงสุดของความถี่ที่แยกเดี่ยวที่มองเห็นได้ซึ่งไม่มีสัญญาณหรือเสียงรบกวนใด ๆ . ในทางสถิติความหนาแน่นที่สูงขึ้นของถังขยะผลลัพธ์ FFT อาจทำให้มีโอกาสมากขึ้นที่ bin magnitude ขนาดสูงสุดใกล้กับความถี่ของไซน์ซอยด์ความถี่อินพุตที่แยกแบบสุ่มและไม่มีการแก้ไขเพิ่มเติม (parabolic, et.al. )

แต่โดยพื้นฐานแล้วการเติมเต็มศูนย์เป็นศูนย์ก่อน DFT / FFT เป็นวิธีการคำนวณที่มีประสิทธิภาพในการแก้ไขจุดจำนวนมาก

การซ้อนศูนย์สำหรับการกรองข้ามสหสัมพันธ์อัตโนมัติหรือการกรอง Convolution ถูกใช้เพื่อไม่ผสมผลลัพธ์ของการบิด (เนื่องจากการบิดเป็นวงกลม) ผลเต็มรูปแบบของการบิดเชิงเส้นยาวกว่าทั้งสองเวกเตอร์อินพุต หากคุณไม่ได้จัดเตรียมสถานที่เพื่อยุติผลการสนทนาที่ยาวนานกว่านี้การบิดอย่างรวดเร็วของ FFT จะผสมเข้าด้วยกันและ cruft up ผลลัพธ์ที่คุณต้องการ Zero-padding ให้ค่าศูนย์เป็นศูนย์ที่จะผสมผลลัพธ์ที่ยาวกว่า และมันง่ายกว่าที่จะยกเลิกการผสมบางอย่างที่มีการผสม / สรุปด้วยเวกเตอร์ศูนย์


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

4
@Jason R: อันที่จริงพวกเขาทั้งคู่เป็นวงกลม FFT ปกติ (ไม่ถูกตัด) จะทำการคูณและเพิ่มสำหรับการล้อมรอบส่วนของผลลัพธ์ มันแค่นั้นในกรณีที่ไม่มีเบาะรองศูนย์อย่างเพียงพอการคูณและการบวกทั้งหมดนั้นมีค่าเป็นศูนย์ดังนั้นจึงไม่มีใครสนใจสิ่งที่คำนวณและพันรอบวงกลม
hotpaw2

9
แท้จริง; การเพิ่มทวีคูณของ DFTs ของสัญญาณสองอันนั้นจะทำให้เกิดการสังสรรแบบวงกลม ฉันควรจะพูดมันแตกต่างกัน: คุณใส่เลขศูนย์ท้ายสัญญาณเดียวเพื่อให้แน่ใจว่าผลลัพธ์ที่ได้จากการวนเวียนพวกมันเหมือนกับสิ่งที่คุณได้รับถ้าคุณโน้มน้าวพวกเขาเป็นเส้นตรง (สมมติว่าการบิดเชิงเส้นเป็นสิ่งที่คุณต้องการ มักจะเป็นกรณี)
Jason R

27

มีบางสิ่งที่ต้องพิจารณาก่อนตัดสินใจเลือก zero pad สัญญาณเวลาโดเมนของคุณ คุณอาจไม่จำเป็นต้องเป็นศูนย์สัญญาณสัญญาณเลย!

1) เพิ่มความยาวของข้อมูลโดเมนเวลา (ไม่ใช่การเติมเต็มศูนย์) เพื่อให้ได้ความละเอียดที่ดีขึ้นในโดเมนความถี่

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

fs/NfsN

มีตัวเลขที่ดีแสดงให้เห็นถึงจุดเหล่านี้ที่http://www.bitweenie.com/listings/fft-zero-padding/

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


8

โดยทั่วไปการเติมเต็มศูนย์ก่อน DFT เทียบเท่ากับการแก้ไขหรือสุ่มตัวอย่างบ่อยขึ้นในโดเมนที่ถูกแปลง

นี่คือการสร้างภาพข้อมูลที่รวดเร็วเกี่ยวกับการทำงานของสิ่งที่ตรงกันข้าม หากคุณสุ่มตัวอย่างสัญญาณไม่ จำกัด เวลาในอัตราที่สูงขึ้นคุณจะได้สเปกตรัมที่ 'แบน' มากขึ้นนั่นคือสเปกตรัมที่มีเลขศูนย์ที่ปลายทั้งสองมากขึ้น กล่าวอีกนัยหนึ่งคุณสามารถรับตัวอย่างเพิ่มเติมได้ทันเวลาโดยเพียงแค่ไม่มีการเติมเต็มความถี่หลังจาก DFT'ing และจากนั้น IDFT'ing ผลลัพธ์แบบ zero-padded

เอฟเฟกต์เหมือนกันจะเก็บกลับด้านเมื่อ zero-padding เกิดขึ้นในเวลา ทั้งหมดนี้เป็นเพราะการสร้างสัญญาณที่สมบูรณ์แบบนั้นเป็นไปได้ตราบใดที่สัญญาณไม่ จำกัด แบนด์วิดท์และตัวอย่างอย่างน้อยที่สุดที่อัตรา Nyquist

คำว่า 'การแก้ไข' นั้นขึ้นอยู่กับวิธีที่คุณกำหนด สำหรับฉันมันหมายถึงการแยกแยะจุดที่อยู่ติดกันทั้งสองด้านในเวลาหรือความถี่ได้อย่างน่าเชื่อถือ (แยกทางสถิติ) ในกรณีนี้ความละเอียดขึ้นอยู่กับขนาด DFT เนื่องจากการรั่วไหลของสเปกตรัม นั่นคือขนาดของหน้าต่างที่เล็กลงทำให้สัญญาณที่ถูกแปลงพร่ามัวหรือเปื้อนมากขึ้นและในทางกลับกัน มันแตกต่างจากความถี่ที่คุณสุ่มตัวอย่างหรือสิ่งที่ฉันเรียกว่า 'คำจำกัดความ' ตัวอย่างเช่นคุณสามารถสุ่มตัวอย่างภาพเบลอมาก ๆ ในอัตราที่สูง (ความคมชัดสูง) แต่คุณยังไม่สามารถรับข้อมูลเพิ่มเติมได้มากกว่าการสุ่มตัวอย่างด้วยอัตราที่ต่ำกว่า ดังนั้นโดยสรุปการ zero-padding ไม่ได้ปรับปรุงความละเอียดเลยเนื่องจากคุณไม่ได้รับข้อมูลมากขึ้นกว่า แต่ก่อน


6

หากใครมีความสนใจในสเปกตรัมของฟังก์ชั่นหน้าต่างที่ใช้ในการแยกตัวอย่างโดเมนเวลาแล้ว zero-padding จะเพิ่มความละเอียดความถี่ของฟังก์ชั่นหน้าต่าง

x(t)w(t)w(t)X(f)W(f)

x(t)X(f)คุณจะเห็นตัวอย่างในที่อื่นที่ไม่ใช่จุดสูงสุดและจุดผ่านศูนย์ซึ่งเผยให้เห็นรูปร่างของฟังก์ชันการซิงค์ในสเปกตรัมที่ได้ ดังนั้นสิ่งที่ใช้เป็นศูนย์รอง? มันเป็นการใช้เพื่อการศึกษาอย่างแน่นอนในการเปิดเผยธรรมชาติของการแปลงสัญญาณแบบไม่ต่อเนื่องซึ่งเป็นกรณีปกติ ในทางปฏิบัติมันอาจมีประโยชน์ในกรณีใด ๆ ที่คุณสนใจในรูปร่างสเปกตรัมของซองจดหมายที่แยกได้ซึ่งขี่บนคลื่นพาหะ


4

อาจมีเหตุผลที่แตกต่างกันขึ้นอยู่กับกระบวนการใด ๆ ที่ดำเนินการก่อนและหลังการแปลงฟูริเยร์ เหตุผลที่พบบ่อยที่สุดคือการบรรลุความละเอียดความถี่ที่มากขึ้นในการแปลงผลลัพธ์ใด ๆ กล่าวคือยิ่งจำนวนตัวอย่างที่ใช้ในการแปลงของคุณมากขึ้นเท่าไรก็จะยิ่งมีความกว้างของช่องว่างในสเปกตรัมกำลังงานที่มากขึ้นเท่านั้น เตือนความจำ: binwidth = sample_frequency / transform_size (มักเรียกว่าขนาดหน้าต่าง) คุณสามารถจินตนาการได้จากสิ่งนี้ว่าเมื่อคุณเพิ่มขนาดการแปลงของคุณแบนด์วิดท์จะลดลง (= ความละเอียดความถี่ที่ดีขึ้น) การเพิ่มศูนย์เป็นวิธีหนึ่งในการเพิ่มขนาดการแปลงโดยไม่ต้องแนะนำข้อมูลใหม่ให้กับสัญญาณ

ดังนั้นทำไมไม่ใช้การแปลงที่ใหญ่กว่าโดยไม่มีการเติมเต็มศูนย์? นั่นจะไม่บรรลุผลเช่นเดียวกันหรือไม่? คำถามที่ดี. ในหลายกรณีคุณอาจต้องการวิเคราะห์กระแสข้อมูลโดเมนเวลาซึ่งคุณอาจใช้การแปลงฟูริเยร์ในระยะเวลาอันสั้น (stft) สิ่งนี้เกี่ยวข้องกับการแปลงตัวอย่าง N ทุกตัวตามความละเอียดของเวลาที่คุณต้องการเพื่อระบุลักษณะการเปลี่ยนแปลงในสเปกตรัมความถี่ ปัญหาอยู่ที่นี่ หน้าต่างใหญ่เกินไปและคุณจะสูญเสียความละเอียดของเวลาหน้าต่างเล็กเกินไปและคุณจะสูญเสียความละเอียดของความถี่ วิธีแก้ปัญหาคือการใช้หน้าต่างโดเมนเวลาเล็ก ๆ ให้ความละเอียดของช่วงเวลาที่ดีและให้ศูนย์เป็นศูนย์เพื่อให้การแก้ปัญหาความถี่ที่ดี หวังว่านี่จะเป็นประโยชน์สำหรับคุณ

อัปเดต
ฉันไม่ได้อธิบายสิ่งนี้ดี ฉันควรจะชี้แจงให้ดีขึ้น หมายถึงการแปลงแบบหน้าต่างแน่นอนคุณไม่ได้รับความละเอียดความถี่มากขึ้น 'จริง' แต่สำหรับการสร้างภาพ (อ่านสเปกตรัมพลังงานด้วยตา) ก็สามารถให้ผลลัพธ์ที่ชัดเจน การใช้อัตราการสุ่มตัวอย่างที่สำคัญแต่ละกลีบด้านข้างใช้ถังขยะเดี่ยวซึ่งขึ้นอยู่กับเทคนิคการสร้างกราฟอาจทำให้เข้าใจผิด Zero padding ให้สเปกตรัมคลื่นความถี่ซึ่งอาจเป็นการเปิดเผยเพิ่มเติม นอกจากนี้หากคุณใช้วิธีการเลือกสูงสุดแบบง่ายสำหรับการประมาณความถี่ผลการประมาณสเปกตรัมของการเติมเต็มศูนย์จะให้ตัวอย่างสเปกตรัมใกล้กับจุดสูงสุดที่แท้จริงของกลีบหลัก ลิงก์นี้มีไดอะแกรมที่มีประโยชน์: http://www.dsprelated.com/dspbooks/sasp/Practical_Zero_Padding.html


9
คำตอบนี้ไม่ถูกต้อง Zero-padding ไม่ได้ปรับปรุงความละเอียดของคลื่นเลย มันแค่สอดแทรกระหว่างเอาท์พุทของการแปลงที่เล็กกว่า คุณสามารถนึกได้ว่าการเติมเต็มศูนย์นั้นเป็นการเพิ่มถังขยะความถี่ที่มีแบนด์วิดท์เท่ากันกับการแปลงที่เล็กกว่า ดังนั้นจากมุมมองของตัวกรองธนาคาร passbands ของพวกเขาจึงทับซ้อนกัน
Jason R

1
หากมันช่วยให้เข้าใจ: คุณสามารถทำสิ่งตรงกันข้ามได้เช่นกัน: นำสัญญาณ FFT ของสัญญาณจากนั้นให้ผลลัพธ์เป็นศูนย์จากนั้นหมุน FFT สิ่งนี้จะมีผลในการสอดแทรกสัญญาณดั้งเดิม แต่แน่นอนว่าสัญญาณจะยังคงเป็นสัญญาณเดียวกันกับแบนด์วิดท์ Nyquist เดียวกัน การแก้ไขจะไม่ให้ข้อมูลความถี่สูงกว่าที่เคยมี
endolith

1
@ Jason R - คุณถูกต้องคำตอบของฉันถูกทำให้เข้าใจผิดฉันได้พยายามชี้แจงด้านบนในโพสต์ต้นฉบับ ฉันไม่ควรระบุว่าการเติมเต็มศูนย์เพิ่มความละเอียดความถี่
Dan Barry

2

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

อัลกอริธึม Radix-2 มีประสิทธิภาพมากขึ้นดังนั้นการขยายศูนย์ไปที่กำลังถัดไปของ 2 (หรือกำลังของ 4 ในบางกรณีสำหรับ radix-4) หรือการหลีกเลี่ยงปัจจัยสำคัญขนาดใหญ่ใด ๆ สามารถปรับปรุงประสิทธิภาพของเวลาจริงได้ เมื่อใช้ FFT ในการวิเคราะห์มักมีการเติมเต็มศูนย์เพื่อคำนวณตัวอย่างของ DTFT เช่นการพิจารณาการตอบสนองความถี่ของ FIR: เปรียบเทียบ fft ([1 1 1 1]) กับ fft ([1 1 1 1], 512) ซึ่งเหมือนกับ freqz ([1 1 1 1])

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