จะตรวจสอบผลลัพธ์ FFT ของคลื่นไซน์ได้อย่างไร


9

ฉันได้รับไฟล์เสียง (คลื่นไซน์) 1,000Hz เป็นอินพุตสำหรับอัลกอริทึม FFT ของฉัน ฉันมีตัวอย่างสเปกตรัมพลังงาน 8192 ตัวอย่างในอาร์เรย์

อะไรคือวิธีที่ดีที่สุดและง่ายที่สุดในการตรวจสอบว่าผลลัพธ์ของฉันถูกหรือผิด?

ถ้าฉันให้ไฟล์เสียงเงียบผลลัพธ์จะเป็นศูนย์สำหรับตัวอย่างทั้งหมด ในไซน์ wav ค่า o / p จะเพิ่มขึ้นจาก 20 (ตัวอย่างที่ 0) เป็น 26059811 (ตัวอย่างที่ 743) และค่อยๆลดลงเป็น 40

หากฉันได้รับแนวคิดเกี่ยวกับช่วงเอาต์พุตจากนั้นฉันสามารถพิสูจน์ได้ทางเทคนิคว่า FFT ทำงานได้หรือไม่

ความคิดใด ๆ ที่จะเป็นประโยชน์

อ้างถึงลิงค์นี้สำหรับข้อสงสัยทางเทคนิคใด ๆ


1
คุณสามารถกำหนดอาเรย์ของคุณได้หรือไม่? (ในซอฟต์แวร์สเปรดชีต?)

มีค่า 8192 อยู่ในอาร์เรย์คุณต้องการให้ฉันวางแผนด้วยตนเองมิฉะนั้นสเปรดชีตจะจัดการกับมันฉันกำลังทำงานกับ MAC

2
ฉันได้พล็อตตัวอย่างเป็นหมื่นใน MS Excel Gnumeric หรืออันอื่นก็เหมาะเช่นกัน หรือ gnuplot ด้วย

อย่าลืมสำนักงานเปิด
ชื่อปลอม

@Fake ชื่อ: ฉันไม่สามารถที่จะพล็อตกราฟ ..

คำตอบ:


4

ดูเหมือนว่าคุณกำลังคำนวณสเปกตรัมโดยเฉลี่ย 10 หน้าต่าง (ไม่ทับซ้อนกัน) เพื่อให้ได้ขนาดที่ 8192 หรือ 8193 ความถี่ (จาก 0 ถึง Nyquist แต่อัลกอริทึมบางตัวอาจลดความถี่ Nyquist ที่ bin 8192)

สิ่งแรกที่ต้องตรวจสอบคือยอดเขาอยู่ในถังขยะด้านขวา คุณไม่ได้บอกว่าอัตราการสุ่มตัวอย่างคืออะไร แต่ bin 743 จะเป็น 743/16384 คูณอัตราการสุ่มตัวอย่าง หากสัญญาณอยู่ที่ 800 Hz นั่นจะทำให้ Fs อยู่ที่ประมาณ 17640 ตัวอย่าง / วินาที ดูเหมือนว่าผิด สัญญาณทดสอบของคุณอาจอยู่ในอัตรามาตรฐานเช่น 8000, 16000, 22050, 32000, 44100 หรือ 48000 สำหรับ Fs = 22050 ยอดสูงสุดจะอยู่ที่ bin 800/22050 * 16384 = 594

เกณฑ์อื่นในการตรวจสอบคือพลังงานทั้งหมดในสัญญาณนั้นใกล้เคียงกันทั้งในโดเมนเวลาและความถี่ นี่คือตัวอย่างใน Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

สัญญาณอินพุต x ซึ่งประกอบด้วยไซนัสสองตัวอย่างที่ Fs = 22050 ตัวอย่าง / วินาทีแบ่งออกเป็น 10 หน้าต่างที่ไม่ทับซ้อนกันขนาด NFFT = 2048 ตัวอย่าง การเรียกใช้ psd (ความหนาแน่นของสเปกตรัมพลังงาน) คำนวณสเปกตรัม y เป็นค่าเฉลี่ยของขนาดกำลังสองของ DFT 16384 จุดสิบจุด (อันที่จริงแล้วคือ 8193 จุดเนื่องจาก x เป็นค่าจริง)

พลังงานโดเมนความถี่ที่คำนวณได้มีปัจจัยการปรับขนาดของ N / 16384 เนื่องจากฟังก์ชัน psd ปรับขนาด y เป็นขนาด DFT แทนที่จะเป็นความยาวสัญญาณทั้งหมด ปัญหานี้ขึ้นอยู่กับว่าระบบของคุณจัดการกับการปรับสภาพ PSD ให้เป็นปกติหรือไม่ การปรับมาตรฐานที่เป็นทางเลือกอื่นคือการปรับขนาด 1 / Fs สิ่งนี้จับคู่พลังงานกับสัญญาณอะนาล็อกดั้งเดิม ค่ามาตรฐานเริ่มต้นควรมีการบันทึกไว้อย่างดีในห้องสมุด


ฉันทดสอบสัญญาณคลื่นไซน์ของฉันคือ 1,000 Hz Mine FFT ให้คำตอบที่ถูกต้องขอบคุณสำหรับความช่วยเหลือของคุณ

10

คุณต้องพล็อตขนาดของเอาต์พุตของ FFT ฉันไม่คุ้นเคยกับการเขียนโปรแกรมภาษาของคุณ plot(abs(fft(a)))แต่ในหลามคุณจะใช้สิ่งที่ต้องการ สำหรับอินพุตเงียบเอาต์พุตควรเป็นศูนย์ทั้งหมด สำหรับอินพุตของคลื่นไซน์คุณควรเห็นหนามแหลมสองอัน:

ข้อความแสดงแทน

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

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


คุณหมายถึงค่าสเปกตรัมพลังงานเป็นแอมพลิจูดหรือไม่

t -> มีการอ้างอิงถึงเวลาหรือไม่

ไม่ต้องกังวลเกี่ยวกับเวลา หากคุณเพียงแค่ตรวจสอบว่า FFT ทำงานได้หรือไม่สิ่งที่คุณต้องทำคือตรวจสอบว่ารูปร่างของขนาดนั้นใกล้เคียงกับสิ่งนี้
endolith

ฉันไม่สามารถลงจุดอย่างไรก็ตาม FFT ของฉันทำงานถูกต้อง ฉันจะพยายามใช้กราฟในเวลาว่างของฉันอย่างแน่นอนขอบคุณมาก

1
@clabacchio: โอ้ FFT จะสร้างเอาต์พุตด้วยแกน f = 0 ที่จุดเริ่มต้นและจุดสิ้นสุดของพล็อต จุดกึ่งกลางของพล็อตคือแกน f = fs / 2 มักจะมีฟังก์ชั่น fftfreq หรือ fftshift เพื่อจัดเรียงพล็อตใหม่เพื่อให้ 0 ความถี่อยู่ตรงกลาง flic.kr/p/arVeZT
endolith

0

ฉันใช้เครื่องมือวิเคราะห์ฟูริเยร์ภายใน Excel Analysis Toolpak เพื่อตรวจสอบข้อมูลและผลลัพธ์อย่างรวดเร็ว


ฉันกำลังทำงานบน MAC

@Warrior - จากนั้นใช้ MacPorts หรือ Fink เพื่อติดตั้ง Gnumeric (ดูที่หน้านี้สำหรับข้อมูลบางอย่างเกี่ยวกับแผ่นตุ่นปากเป็ด Platypus หากคุณต้องการ)
Kevin Vermeer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.