ฉันต้องการความช่วยเหลือในการทำความเข้าใจผลลัพธ์ของการคำนวณ DFT / FFT
ฉันเป็นวิศวกรซอฟต์แวร์ที่มีประสบการณ์และต้องการตีความการอ่านค่ามาตรความเร่งของสมาร์ทโฟนบางอย่างเช่นการค้นหาความถี่หลัก น่าเสียดายที่ฉันเข้าเรียนในชั้นเรียน EE ของวิทยาลัยส่วนใหญ่เมื่อสิบห้าปีที่แล้ว แต่ฉันได้อ่าน DFT และ FFT ในช่วงหลายวันที่ผ่านมา (เห็นได้ชัดว่ามีประโยชน์เพียงเล็กน้อย)
ได้โปรดไม่มีคำตอบของ "ไปเรียน EE" ฉันวางแผนที่จะทำเช่นนั้นจริงๆถ้านายจ้างจะจ่ายเงินให้ฉัน :)
นี่คือปัญหาของฉัน:
ฉันจับสัญญาณได้ที่ 32 Hz นี่คือตัวอย่าง 1 วินาทีจาก 32 คะแนนซึ่งฉันได้สร้างแผนภูมิไว้ใน Excel
จากนั้นฉันได้รับโค้ด FFT ที่เขียนด้วยภาษา Java จาก Columbia University (หลังจากทำตามคำแนะนำในโพสต์เรื่อง " FFT ที่เชื่อถือได้และรวดเร็วใน Java ")
ผลลัพธ์ของโปรแกรมนี้มีดังนี้ ฉันเชื่อว่ามันกำลังเรียกใช้ FFT ในสถานที่ดังนั้นจึงใช้บัฟเฟอร์เดียวกันอีกครั้งสำหรับทั้งอินพุตและเอาต์พุต
Before:
Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ]
Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]
After:
Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ]
Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ]
ดังนั้นในตอนนี้ฉันไม่สามารถสร้างหัวหรือก้อยของเอาต์พุตได้ ฉันเข้าใจแนวคิด DFT เช่นส่วนที่แท้จริงคือแอมพลิจูดของคลื่นโคไซน์ของส่วนประกอบและส่วนจินตภาพเป็นแอมพลิจูดของคลื่นไซน์ส่วนประกอบ ฉันยังสามารถติดตามแผนภาพนี้ได้จากหนังสือที่ยอดเยี่ยม " The Scientist and Engineer's Guide to Digital Signal Processing ":
ดังนั้นคำถามเฉพาะของฉันคือ:
จากเอาต์พุตของ FFT ฉันจะหา "ความถี่ที่เกิดขึ้นบ่อยที่สุด" ได้อย่างไร? นี่เป็นส่วนหนึ่งของการวิเคราะห์ข้อมูลมาตรความเร่งของฉัน ฉันควรอ่านอาร์เรย์จริง (โคไซน์) หรืออาร์เรย์ (ไซน์) ในจินตนาการ
ฉันมีอินพุต 32 จุดในโดเมนเวลา เอาต์พุตของ FFT ควรเป็นอาร์เรย์ 16 องค์ประกอบสำหรับเรียลและอาร์เรย์ 16 องค์ประกอบสำหรับจินตภาพไม่ใช่หรือ เหตุใดโปรแกรมจึงให้เอาต์พุตอาร์เรย์จริงและจินตภาพทั้งสองขนาด 32
เกี่ยวกับคำถามก่อนหน้าฉันจะแยกวิเคราะห์ดัชนีในอาร์เรย์เอาต์พุตได้อย่างไร จากการป้อนข้อมูลของตัวอย่าง 32 ตัวอย่างที่ 32 Hz ความเข้าใจของฉันคือเอาต์พุตอาร์เรย์ 16 องค์ประกอบควรมีดัชนีกระจายอย่างสม่ำเสมอถึง 1/2 ของอัตราการสุ่มตัวอย่าง (32 Hz) ดังนั้นฉันจึงเข้าใจถูกต้องหรือไม่ว่าแต่ละองค์ประกอบ ของอาร์เรย์แสดงถึง (32 Hz * 1/2) / 16 = 1 Hz?
เหตุใดเอาต์พุต FFT จึงมีค่าเป็นลบ ฉันคิดว่าค่าต่างๆแสดงถึงแอมพลิจูดของไซนัส ตัวอย่างเช่นผลลัพธ์ของ Real [3] = -1.075 ควรหมายถึงแอมพลิจูดที่ -1.075 สำหรับคลื่นโคไซน์ของความถี่ 3 ถูกต้องหรือไม่? แอมพลิจูดเป็นลบได้อย่างไร?