สร้าง spectrogram


10

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

  1. จัดสรรโครงสร้าง FFT เช่น kiss_fft_alloc(N,0,NULL,NULL) ในกรณีที่Nเป็นขนาดของหน้าต่างฉันใช้ บัฟเฟอร์อินพุตจะอาร์เรย์ขององค์ประกอบของประเภทN kiss_fft_scalarบัฟเฟอร์ส่งออกจะอาร์เรย์ขององค์ประกอบของประเภทN/2 + 1kiss_fft_cpx
  2. หมายเลขถอดรหัสN(ขนาดหน้าต่าง) ของตัวอย่าง PCM
  3. สำหรับตัวอย่าง PCM แต่ละค่าเฉลี่ยแอมพลิจูดของแต่ละแชนเนล (ตัวอย่างที่ไม่ได้ลงชื่อ) และสเกลตั้งแต่ 0 ถึง 2 (หารด้วย 65536.0) เก็บผลลัพธ์ไว้ในบัฟเฟอร์อินพุต
  4. ดำเนินการกับหน้าต่าง (เช่น Hanning) บนบัฟเฟอร์อินพุต
  5. ทำการแปลงฟูริเยร์อย่างรวดเร็วบนอินพุตบัฟเฟอร์เก็บไว้ในบัฟเฟอร์เอาต์พุต ตั้งแต่ฉันใช้ค่าจริงเป็น input kiss_fftr()ฉันสามารถใช้
  6. สำหรับN/2ค่าเอาต์พุตให้รับขนาดกำลังสองของข้อมูลที่แปลงแล้วแปลงค่าเป็นสเกล dB ด้วยสูตรต่อไปนี้: 10 * log10 (re * re + im * im)
  7. เขียนN/2ค่าจากขั้นตอนที่ 6
  8. ทิ้งช่วงครึ่งแรกของอินพุตบัฟเฟอร์ถอดรหัสตัวอย่าง PCM ถัดไป (ขนาดหน้าต่าง / 2) และทำการปรับขนาดและปรับหน้าต่างไปยังข้อมูล สิ่งนี้ควรเลื่อนหน้าต่างอินพุตอย่างมีประสิทธิภาพและหลีกเลี่ยงการทำซ้ำคณิตศาสตร์บนตัวอย่าง PCM ที่ประมวลผล
  9. วนไปที่ขั้นตอนที่ 5 โดยทำซ้ำขั้นตอนเหล่านี้จนกว่าตัวอย่างทั้งหมดจะได้รับการประมวลผล
  10. kiss_fft_alloc()ฟรีหน่วยความจำที่ใช้จาก

แนะนำให้ฉันลบค่าจากหน้าต่างอินพุตก่อนที่ฉันจะดำเนินการ FFT เพื่อให้ค่า DC ที่ได้นั้นมีขนาดเท่ากับศูนย์ ฉันควรจะลบค่าเฉลี่ยหรือค่าเฉลี่ยจากข้อมูลอินพุตหรือไม่

นอกจากนี้สิ่งที่ฉันต้องพิจารณาเมื่อเลือกขนาดหน้าต่างคืออะไร นอกจากนั้นจะต้องมีจำนวนคู่ตามคำแนะนำของ KissFFT จะมีประโยชน์ในการใช้ขนาดหน้าต่างเล็ก ๆ เช่น จะให้กราฟที่ดีกว่านี้หรือไม่ ฉันสมมติว่าขนาดหน้าต่างใหญ่ลดจำนวนของ FFT ที่ต้องดำเนินการนั่นเป็นเพียงประโยชน์ของการใช้ขนาดหน้าต่างใหญ่เท่านั้นหรือไม่

สุดท้ายเมื่อฉันไปถึงจุดที่ข้อมูลพร้อมที่จะลงจุดฉันจะไปลงจุดได้อย่างไร เมื่อก่อนฉันใช้ตรรกะกราฟคลื่นบางรูปแบบในอดีตฉันเพิ่งพล็อต 3 ค่าสำหรับแต่ละพิกเซลตาม -axis (แอมพลิจูดขั้นต่ำ, แอมพลิจูดสูงสุด, แอมพลิจูด RMS) แต่ฉันไม่รู้ว่าควรทำอะไร ข้อมูล spectrogramx

ขอบคุณล่วงหน้าสำหรับคำแนะนำใด ๆ และทั้งหมดที่คุณสามารถให้ได้

คำตอบ:


8

ดูดีสวยสำหรับฉัน อย่างไรก็ตามในขั้นตอนที่ 3 คุณต้องการปรับขนาดสัญญาณจาก -1 เป็น 1 มิฉะนั้นคุณจะเพิ่ม DC คุณพูดถึงการลบค่าเฉลี่ย - ฉันจะไม่แนะนำให้ทำเช่นนี้กับ spectrogram เพราะมันกรอง DC ได้อย่างมีประสิทธิภาพซึ่ง spectrogram ควรจะแสดงถ้ามันอยู่ตรงนั้น

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

คุณอาจสงสัยว่าเป็นไปได้หรือไม่ที่จะจัดการกับข้อตกลงนี้ได้ดีขึ้นและมีเทคนิคสำหรับสิ่งเหล่านี้: โดยทั่วไปแล้วพวกเขาเกี่ยวข้องกับการคำนวณ spectrograms ด้วยขนาด FFT ที่แตกต่างกันในคราวเดียวและรวมเข้าด้วยกัน มีข้อมูลภาพที่ดีในหน้าเว็บนี้: http://www.izotope.com/tech/aes_adapt/

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

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

เมื่อคุณพล็อตเวลาโดยทั่วไปจะอยู่ในแกน x ความถี่อยู่บนแกน y (โดยปกติคือสเกลบันทึก, สเกลเมล, ฯลฯ แทนที่จะเป็นสเกลเชิงเส้น) จากนั้นขนาดจะแสดงด้วยความเข้มของสีเช่น สีเข้มมากตรงกับขนาดเล็กและสีสดใสมากตรงกับขนาดใหญ่


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