ทำการสุ่มสัญญาณด้วย decimate


12

ฉันกำลังทดลองกับการทำลายสัญญาณในกรณีนี้หน่วยกระตุ้น

ฉันใช้ Python กับ pylab ครั้งแรกฉันสร้างหน่วยแรงกระตุ้นและฆ่ามันด้วย 5

x = r_[zeros(0), 1, zeros(100)]
N = 2 ** 14
q = 5

y = decimate(x, q, ftype="fir")
subplot(211)
title("Original")
stem(range(len(x)), x)
subplot(212)
title("Decimated - FIR")
stem(range(len(y)), y)

figure()
subplot(211)
semilogx(log(abs(fft(x, N))))
subplot(212)
y = decimate(x, q, ftype="fir")
semilogx(log(abs(fft(y, N))))

ผลลัพธ์นี้มีแผนการต่อไปนี้

หน่วยแรงกระตุ้นที่มีความล่าช้าเป็นศูนย์และสัญญาณที่ส่งผลทำลาย

ฉันเพิ่มตัวอย่างการหน่วงเวลาก่อนอิมพัลส์โดยการเปลี่ยน x เป็น:

x = r_[zeros(3), 1, zeros(100)]

ซึ่งจะส่งผลในแปลงต่อไปนี้

แรงกระตุ้นหน่วยที่มีความล่าช้า 3 ตัวอย่างและสัญญาณที่ได้จากการทำลายล้าง

ในพล็อตชุดที่สองสัญญาณที่ได้จากการทำลายนั้นไม่ได้เป็นเพียงตัวอย่างเดียว แต่ถูกบิดเบือน

ถ้าฉันหน่วงสัญญาณด้วย 5 - และตัวอย่าง q หลาย ๆ อันฉันจะได้พล็อตชุดแรกอีกครั้ง

ซอร์สโค้ดสำหรับฟังก์ชั่นการทำลายล้างคือhttps://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L1570

def decimate(x, q, n=None, ftype='iir', axis=-1):
    if not isinstance(q, int):
        raise TypeError("q must be an integer")

    if n is None:
        if ftype == 'fir':
            n = 30
        else:
            n = 8

    if ftype == 'fir':
        b = firwin(n + 1, 1. / q, window='hamming')
        a = 1.
    else:
        b, a = cheby1(n, 0.05, 0.8 / q)

    y = lfilter(b, a, x, axis=axis)

    sl = [slice(None)] * y.ndim
    sl[axis] = slice(None, None, q)
    return y[sl]

ฉันใช้ฟิลเตอร์กรองความถี่ต่ำก่อนที่จะทำการกำจัดการตอบสนองต่อแรงกระตุ้นของตัวกรองคือ

การตอบสนองต่อแรงกระตุ้นของตัวกรองสัญญาณความถี่ต่ำ

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

มีวิธีการ decimate ตัวอย่างหน่วยที่มีการหน่วงเวลาตามอำเภอใจหรือไม่ซึ่งส่งผลให้มีการสุ่มตัวอย่างหน่วยเอาต์พุตหรือไม่?


คุณเข้าใจว่าแรงกระตุ้น "ตัวอย่างเดียว" นั้นจริง ๆ แล้วแทนฟังก์ชัน sinc ใช่มั้ย เนื่องจากคุณต้องกรอง anti-alias ก่อนการสุ่มตัวอย่างและฟังก์ชัน impulse ทางคณิตศาสตร์ในอุดมคติของคุณจะเปลี่ยนเป็นฟังก์ชัน sinc เมื่อถูกกรอง มันเพิ่งเกิดขึ้นว่าตัวอย่างตกตรงกับศูนย์ของ sinc ดังนั้นมันจึงดูไม่เหมือน แต่ถ้า sinc ถูกเลื่อนน้อยกว่าหนึ่งตัวอย่างในเวลาคุณจะเห็นมัน
endolith

คำตอบ:


11

x[n]

x[n]=δ[n]

h[n]

xf[n]=x[n]h[n]=δ[n]h[n]=h[n]

q5

xd[n]=xf[qn]=h[qn]

qq2qnq0xd[n]n=0

x[n]

xf[n]=h[nD]

xd[n]=xf[qn]=h[qnD]

อีกครั้งตามที่คุณตั้งข้อสังเกตสิ่งนี้มีผลในการดึงชุดก๊อกที่แตกต่างจากการตอบสนองของตัวกรองเช่นสัญญาณเอาท์พุทที่ถูกทำลายจะไม่เป็นศูนย์สำหรับทุกคนอีกต่อไป แต่ตัวอย่างหนึ่ง (เช่นจะไม่เหมือนแรงกระตุ้นอีก ) คาดว่าจะเป็นเช่นนี้ ทำไม?

xd[n]

xd[n]=h[qnD]ejωDH(ωq)

H(ω)xd[n]

เนื่องจากตัวกรองเป็นแหล่งที่มาของ "การบิดเบือน" ที่คุณไม่ต้องการคุณอาจลองใช้กระบวนการอีกครั้งโดยไม่มีตัวกรอง แต่พิจารณาสิ่งที่คุณจะได้รับ:

xf[n]=x[n]=δ[nD]

xd[n]=xf[qn]=δ[qnD]

qDxd[n]=0  n

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