พลิกการตอบสนองแรงกระตุ้นในการโน้มน้าวใจ


26

ในระหว่างการโน้มน้าวใจกับสัญญาณทำไมเราต้องพลิกการตอบสนองแรงกระตุ้นในระหว่างกระบวนการ?


5
ครึ่งหลังของคำตอบนี้อาจช่วยให้คุณเข้าใจ
Dilip Sarwate

3
นอกจากการอ่าน @ DilipSarwate คำตอบที่ยอดเยี่ยมมันเป็นแบบฝึกหัดที่ดีในการใช้กระดาษหนึ่งแผ่นและเพื่อคำนวณผลลัพธ์ของระบบ LTI แบบกราฟิกโดยการเพิ่มการตอบสนองแบบปรับเวลาและปรับขนาด
Deve

1
โปรดทราบว่าคุณสามารถพลิกอาร์กิวเมนต์ได้ - ผลลัพธ์เหมือนกัน
wakjah

คำตอบ:


29

ดัดแปลงมาจากคำตอบของคำถามอื่น (ตามที่กล่าวไว้ในความคิดเห็น) โดยหวังว่าคำถามนี้จะไม่ถูกโยนซ้ำ ๆ โดย Community Wiki เป็นหนึ่งในคำถามยอดนิยม ....

ไม่มี "การพลิก" ของการตอบสนองแบบอิมพัลส์โดยระบบเชิงเส้น (time-invariant) เอาต์พุตของระบบที่ไม่แปรผันตามเวลาเชิงเส้นคือผลรวมของการตอบสนองแบบอิมพัลส์แบบสเกลและแบบหน่วงเวลาไม่ใช่การตอบสนองแบบอิมพัลส์แบบ "พลิก"

เราแบ่งสัญญาณอินพุตเป็นผลรวมของสัญญาณพัลส์หน่วยปรับขนาด ระบบตอบสนองต่อสัญญาณพัลส์ยูนิต เป็นการตอบสนองแบบอิมพัลส์หรือพัลส์ตอบสนอง และด้วยคุณสมบัติการปรับสเกลค่าอินพุตเดี่ยวหรือถ้าคุณต้องการ สร้างการตอบสนอง , 0 , 0 , 1 , 0 , 0 , h [ 0 ] , h [ 1 ] , , h [ n ] , x [ 0 ] x [ 0 ] ( , 0 , 0 , 1 , 0 , 0 , ) = 0 , 0 ,x, 0, 0, 1, 0, 0,

h[0], h[1],, h[n],
x[0]
x[0](, 0, 0, 1, 0, 0,)= 0, 0, x[0], 0, 0,
x[0]h[0],  x[0]h[1],,  x[0]h[n],

ค่าอินพุตเดี่ยวหรือสร้าง สร้างการตอบสนอง Notice ความล่าช้าในการตอบสนองต่อ[1] เราสามารถดำเนินการต่อไปในหลอดเลือดดำนี้ได้ แต่เป็นการดีที่สุดที่จะเปลี่ยนเป็นรูปแบบตารางเพิ่มเติมและแสดงผลลัพธ์ที่หลากหลายในเวลาที่เหมาะสม เรามี x[1]

x[1](, 0, 0, 0, 1, 0,)= 0, 0, 0, x[1], 0,
0,x[1]h[0],  x[1]h[1],,  x[1]h[n1],x[1]h[n]
x[1]
time012nn+1x[0]x[0]h[0]x[0]h[1]x[0]h[2]x[0]h[n]x[0]h[n+1]x[1]0x[1]h[0]x[1]h[1]x[1]h[n1]x[1]h[n]x[2]00x[2]h[0]x[2]h[n2]x[2]h[n1]x[m]000x[m]h[nm]x[m]h[nm+1]
\ ddots \ end {} อาร์เรย์ แถวในอาร์เรย์ดังกล่าวข้างต้นได้อย่างแม่นยำลดขนาดและความล่าช้ารุ่นกระตุ้นการตอบสนองที่เพิ่มขึ้นถึงการตอบสนองต่อเพื่อป้อนสัญญาณxyx แต่ถ้าคุณถามคำถามที่เฉพาะเจาะจงมากขึ้นเช่น

เอาต์พุตที่เวลาคืออะไรn

จากนั้นคุณสามารถรับคำตอบได้โดยรวมคอลัมน์ -th เพื่อรับ สูตรการโน้มน้าวใจอันเป็นที่รักของนักเรียนรุ่นต่อรุ่นเนื่องจากการตอบสนองต่อแรงกระตุ้นดูเหมือนว่าจะ "พลิก" หรือย้อนกลับไปตามกาลเวลา แต่สิ่งที่ผู้คนดูเหมือนจะลืมคือเราสามารถเขียน เพื่อให้เป็นอินพุทที่ดูเหมือนว่า "พลิก" หรือย้อนกลับไปตามเวลา! กล่าวอีกนัยหนึ่งมันเป็นมนุษย์n

y[n]=x[0]h[n]+x[1]h[n1]+x[2]h[n2]++x[m]h[nm]+=m=0x[m]h[nm],
n
y[n]=x[n]h[0]+x[n1]h[1]+x[n2]h[2]++x[0]h[n]+=m=0x[nm]h[m],
ที่พลิกการตอบสนองแรงกระตุ้น (หรืออินพุต) มากกว่าเมื่อคำนวณการตอบสนองในเวลาที่โดยใช้สูตรการแปลง แต่ตัวระบบเองก็ไม่ได้เรียงลำดับอะไรเลยn

4

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

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

#include <stdio.h>

const int Nx = 5; 
const int x[Nx] = {1, 0, 0, 0, 2};
const int Ny = 3; 
const int y[Ny] = {1, 2, 3};
const int Nz = Nx+Ny-1;
int z[Nz];

void convolve_scatter() { // z = x conv y
  for (int k = 0; k < Nz; k++) {
    z[k] = 0;
  }
  for (int n = 0; n < Nx; n++) {
    for (int m = 0; m < Ny; m++) {
      z[n+m] += x[n]*y[m]; // No IR reversal
    }
  }
}

void convolve_gather() { // z = x conv y
  for (int k = 0; k < Nz; k++) {
    int accu = 0;
    for (int m = 0; m < Ny; m++) {
      int n = k+m - Ny + 1;
      if (n >= 0 && n < Nx) {
        accu += x[n]*y[Ny-m-1]; // IR reversed here
      }
    }
    z[k] = accu;
  }
}

void print() {
  for (int k = 0; k < Nz; k++) {
    printf("%d ", z[k]);
  }
  printf("\n");
}

int main() {
  convolve_scatter();
  print();
  convolve_gather();
  print();
}

มันโน้มน้าวลำดับ:

1 0 0 0 2
1 2 3

และใช้ทั้งสองวิธีการส่งออก convolution:

1 2 3 0 2 4 6

ฉันไม่สามารถจินตนาการได้ว่าใครก็ตามที่ใช้วิธีการกระเจิงยกเว้นว่าตัวกรองนั้นแตกต่างกันไปตามเวลาซึ่งในกรณีนี้ทั้งสองวิธีจะให้ผลลัพธ์ที่แตกต่างกันและวิธีหนึ่งอาจเหมาะสมกว่า


! ที่น่าสนใจ ดังนั้นข้อสรุปสุดท้ายคือสิ่งที่ฉันสนใจที่จะเห็น
นักวิทยาศาสตร์ที่ล้มเหลว

ความกังวลด้านสถาปัตยกรรมของคุณน่าสนใจ เมื่อพิจารณาถึงแคชที่มีอยู่คำสั่ง SIMD (SSE, AVX) และสถาปัตยกรรมแบบมัลติคอร์วิธีกระจัดกระจายดูเหมือนจะเหมาะสมกว่าสำหรับการคำนวณแบบขนานหรือไม่ แต่ฉันยังไม่ได้ทำการวิเคราะห์อย่างละเอียดว่า ...
Fat32

@ Fat32 ฉันไม่! คุณหมายถึงการสะสมในการรวบรวมสังวัตนาอาจกลายเป็นคอขวดที่มีหลายคอร์ที่ทำงานเกี่ยวกับการคูณ? ที่สามารถลดได้โดยให้แต่ละคอร์สะสมของตัวเองและรวมพวกเขาในตอนท้าย ฉันคิดว่าค่าโสหุ้ยนี้จะไม่มากเมื่อเทียบกับหน่วยความจำเพิ่มเติมที่เขียนในรูปแบบที่กระจัดกระจาย
Olli Niemitalo

จริงๆแล้วฉันกังวลเกี่ยวกับประสิทธิภาพของฟอร์มที่กระจัดกระจายมากกว่าคอขวดที่รวบรวมรหัสการกรอง C ปัจจุบันของฉันคือ (ส่วนใหญ่อาจ) ในรูปแบบการรวบรวม แต่เมื่อมาถึงรหัส ASM ฉันมักจะเขียนพวกเขาในส่วนขยาย SIMD SSE ซึ่งมากกว่า รูปแบบที่เหมาะสมที่จะกระจาย ฉันต้องอัปเดต tets ของฉันอย่างไรก็ตาม :-))) หน่วยความจำ IO เป็นปัญหาเมื่อเทียบกับการลงทะเบียนการสะสม และบางทีฉันอาจพลาดโทษของความทรงจำที่ซ้ำซ้อน IO ...
Fat32

ใครรู้คำที่ดีกว่ากระจัดกระจายและรวบรวม? ฉันไม่แน่ใจว่าสิ่งเหล่านี้สงวนไว้สำหรับกระโชกโฮกฮากหรือไม่
Olli Niemitalo

3

เป็นเพียง 'พลิก' สำหรับการคำนวณแบบจุด

@Dilip อธิบายว่า Convolt / Integation หมายถึงอะไร แต่เพื่ออธิบายว่าทำไมหนึ่งในสองฟังก์ชั่นอินพุต (บ่อยครั้งh(t)) ถูกพลิกเพื่อการคำนวณให้พิจารณาระบบที่ไม่ต่อเนื่องที่มีการป้อนข้อมูลx[n]และการตอบสนองต่อแรงกระตุ้นh[n]:

  • คุณสามารถใช้ฟังก์ชั่นอินพุตของคุณx[n]และสำหรับแต่ละตัวอย่างที่ไม่ใช่ศูนย์ * x[n]คำนวณการตอบสนองแรงกระตุ้นที่ปรับขนาดจากตัวอย่างnและเปิดจนกว่าการเปลี่ยนเวลาh[n]จะตายลงเป็นศูนย์ (สมมติว่าเป็นสาเหตุh[n]) นี้จะเกี่ยวข้องกับการไม่มี 'พลิก' (หรือมากกว่าถูกต้อง 'เวลาโอนกลับ) อย่างใดอย่างหนึ่งหรือx[n] h[n]อย่างไรก็ตามในตอนท้ายคุณจะต้องมีการเพิ่ม / เติมเหล่านี้ทั้งหมด + ปรับเปลี่ยน 'สะท้อน' x[n]ของการตอบสนองแรงกระตุ้นสำหรับแต่ละไม่ใช่ศูนย์

  • หรือเพื่อความสะดวกคุณสามารถย้อนเวลากลับไปหนึ่งในฟังก์ชั่นเกี่ยวกับที่มาของเวลา (โดยปกติคือ 0) ทำให้การคำนวณของคุณ {คูณ, เพิ่ม, คูณ, เพิ่ม, ... } แทน {คูณ, ทวีคูณ, ... , เพิ่ม , เพิ่ม, ... } ซึ่งส่งผลให้สัญญาณเอาต์พุตเดียวกันเพราะจะทำการคูณและเพิ่มการดำเนินการที่แน่นอน ยกตัวอย่างเช่นคิดเกี่ยวกับการมีส่วนร่วมในการส่งออกจากที่ไม่ใช่ศูนย์สัญญาณอินพุตในเวลา x[0]0 เมื่อk= 0 สำหรับสมการการตอบสนองแบบอิมพัลส์จะกลับด้านเวลา แต่ไม่เปลี่ยนกลับทำให้เราตอบกลับตัวอย่างแรกสำหรับซึ่ง เป็น จากนั้นการเพิ่มทีละหนึ่งจะเลื่อนไปทางขวาหนึ่งขั้นตอนเช่นเวลาที่ย้อนกลับ

    k=x[k]h[nk]
    h[n]x[n]x[0]h[0]kh[n]h[n]รายการที่สอง ( h[1]) จะถูกวางไว้ด้านบนของx[0]รอที่จะถูกคูณ สิ่งนี้จะให้การสนับสนุนที่ต้องการx[0]h[1]ในเวลาn=1เช่นเดียวกับที่เคยทำในวิธีการก่อนหน้านี้

* ผมพูดไม่เป็นศูนย์x[n]เพราะกระตุ้นการตอบสนองจะถูกปรับขนาดให้เป็นศูนย์จึงเอื้ออะไรเพื่อผลลัพธ์สุดท้าย

x[n]=0
h[n]y[n]

"คุณสามารถใช้ฟังก์ชั่นอินพุตของคุณ x [n] และสำหรับแต่ละตัวอย่างที่ไม่เป็นศูนย์ * ตัวอย่าง x [n] คำนวณการตอบสนองของแรงกระตุ้นที่ปรับขนาดจากตัวอย่าง n และเปิดจนกว่าจะเปลี่ยนเวลา h [n] ลงเป็นศูนย์ สาเหตุ h [n]) "ห้าที่เกิดขึ้นในประโยคนี้มีจำนวนเท่ากันหรือแตกต่างกันหรือไม่? n
Dilip Sarwate

@Dilip ทั้งหมด n เหมือนกันยกเว้น 'time-shifted h [n]' ซึ่งหมายถึง 'h [nk]' โดยที่ 'k' เป็นค่าคงที่ที่ใช้ในการเปลี่ยนการตอบสนองต่อแรงกระตุ้นไปยังจุดที่ต้องการสัญญาณ x [n ] เช่น: h [n-2] สำหรับการคำนวณการตอบสนองต่อสัญญาณที่ x [2]
abc

3

ที่ index c [n] การบิดของ [n] และ b [n] เป็นเช่นนั้น:

"c [n] คือผลรวมของผลิตภัณฑ์ทั้งหมด (a [k] b [m]) เช่นนั้น m + k = n," ดังนั้น m = n - k หรือ k = n - m ซึ่งหมายความว่าหนึ่งในลำดับ จะต้องพลิก

ตอนนี้ทำไมการบิดจึงทำตัวแบบนี้ตั้งแต่แรก? เนื่องจากการเชื่อมต่อกับพหุนามคูณ

การเพิ่มชื่อพหุนามสองผลในพหุนามใหม่ที่มีประสิทธิภาพร่วม ค่าประสิทธิภาพร่วมของพหุนามผลิตภัณฑ์กำหนดการทำงานของการบิด ตอนนี้ในการประมวลผลสัญญาณ, ฟังก์ชั่นการถ่ายโอนการแปลง Laplace หรือ z-แปรรูปเป็นชื่อพหุนามซึ่งแต่ละค่าใช้จ่ายร่วมกันสอดคล้องกับการหน่วงเวลาที่แตกต่างกัน การจับคู่ประสิทธิภาพร่วมของผลิตภัณฑ์และผลคูณในข้อเท็จจริงที่ว่า 'การคูณในการแทนค่าหนึ่งสอดคล้องกับการแปลงในการแทนการแปลง'

ป้อนคำอธิบายรูปภาพที่นี่


0

ในระหว่างการโน้มน้าวใจไม่จำเป็นต้องมี "การพลิก" ของการตอบสนองต่อแรงกระตุ้นที่จะเกิดขึ้นเลย ...

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

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


3
y(t)=x(τ)h(tτ)dτh(t)x(t)h(t)=h(t)x(t)

@JasonR อ๊ะโอ้โห! บางครั้งก็ยากที่จะดูว่าคำถามนี้เกิดขึ้นที่ใด Izhak เมื่อคุณเข้าใจคำตอบที่คุณกำลังมองหาคุณจะเข้าใจว่าฉันกำลังจะไปที่ไหน ไม่สนใจฉันตอนนี้!
เรียนรู้เริ่ม

0

f(τ)g(tτ)dτ
t1+t2=tf(t1)g(t2)dt1dt2
fgt

ตอนนี้แบบฟอร์มการทอผ้าด้วยมือแสดงให้เห็นถึงความสมมาตรที่เกี่ยวข้องอย่างชัดเจนและไม่มี "การพลิก" ที่เกี่ยวข้อง อย่างไรก็ตามการแปลงให้เป็นอินทิกรัลมิติเดียวที่เหมาะสมต้องทำให้อาร์กิวเมนต์หนึ่งในสองตัวนั้นเป็นตัวแปรการรวมที่เกิดขึ้นจริง ไม่ว่าจะเป็นหรือการหารูปแบบสมมาตรแบบแข็งไม่เกี่ยวข้องกับการล้างมือ หลังมีเล่ห์เหลี่ยม โดยทั่วไปคุณจะต้องกลับสู่ภาวะปกติทำให้บางอย่าง (เมื่อใช้ฟังก์ชัน / การแจกจ่ายเดลต้าเดลต้า) เช่น ถ้าคุณจัดเรียงใหม่ในทางเดียวคุณจะได้รับ และจากคุณสมบัติการกรองของผู้ประกอบการ Dirac t 1 f ( t 1 )

t1,t2f(t1)g(t2)δ(tt1t2)dt1dt2
t 1 f ( t 1 )
t1f(t1)dt1t2g(t2)δ(tt1t2)dt2
t1f(t1)dt1g(tt1)
ซึ่งเป็นส่วนประกอบดั้งเดิมที่มีการเปลี่ยนชื่อเล็กน้อย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.