ในระหว่างการโน้มน้าวใจกับสัญญาณทำไมเราต้องพลิกการตอบสนองแรงกระตุ้นในระหว่างกระบวนการ?
ในระหว่างการโน้มน้าวใจกับสัญญาณทำไมเราต้องพลิกการตอบสนองแรงกระตุ้นในระหว่างกระบวนการ?
คำตอบ:
ดัดแปลงมาจากคำตอบของคำถามอื่น (ตามที่กล่าวไว้ในความคิดเห็น) โดยหวังว่าคำถามนี้จะไม่ถูกโยนซ้ำ ๆ โดย 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 ,
ค่าอินพุตเดี่ยวหรือสร้าง สร้างการตอบสนอง Notice ความล่าช้าในการตอบสนองต่อ[1] เราสามารถดำเนินการต่อไปในหลอดเลือดดำนี้ได้ แต่เป็นการดีที่สุดที่จะเปลี่ยนเป็นรูปแบบตารางเพิ่มเติมและแสดงผลลัพธ์ที่หลากหลายในเวลาที่เหมาะสม เรามี
เอาต์พุตที่เวลาคืออะไร
จากนั้นคุณสามารถรับคำตอบได้โดยรวมคอลัมน์ -th เพื่อรับ สูตรการโน้มน้าวใจอันเป็นที่รักของนักเรียนรุ่นต่อรุ่นเนื่องจากการตอบสนองต่อแรงกระตุ้นดูเหมือนว่าจะ "พลิก" หรือย้อนกลับไปตามกาลเวลา แต่สิ่งที่ผู้คนดูเหมือนจะลืมคือเราสามารถเขียน เพื่อให้เป็นอินพุทที่ดูเหมือนว่า "พลิก" หรือย้อนกลับไปตามเวลา! กล่าวอีกนัยหนึ่งมันเป็นมนุษย์
นี่คือตัวอย่าง 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
ฉันไม่สามารถจินตนาการได้ว่าใครก็ตามที่ใช้วิธีการกระเจิงยกเว้นว่าตัวกรองนั้นแตกต่างกันไปตามเวลาซึ่งในกรณีนี้ทั้งสองวิธีจะให้ผลลัพธ์ที่แตกต่างกันและวิธีหนึ่งอาจเหมาะสมกว่า
เป็นเพียง 'พลิก' สำหรับการคำนวณแบบจุด
@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 สำหรับสมการการตอบสนองแบบอิมพัลส์จะกลับด้านเวลา แต่ไม่เปลี่ยนกลับทำให้เราตอบกลับตัวอย่างแรกสำหรับซึ่ง เป็น จากนั้นการเพิ่มทีละหนึ่งจะเลื่อนไปทางขวาหนึ่งขั้นตอนเช่นเวลาที่ย้อนกลับ
h[n]
x[n]
x[0]h[0]
k
h[n]
h[n]
รายการที่สอง ( h[1]
) จะถูกวางไว้ด้านบนของx[0]
รอที่จะถูกคูณ สิ่งนี้จะให้การสนับสนุนที่ต้องการx[0]h[1]
ในเวลาn=1
เช่นเดียวกับที่เคยทำในวิธีการก่อนหน้านี้* ผมพูดไม่เป็นศูนย์x[n]
เพราะกระตุ้นการตอบสนองจะถูกปรับขนาดให้เป็นศูนย์จึงเอื้ออะไรเพื่อผลลัพธ์สุดท้าย
h[n]
y[n]
ที่ index c [n] การบิดของ [n] และ b [n] เป็นเช่นนั้น:
"c [n] คือผลรวมของผลิตภัณฑ์ทั้งหมด (a [k] b [m]) เช่นนั้น m + k = n," ดังนั้น m = n - k หรือ k = n - m ซึ่งหมายความว่าหนึ่งในลำดับ จะต้องพลิก
ตอนนี้ทำไมการบิดจึงทำตัวแบบนี้ตั้งแต่แรก? เนื่องจากการเชื่อมต่อกับพหุนามคูณ
การเพิ่มชื่อพหุนามสองผลในพหุนามใหม่ที่มีประสิทธิภาพร่วม ค่าประสิทธิภาพร่วมของพหุนามผลิตภัณฑ์กำหนดการทำงานของการบิด ตอนนี้ในการประมวลผลสัญญาณ, ฟังก์ชั่นการถ่ายโอนการแปลง Laplace หรือ z-แปรรูปเป็นชื่อพหุนามซึ่งแต่ละค่าใช้จ่ายร่วมกันสอดคล้องกับการหน่วงเวลาที่แตกต่างกัน การจับคู่ประสิทธิภาพร่วมของผลิตภัณฑ์และผลคูณในข้อเท็จจริงที่ว่า 'การคูณในการแทนค่าหนึ่งสอดคล้องกับการแปลงในการแทนการแปลง'
ในระหว่างการโน้มน้าวใจไม่จำเป็นต้องมี "การพลิก" ของการตอบสนองต่อแรงกระตุ้นที่จะเกิดขึ้นเลย ...
อย่างไรก็ตามหากคุณต้องการป้องกันการเปลี่ยนแปลงเฟสใด ๆ คุณสามารถโน้มน้าวสัญญาณด้วยการตอบสนองแบบอิมพัลส์จากนั้นย้อนกลับการตอบสนองแบบอิมพัลส์และปรับเปลี่ยนรูปแบบใหม่เพื่อยกเลิกผลเฟส
ในการประมวลผลออฟไลน์คุณสามารถย้อนกลับสัญญาณได้อย่างง่ายดายหลังจากการสังวัตนาครั้งแรกเพื่อให้ได้ข้อสรุปเดียวกัน (ตามความคิดเห็นที่แนะนำ)
ตอนนี้แบบฟอร์มการทอผ้าด้วยมือแสดงให้เห็นถึงความสมมาตรที่เกี่ยวข้องอย่างชัดเจนและไม่มี "การพลิก" ที่เกี่ยวข้อง อย่างไรก็ตามการแปลงให้เป็นอินทิกรัลมิติเดียวที่เหมาะสมต้องทำให้อาร์กิวเมนต์หนึ่งในสองตัวนั้นเป็นตัวแปรการรวมที่เกิดขึ้นจริง ไม่ว่าจะเป็นหรือการหารูปแบบสมมาตรแบบแข็งไม่เกี่ยวข้องกับการล้างมือ หลังมีเล่ห์เหลี่ยม โดยทั่วไปคุณจะต้องกลับสู่ภาวะปกติทำให้บางอย่าง (เมื่อใช้ฟังก์ชัน / การแจกจ่ายเดลต้าเดลต้า) เช่น ถ้าคุณจัดเรียงใหม่ในทางเดียวคุณจะได้รับ และจากคุณสมบัติการกรองของผู้ประกอบการ Dirac ∫ t 1 f ( t 1 )