การสร้างสัญญาณเสียงจาก Spectrogram


19

ฉันมีชุดของเพลงที่สกัดสเปคโตรแกรมขนาดโดยใช้ Hamming Window ที่มีการทับซ้อน 50% หลังจากที่แยกสเปคโทรแกรมฉันได้ลดขนาดไปบ้างโดยใช้การวิเคราะห์ส่วนประกอบ (PCA) หลังจากลดมันลงไปสู่มิติที่ต่ำกว่าฉันสร้างสเปคตรัมใหม่จากมิติที่ต่ำกว่า ดังนั้นตอนนี้จะมีข้อผิดพลาดบางอย่างระหว่าง spectrogram ดั้งเดิมและ spectrogram ที่สร้างขึ้นใหม่ ฉันต้องการแปลง spectrogram นี้กลับไปเป็นสัญญาณเสียงและเล่นเพื่อที่ฉันจะได้รู้เมื่อสร้างขึ้นใหม่จากมิติที่ต่ำกว่าเสียงเสียงอย่างไร

Matlab มีฟังก์ชั่นใด ๆ หรือไม่ การแปลงขนาด Spectrogram เป็นสัญญาณเสียง


2
คุณต้องการ STFT และผกผัน STFT จริงๆ "Spectrogram" เป็นเพียงชื่อของแผนที่ความร้อนขนาดของ STFT และขนาดเพียงอย่างเดียวไม่เพียงพอที่จะสร้างสัญญาณใหม่ ดูmathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/... ?
endolith

4
หากต้องการขยายความคิดเห็นของ @ endolith สิ่งที่คุณหายไปเมื่อคุณไปจาก STFT เป็น spectorgram คือข้อมูลเฟสซึ่งเป็นส่วนประกอบสำคัญของการแสดงโดเมนความถี่ของสัญญาณของคุณ
Bjorn Roche

นั่นหมายความว่าถ้าฉันต้องการสร้างสัญญาณเสียงต้นฉบับฉันต้องการทั้งแอมพลิจูดและเฟสของ STFT หรือไม่ แต่โดยทั่วไปแล้วในการสร้างฟีเจอร์เสียง | S | แอมพลิจูดของคอมเพล็กซ์ไม่มีคือสิ่งที่ใช้และข้อมูลเฟสถูกยกเลิก ฉันได้ทำการ PCA บน mel spectrogram ซึ่งฉันคำนวณเป็น M เป็นเมทริกซ์การคูณของตัวกรองเมล ดังนั้นวิธีการที่คุณจะสร้างสัญญาณเสียงให้Xประมาณเพื่อ X ได้หลังจาก PCA? X=log(M|S|)X^
user76170

@endolith: ฉันลองใช้ลิงค์ที่คุณให้mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/…ฉันใช้ข้อมูลเฟสและแอมพลิจูดทั้งสองอย่าง (คอมเพล็กซ์เป็นอินพุตไปยังฟังก์ชันด้านบน) เมื่อใช้สิ่งนี้ฉันลองเล่นสัญญาณและฟังดูขาด ๆ หาย ๆ ทำไมสิ่งนี้ถึงเกิดขึ้น จากนั้นฉันก็คำนวณบรรทัดฐานระหว่างสัญญาณดั้งเดิมกับสิ่งที่ได้มาจากขั้นตอนการผกผันของ STFT ดังที่ได้กล่าวมาแล้วและมันแสดงให้เห็นว่ามีค่ามากถึง 3.46 * 10 ^ 3 มีความคิดว่าทำไมสิ่งนี้ถึงเกิดขึ้นได้ ?? S
user76170

@ user76170: การเปลี่ยนแปลงเร็วเป็นเพราะ STFT สับสัญญาณเป็นเฟรมบางครั้งซ้อนทับกันและคุณต้องแยกโครงสร้างพวกมันในแบบเดียวกับที่สร้างขึ้นหรือจะมีความไม่ต่อเนื่องที่แต่ละอัน คุณใช้ฟังก์ชัน STFT และ ISTFT จากลิงก์นั้นหรือไม่ ดูรูปคลื่นของสัญญาณที่ขาด ๆ หาย ๆ เพื่อที่คุณจะได้เห็นว่าปัญหาคืออะไร
endolith

คำตอบ:


15

ถ้า spectrogram ถูกคำนวณเป็นขนาดของระยะเวลาอันสั้น Fourrier เปลี่ยนจากหน้าต่างที่ทับซ้อนกัน spectrogram จะมีข้อมูลเฟสโดยปริยาย

การทำซ้ำต่อไปนี้ทำงาน:

xn+1=istft(Sexp(iangle(stft(xn))))

คือสเปกโตรแกรม, stftคือการแปลงฟูริเยร์ในเวลาสั้น ๆ , isftคือการแปลงฟูริเยร์ในเวลาสั้น ๆSstftisft


ฉันต้องการแสดงความคิดเห็นตรงที่ @ edouard แต่ฉันไม่มีชื่อเสียงเพียงพอ ไม่มีใครรู้ว่าสิ่งที่ในคำตอบของเขาคืออะไร? นอกจากนี้ฉันจะเริ่มต้นx 0อย่างไร แค่สุ่ม? คือx nสัญญาณใหม่ที่สมบูรณ์ย้ำnหรือเพียงแค่n THค่าสัมประสิทธิ์ของx ? ขอบคุณ ix0xnnnthx
PR

1
@PR มันคือจำนวนหน่วยในจินตนาการ, . 1
Peter K.

3

ฉันมีเวลาค่อนข้างยากที่จะเข้าใจคำตอบของ @edouard ซึ่งกำลังทำสิ่งที่ถูกต้อง เปรียบเทียบกับ/signals//a/3410/9031ซึ่งฉันใช้ในการสร้างใหม่

โปรดทราบว่าเป็นจำนวนจินตนาการและx nเป็นสัญญาณใหม่ที่n THซ้ำ เริ่มต้นด้วยx 0เป็นเวกเตอร์สุ่มของความยาวของสัญญาณเสียง สำหรับฉันการทำซ้ำสองสามครั้งก็เพียงพอที่จะได้ผลลัพธ์ที่ฟังดูดี ข้อผิดพลาดที่แท้จริงของสัญญาณดั้งเดิมนั้นค่อนข้างสูง อีกทั้ง spectrogram ที่สร้างขึ้นที่ฉันสร้างขึ้นจากสัญญาณที่สร้างใหม่แม้ว่าการแสดงโครงสร้างทั่วไปโดยทั่วไปก็มีขนาดที่แตกต่างกันมากixnnthx0


2

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


@ hotpaw2: ฉันไม่เข้าใจคำตอบของคุณทำไมฉันถึงต้องการแปลงหนึ่งสเปกโทรแกรมเป็นอีกอัน? ฉันต้องการสร้างสัญญาณเสียงใหม่โดยให้สเปกโตรแกรมเมทริกซ์. ความต้องการในการออกแบบตัวกรองที่เปลี่ยนจาก spectrogram หนึ่งไปเป็นอีกอันหนึ่งคืออะไรและการทับซ้อนเพิ่ม / บันทึกการกรอง convolution อย่างรวดเร็ว? ฉันต้องการสร้างเสียงจาก| S | เพื่อที่ฉันจะได้เห็นว่า PCA มีประสิทธิภาพเพียงใด ดังนั้นฉันจึงสามารถเล่นสองคลิปสัญญาณเสียงต้นฉบับหนึ่งและอีกคลิปหนึ่งสร้างจากขนาดที่ต่ำกว่า| S | |S||S||S^|
user76170

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

ตกลงดังนั้นสิ่งที่คุณหมายถึงว่าฉันสามารถสร้างสัญญาณเสียงจากผลลัพธ์ที่ซับซ้อนแต่ไม่เพียงใช้ขนาดของมัน| S | . เพราะฉันได้ใช้| S | สำหรับการประมวลผลเพิ่มเติมและการลด dimesnionality ของฉันจากนั้นจึงไม่สามารถสร้างสัญญาณเดิมได้อีก S|S||S|
user76170

1
@ user76170 ยาวและสั้นของมันคือคุณต้องการ STFT ที่ซับซ้อนก่อนที่คุณจะสามารถสร้างสัญญาณของคุณใหม่ หากคุณเพิ่งมีขนาด STFT นั่นก็ไม่เพียงพอ มีข้อยกเว้นสำหรับกฎนี้ แต่โดยทั่วไปคุณต้องการ STFT ที่ซับซ้อนไม่ใช่แค่ขนาดเท่านั้น
Tarin Ziyaee

@ hotpaw2: เป็นไปได้ไหมที่จะทำเช่นนี้ฉันเก็บข้อมูลเฟส (ส่วนจินตภาพของ FFT ที่ซับซ้อน) จากนั้นใช้สเปกตรัมขนาดจากนั้นใช้การลดขนาดและสร้างใหม่จากมิติที่ต่ำกว่าเพื่อรับ| S | เพิ่มข้อมูลเฟสและทำ FFT แบบผกผันเพื่อรับสัญญาณเสียงหรือไม่ |S||S^|
user76170

-1

ใช้อัลกอริทึมของ Griffin-Lim เพื่อสลับสัญญาณเสียงจาก spectrogram หากคุณไม่กังวลเกี่ยวกับความซับซ้อนในการคำนวณ


คุณช่วยขยายคำตอบหน่อยได้ไหม? อาจเพิ่มกระดาษตัวแทนหรือลิงค์ไปยังอัลกอริทึมและคำอธิบายสั้น ๆ ว่ามีความเกี่ยวข้องกับคำถามนี้อย่างไร (A)
A_A

หากฉันเข้าใจคำถามของคุณอย่างถูกต้องโดยสังเขปคุณต้องการสร้างสัญญาณเสียงใหม่จาก spectrogram โดยไม่ต้องใช้ข้อมูลเฟสดั้งเดิม ขั้นตอนวิธีกริฟฟิน - ลิมต้องใช้เมทริกซ์สเปกโตรแกรมเป็นอินพุตและสร้างเฟสซ้ำ คุณสามารถอ้างถึงกระดาษieeexplore.ieee.org/document/1164317
Jitendra Dhiman

ขอบคุณที่ทำให้ฉันรู้. เพียงชี้แจงประเด็นนี้ การตอบสนองนี้เกิดขึ้นในคิวการตรวจสอบของฉันเป็น "คุณภาพต่ำ" ตัวเลือกที่ฉันมีในแง่ของ "ความเห็น" รวมถึงการให้ความคิดเห็นสำหรับ "การปรับปรุง" เพื่อให้คำตอบนี้สอดคล้องกับคำตอบที่พบบ่อยใน DSP.SE มันจะต้องเข้าไปเล็กน้อยในอัลกอริทึมของ Griffin Lim เพื่อแสดงว่ามันเกี่ยวข้องกับสิ่งที่ OP ขอหรือไม่ การแก้ไขใด ๆ ในอนาคตคุณสามารถนำไปใช้กับคำตอบของคุณได้โดยตรง ประเด็นนี้ไม่ใช่เพื่อสนอง "ฉัน" โดยเฉพาะมันคือการมีชุดคำตอบที่มีความหมายสำหรับคำถาม
A_A

คำตอบที่ดีที่สุดอยู่ที่นี่ (ใช้ Griffin-Lim) ในกรณีที่คุณไม่มีข้อมูล FFT ดั้งเดิม timsainb.github.io/…
Artemi Krymski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.