วิธีเปลี่ยนสัญญาณเป็นวงกลมด้วยเศษส่วนของตัวอย่าง?


22

ทฤษฎีบทกะกล่าวว่า :

การคูณโดยเฟสเชิงเส้นสำหรับจำนวนเต็มmบางตัวที่สอดคล้องกับการเลื่อนแบบวงกลมของเอาต์พุต :จะถูกแทนที่ด้วยที่การห้อยถูกตีความ โมดูโลN (เช่นเป็นระยะ ๆ )e 2 π ixn xkXkXk k-me2πiNnmXkXkXkm

ตกลงนั่นใช้ได้ดี:

plot a

ตัวอย่างสัญญาณ 9 ข้อโดยพลการ

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

สัญญาณถูกเลื่อนโดย 3 ตัวอย่างในโดเมนความถี่

มันเลื่อนไป 3 ตัวอย่างอย่างที่ฉันคาดไว้

ฉันคิดว่าคุณสามารถทำเช่นนี้เพื่อเลื่อนตัวอย่างเศษส่วนแต่เมื่อฉันลองมันสัญญาณของฉันจะกลายเป็นจินตภาพและไม่เหมือนเดิมเลย:

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

สัญญาณหลังจากการคูณด้วย 3.5 เลขชี้กำลังเชิงซ้อน

ฉันไม่ได้คาดหวังสิ่งนี้เลย นี่ไม่ใช่สิ่งที่เทียบเท่ากับการโน้มน้าวใจด้วยแรงกระตุ้นที่แท้จริงซึ่งถูกยกตัวอย่าง 3.5 หรือไม่? ดังนั้นแรงกระตุ้นยังคงเป็นจริงและผลที่ได้ควรเป็นจริง? และควรมีรูปร่างเหมือนกันมากกว่าหรือน้อยกว่าเดิม


นี่คือการส่งการแลกเปลี่ยนไฟล์ Matlab ที่คำนวณการมอดูเลตที่ถูกต้องสำหรับสัญญาณจริง / ซับซ้อน / คี่ความยาวและเศษส่วน - ล่าช้า: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

คำตอบ:


14

ถ้าคุณต้องการให้เอาท์พุทที่ถูกเลื่อนของ IFFT ให้เป็นจริงการบิดเฟส / การหมุนในโดเมนความถี่จะต้องมีความสมมาตรร่วมกันเช่นเดียวกับข้อมูล ซึ่งสามารถทำได้โดยการเพิ่มออฟเซ็ตที่เหมาะสมให้กับ exponent เชิงซ้อนของคุณ () สำหรับความชันเฟสที่กำหนดเพื่อให้เฟสของครึ่งบน (หรือลบ), โมดูโล 2 Pi สะท้อนครึ่งล่างของรูรับแสง FFT . ฟังก์ชันการเลื่อนแบบเอ็กซ์โปเนนเชียลแบบซับซ้อนสามารถทำให้สมมาตรสังยุคด้วยการทำดัชนีจาก -N / 2 ถึง N / 2 โดยมีเฟสศูนย์ที่ดัชนี 0

มันเกิดขึ้นที่การชดเชยที่เหมาะสมสำหรับการบิดเฟสหรือเกลียวซึ่งทำให้จำนวนเต็มทวีคูณที่แน่นอนของการหมุน 2 Pi ในรูรับแสงเพื่อให้สมมาตรในรูรับแสงเป็นศูนย์

ด้วยเวกเตอร์บิดเฟสสมมาตรคอนจูเกตผลลัพธ์ก็ควรจะจบลงด้วยการแก้ไขแบบวงกลมของ Sinc สำหรับการเลื่อนที่ไม่ใช่จำนวนเต็ม

ทำอย่างประณีตโดย OP:

ตัวเลือก k = [0, 1, 2, 3, 4, 5, 6, 7, 8] กำลังสร้างเลขชี้กำลังเชิงซ้อนแบบอสมมาตร:

การลองกะตัวอย่างแบบอสมมาตรเชิงซ้อนแบบ 0.5 โดยมีส่วนจินตภาพเป็นเส้นประ

หากคุณใช้ k = [0, 1, 2, 3, 4, -4, -3, -2, -1] แทนคุณจะได้เลขชี้กำลังเชิงซ้อนของเฮอร์ไมต์ - สมมาตร:

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

เลขยกกำลังที่ซับซ้อนแบบ Hermite-symmetric สำหรับการเปลี่ยนตัวอย่าง 0.5 ชิ้นโดยมีส่วนจินตภาพเป็นเส้นประ

และเมื่อคุณใช้สูตรเลขชี้กำลังเดียวกันเพื่อเลื่อนตัวอย่าง 0.5 หรือ 3.5 คุณจะได้รับผลลัพธ์จริง:

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

เลื่อนโดย 0.5 และ 3.5 ตัวอย่างโดยมีต้นฉบับเป็นเส้นประ


Aha! แทนที่จะเป็นk = [0, 1, 2, 3, 4]ฉันควรใช้k = [0, 1, 2, -2, -1]
endolith

@endolith / hotpaw2 ในคำอื่น ๆ มันเกี่ยวกับการจัดทำดัชนีของโดเมนตัวอย่างเวลาหรือไม่
TheGrapeBeyond

1
สมมาตรรอบ ๆ Bin 0 จะให้สมมาตรรอบ N / 2 แม้ว่า N / 2 ไม่ใช่จำนวนเต็มก็ตาม
hotpaw2

1
ฉันพบฟังก์ชันที่ใช้การปรับที่ถูกต้องใน Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
อาเหม็ดฟาซิห์

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