FFT ของคลื่นไซน์ไม่มาตามที่คาดไว้นั่นคือจุดเดียว


14

พล็อตสีฟ้าเป็นสเปกตรัม 50 Hz และสีม่วงแดงหนึ่งคือคลื่นไซน์ 50.1 Hz (มีแอมพลิจูด 0.7) ทั้งสองตัวอย่างที่ 1024 ตัวอย่าง / s ฉันแสดง 1024 จุด FFT เพื่อให้ได้สเปกตรัมนี้

เหตุใดค่าความถี่ 50Hz จึงเป็นค่าเดียว ทำไมความถี่ 50.1 Hz ประกอบด้วยความถี่อื่นนอกเหนือจาก 50.1 Hz ความถี่ใหม่เหล่านี้มาจากไหน

ฉันไม่ได้ทำการประมวลผลใด ๆ ที่ไม่ใช่เชิงเส้นบนสัญญาณ 50.1 Hz! นอกจากนี้ 50.1 Hz ก็ดูเหมือนจะมีแอมพลิจูดสูงสุดที่เล็กกว่านั่นคือไม่ใช่ 0.7 เมื่ออันที่จริงแล้วคลื่นไซน์ที่ฉันสร้างขึ้นนั้นมีแอมพลิจูดที่ 0.7

ทำไมนี้

สองสเปกตรัมสำหรับ 50Hz และ 50.1Hz ตามลำดับ รับโดยคำสั่ง MATALB fft ();


คุณช่วยกรุณาโพสต์รหัสที่คุณใช้สร้างพล็อตนี้ได้ไหม? การเดาที่ดีที่สุดของฉันก็คือเพราะสัญญาณของคุณอยู่ใกล้กันมาก FFT จึงไม่สามารถแก้ไขได้ นั่นหรือการละเลงสเปกตรัมเนื่องจากตัวอย่างไม่สอดคล้องกับความถี่
Tom Kealy

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

ได้โปรดฉันรู้ไหมว่าคุณวางแผนจะทำอะไรกับคุณเพื่อให้ได้คะแนนที่ 50Hz
Nazario_Jnr

ดูคำตอบนี้สำหรับคำอธิบายโดยละเอียดเกี่ยวกับปัญหาและวิธีแก้ไข
Dilip Sarwate

คำตอบ:


14

คำตอบของ Matt จริง ๆ แล้วให้หนึ่งมุมมองเกี่ยวกับปัญหาที่นี่: DFT เป็นระยะโดยปริยายในโดเมนเวลาและความถี่ (ดูคำถามนี้ ) จากพารามิเตอร์ของคุณเราสามารถคำนวณได้ว่าช่วงเวลาการสังเกตของคุณคือ 1 วินาที นั่นหมายถึงคุณสังเกต 50 คาบ 50 โทนเฮิร์ตซ์ การขยายช่วงเวลาการสังเกตเป็นระยะ ๆ จะส่งผลให้เกิดคลื่นไซน์ที่ไม่มีลักษณะ หากคุณใช้เสียง 50.1 Hz คุณจะเปลี่ยนช่วงเวลา 50.1 ของการสั่น การยืดระยะนั้นสัญญาณจะส่งผลให้เกิดการข้ามเฟสที่ทำให้แควสเปกตรัมเพิ่มขึ้น

s/ยังไม่มีข้อความDFT=1024เฮิร์ตซ์/1024=1เฮิร์ตซ์เฮิร์ตซ์เนื่องจาก 50 Hz เป็นจำนวนเต็มคูณ 1 Hz เสียงนี้สามารถนำเสนออีกครั้งด้วยถังขยะ DFT เดียว เนื่องจากผลลัพธ์ของ DFT เป็นค่าแยกซึ่งมีช่องว่าง 1 Hz แยกกัน 50.1 Hz จึงไม่สามารถทำได้สามารถแทนด้วย bin เดียวและพลังงานถูกละเลงเหนือโดเมนความถี่ ในตัวอย่างของคุณนี่คือเหตุผลสำหรับสเปกตรัมสีม่วงแดงที่ไม่สมมาตรเล็กน้อยและสำหรับขนาดที่ต่ำกว่าของถัง 50 Hz เมื่อเทียบกับ 0.7 ขนาดของสเปกตรัม 50 Hz

เอฟเฟกต์ทั้งสองที่อธิบายไว้ข้างต้นช่วยให้สเปกตรัมที่คุณกำลังสังเกตเห็นอยู่


1
นั่นทำให้รู้สึก แต่เพื่อให้การรั่วไหลของสเปกตรัมชัดเจนยิ่งขึ้นที่คุณอธิบายเป็นปัญหากับเครื่องมือ (FFT) สำหรับการสังเกตสเปกตรัม มันไม่ได้เป็นข้อบกพร่องในสัญญาณ หมายถึงถ้าฉัน 'ได้ยิน' สัญญาณเสียง 50.1 Hz มันจะปรากฏเป็นเสียงเดียวในหูของฉันและไม่ใช่ 'เสียง' ฉันถูกไหม?
gpuguy

1
คุณพูดถูก มันแสดงให้เห็นถึงความสำคัญในการเข้าใจสิ่งที่ DFT กำลังทำอยู่เพื่อให้สามารถตีความได้อย่างถูกต้อง ในฐานะ sidenote: สิ่งที่คุณจะ "ได้ยิน" ในการนำไปใช้งานจริงนั้นขึ้นอยู่กับว่าคุณแปลงสัญญาณแยกเป็นสัญญาณแอนะล็อก
Deve

11

นี่คือผลกระทบของการตัดหรือตัดสัญญาณไซน์ คุณต้องตัดทอนในลักษณะที่ถ้าคุณเพิ่มสัญญาณที่ถูกเลื่อนไปยังสัญญาณที่ถูกตัดทอนมันจะยังคงเป็นคลื่นไซน์ดั้งเดิม


6

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

50.1 Hz ไม่ตรงตามช่วงเวลาในหน้าต่าง 1 วินาทีของ FFT

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

เนื่องจากพลังงานทั้งหมดได้รับการเก็บรักษาไว้โดยการแปลง FFT (ทฤษฎีบทของ Parseval'a) พลังงานในถังขยะ "รั่วไหล" จะนำออกไปจากถังขยะสูงสุด ดังนั้นขนาดของถังขยะสูงสุดจะต้องลดลง


5

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

ดูhttps://gist.github.com/endolith/236567สำหรับตัวอย่างของงูหลาม:

# Sampling rate
fs = 128 # Hz

# Time is from 0 to 1 seconds, but leave off the endpoint, so that 1.0 seconds is the first sample of the *next* chunk
length = 1 # second
N = fs * length
t = linspace(0, length, num = N, endpoint = False)

# Generate a sinusoid at frequency f
f = 10 # Hz
a = cos(2 * pi * f * t)

# Use FFT to get the amplitude of the spectrum
ampl = 1/N * abs(fft(a))

ดูว่าสัญญาณทั้งสองชุดเข้าด้วยกันตั้งแต่ต้นจนจบเพื่อสร้างคลื่นต่อเนื่องได้อย่างไร:

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

เมื่อสิ่งนี้เกิดขึ้นพลังงาน FFT จะอยู่ในถังขยะเดียว:

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


1
ฉันมีปัญหาเช่นเดียวกับ OP มันได้รับการแก้ไขด้วยการตั้งค่า endpoint = False ฉันคิดว่าเส้นสเปซคือ (ปิด, เปิด) โดยค่าเริ่มต้น แต่ปรากฎว่าเป็น (ปิด, ปิด) ฉันพบข้อบกพร่องด้วยรหัสของคุณ
Trismegistos

-1

ปัญหานี้เกิดขึ้นเนื่องจากการรั่วไหลของสเปกตรัมและการสร้างหน้าต่าง การตอบสนองในอุดมคติคือฟังก์ชั่นอิมพัลส์สำหรับคลื่นไซน์เวลาต่อเนื่อง เมื่อคุณใช้ DFT ของคลื่นไซน์ที่ไม่ต่อเนื่องในคอมพิวเตอร์ดิจิทัลคุณจะใช้การแปลงฟูริเยร์ของไซน์ที่มีหน้าต่างและตัวอย่างแล้วจากนั้นสุ่มมันในโดเมนความถี่ สิ่งนี้ทำให้เกิดการรั่วไหลของสเปกตรัม อ้างอิง: http://w.astro.berkeley.edu/~jrg/ngst/fft/leakage.html

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