บันทึก
คำตอบก่อนหน้าของฉัน (ก่อนการแก้ไขนี้) แสดงว่าตัวกรอง Savitzky-Golay (SG) เป็นข้อมูลที่ไม่เป็นเชิงเส้นขึ้นอยู่กับการป้อนข้อมูลเวลาที่ไม่ถูกต้องเนื่องจากการตีความผิดพลาดก่อนกำหนดว่าตัวกรอง Savitzky-Golay (SG) คำนวณอย่างไร ตามลิงค์ของวิกิที่ให้ไว้ ดังนั้นตอนนี้ฉันจะแก้ไขเพื่อประโยชน์ของผู้ที่จะเห็นว่าตัวกรอง SG สามารถใช้งานได้อย่างไรโดยตัวกรอง FIR-LTI ขอบคุณ @MattL สำหรับการแก้ไขของเขาการเชื่อมโยงที่ยอดเยี่ยมที่เขาได้จัดเตรียมไว้และความอดทนที่เขามี (ที่ฉันไม่เคยเห็นมาก่อน) ระหว่างการสอบสวนปัญหาของฉัน แม้ว่าฉันจะซื่อสัตย์ชอบการคัดค้านอย่างละเอียดมากขึ้นซึ่งไม่จำเป็นต้องชัดเจน โปรดทราบว่าคำตอบที่ถูกต้องคือคำตอบอีกข้อหนึ่งนี่เป็นเพียงการชี้แจงเพิ่มเติมเกี่ยวกับคุณสมบัติ LTI ของตัวกรอง SG
ตอนนี้ก็ไม่น่าแปลกใจที่เมื่อใครบางคน (ที่ไม่เคยใช้ตัวกรองเหล่านั้นมาก่อน) เผชิญกับคำจำกัดความของตัวกรอง SG ในรูปแบบLSE ที่มีพหุนามต่ำเพื่อให้ได้รับข้อมูลเขา / เธอจะกระโดดลงไปทันที เวลา (กะ) เปลี่ยนแปลงตัวกรองปรับ
อย่างไรก็ตามขั้นตอนการปรับพอดีกับพหุนามถูกตีความอย่างชาญฉลาดโดย SG ซึ่งช่วยให้สามารถกรองข้อมูลได้อย่างอิสระไม่แปรเปลี่ยนเวลาและเป็นเส้นตรงจึงทำให้ SG เป็นตัวกรอง LTI-FIR คงที่
ด้านล่างนี้เป็นข้อมูลสรุปสั้น ๆ จากลิงก์ที่จัดหาโดย MattL สำหรับรายละเอียดใด ๆ ที่ดูเหมือนว่าหายไปโปรดอ่านเอกสารต้นฉบับหรือขอคำชี้แจง แต่ฉันไม่ต้องการผลิตเอกสารทั้งหมดที่นี่อีกครั้ง
ตอนนี้ให้พิจารณาค่าข้อมูลอินพุต ซึ่งอยู่กึ่งกลางและสิ่งที่เราต้องการให้พอดีกับพหุนามของคำสั่งโดยมีเป็นดัชนีเวลาจำนวนเต็ม:2M+1x[−M],x[−M+1],...,x[0],x[1],...,x[M]n=0p[n]Nn=−M,−M+1,...,−1,0,1,...M
p[n]=∑k=0Naknk=a0+a1n+a2n2+...+aNnN
LSE แบบโพลิโนเมียลแบบคลาสสิกขั้นตอนการคำนวณสัมประสิทธิ์เหล่านั้นเพื่อหาคำตอบที่ดีที่สุดคำสั่งพหุนามที่ช่วยลดผลรวมของความคลาดเคลื่อนกำลังสองakNthp[n]
E=∑−MM(p[n]−x[n])2
เหนือเวกเตอร์ข้อมูลที่กำหนด{T}x=[x[−M],x[−M+1],...,x[0],x[1],...,x[M]]T
ค่าสัมประสิทธิ์พหุนามที่ดีที่สุดนั้นได้มาจากการตั้งค่าอนุพันธ์ของเป็นศูนย์:akE
∂E∂ai=0 , for i=0,1,..,N(1)
ตอนนี้สำหรับผู้ที่คุ้นเคยกับกระบวนการ LSE polyfit ฉันจะเขียนสมการเมทริกซ์ที่ได้ (จากลิงค์) ที่กำหนดชุดสัมประสิทธิ์ที่เหมาะสม:
a=(ATA)−1ATx=Hx(2)
โดยที่คือเวกเตอร์ข้อมูลอินพุตคูณ 1,คือ LSE polyfit matrix และโดย matrixเป็นเมทริกซ์ทันทีของเวลา (พลังของจำนวนเต็มเวลา ); คือทราบว่าทั้งสองจึงมีค่ของข้อมูลเข้าเป็นค่าจะได้รับโดย:x(2M+1)×1H2M+1NAnAHA
A=[αn,i]=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢(−M)0(−M+1)0(0)0(M)0(−M)1(−M+1)1...(0)1...(M)1............(−M)N(−M+1)N(0)N(M)N⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
ทีนี้ลองย้อนกลับไปสักครู่แล้วพูดถึงประเด็นที่นี่
ตามที่ eq. (2) บ่งชี้อย่างชัดเจนแม้ว่าและจะไม่ขึ้นกับข้อมูลอินพุตและขึ้นอยู่กับดัชนีเวลาเท่านั้นสัมประสิทธิ์พหุนาม LSE ที่ดีที่สุดขึ้นอยู่กับข้อมูลอินพุต นอกจากนี้พวกเขายังขึ้นอยู่กับขนาดของหน้าต่างและคำสั่งของพหุนามNยิ่งไปกว่านั้นเมื่อหน้าต่างเลื่อนตามข้อมูลอินพุตค่าสัมประสิทธิ์ควรจะถูกคำนวณใหม่ (อัพเดท) ดังนั้นจึงขึ้นอยู่กับเวลาด้วยเช่นกัน นั่นคือวิธีที่ตัวกรอง SG ถูกกำหนดในลิงก์ที่หน้าคัดลอกมาด้านล่าง:AHnakMNx[n]ak2nd
... นี่ (LSE polyfit) สามารถทำซ้ำในแต่ละตัวอย่างของอินพุตแต่ละครั้งที่สร้างพหุนามใหม่และค่าใหม่ของลำดับเอาต์พุต y [n] ...
ดังนั้นเราจะเอาชนะความประหลาดใจที่ทำให้งงงวยนี้ได้อย่างไร โดยการตีความและกำหนดเอาต์พุตตัวกรอง SG ให้เป็นดังต่อไปนี้:
ตัวกรอง SG ของคำสั่งในแต่ละครั้งตัวอย่างยอมรับชุดอินพุตและสร้างตัวอย่างเอาต์พุตเดี่ยวกำหนดให้เป็นพหุนามประเมินที่ ; กล่าวคือNnx[n]y[n]p[n]n=0
y[n]=y[0]=∑m=0Namnm=a0
นั่นคือสำหรับแต่ละชุดอินพุตของตัวอย่างของ (กึ่งกลางประมาณ ) ตัวกรอง SG จะสร้างเอาต์พุตซึ่งแสดงโดยซึ่งเทียบเท่ากับค่าสัมประสิทธิ์เดียวของ LSE ที่ดีที่สุด พหุนามที่เกี่ยวข้องกับหน้าต่างโดยเฉพาะอย่างยิ่งที่กลุ่มตัวอย่าง[n] อนึ่งเมื่อหน้าต่างเลื่อนตามความยาวของข้อมูลที่ป้อนในทุกครั้งที่ตัวอย่างเอาต์พุตใหม่จะถูกคำนวณตามหน้าต่างของตัวอย่างM] นี่คือตัวกรอง nancusal2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[d−M],x[d−M+1],...,x[d−1],x[d],x[d+1],...x[d+M]
ตอนนี้เป็นเวลาที่จะแสดงให้เห็นว่าค่าสัมประสิทธิ์จะได้รับเป็นรวมกันเชิงเส้นของค่าสัญญาณอินพุตในหน้าต่างและกรองเอาท์พุทดังนั้นจึงเป็นเรื่องการรวมกันเชิงเส้นของค่าที่ป้อนเข้า[N] และนี่คือคำจำกัดความของการโน้มน้าว (LTI) ผ่านตัวกรอง FIR การส่งออกในเวลาที่เป็นชุดเชิงเส้นของปัจจัยการผลิตและค่าสัมประสิทธิ์กรอง[N] แต่แล้วค่าสัมประสิทธิ์ตัวกรองสำหรับตัวกรอง SG นี้คืออะไร มาดูกัน.a0x[n]y[n]x[n]nx[n]h[n]
พิจารณาการคำนวณอีกครั้ง:ak
a=Hx
⎡⎣⎢⎢⎢⎢a0a1⋮aN⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢h(0,0)h(1,0)h(N,0)h(0,1)h(1,1)...h(0,1).........h(0,2M)h(1,2M)h(0,2M)⎤⎦⎥⎥⎥⎥⋅⎡⎣⎢⎢⎢⎢x[−M]x[−M+1]...x[M]⎤⎦⎥⎥⎥⎥
จากที่เราจะเห็นว่าเดียวได้รับจากผลคูณของจุดของแถวแรกของกับเวกเตอร์ข้อมูลอินพุต ; กล่าวคือa0Hx
a0=H(0,n)⋅x=∑H(0,k)x[k]=H(0,−n)⋆x[n]
โดยที่ในความเท่าเทียมกันครั้งสุดท้ายเราได้ตีความผลคูณของดอทโปรดักท์เป็นผลรวมของการแปลงโดยพิจารณาการตอบสนองแบบอิมพัลส์ของตัวกรอง SG ให้เป็น ,h[n]=H(0,−n)
มากขึ้นโดยเฉพาะมันกระตุ้นการตอบสนองของตัวกรองของการสั่งซื้อที่ SGที่มีความยาวของหน้าต่าง 1N2M+1
และเอาต์พุตที่สมบูรณ์ของตัวกรอง SG ลำดับที่ N ที่มีขนาดหน้าต่างสำหรับอินพุตของความยาวได้มาจากการแปลง LTI แบบเดี่ยวพร้อมการตอบสนองแบบแรงกระตุ้นy[n]2M+1x[n]LhN[n]
y[n]=x[n]⋆hN[n]
แสดงความคิดเห็น
ความจริงที่ว่าค่าสัมประสิทธิ์พหุนามขึ้นอยู่กับข้อมูลอินพุตไม่ได้ป้องกันตัวกรองจากการเป็น LTI FIR เนื่องจากการตอบสนองต่อแรงกระตุ้นสามารถกำหนดให้เป็นตัวแทนของเอาต์พุตที่จะคำนวณจากชุดค่าผสมเชิงเส้นของตัวอย่างอินพุต การรวมกันเชิงเส้นของตัวอย่างอินพุตถูกบอกเป็นนัยโดยผลิตภัณฑ์เมทริกซ์ที่กำหนดสัมประสิทธิ์ที่ดีที่สุดของดังนั้นการรวมกันเชิงเส้นของก็จะส่งผลให้ตัวกรอง FIR LTIเป็นตัวแทน โพรซีเดอร์การพอดี LSE ของ LSEakh[n]y[n]xa=Hxakp[n]akh[n]
รหัส MATLAB / OCTVE
MATLAB / OCTAVE อย่างง่ายต่อไปนี้สามารถใช้ในการคำนวณการตอบสนองฟิลเตอร์ SG ได้ (โปรดทราบว่าตัวออกแบบ SG ที่สร้างขึ้นในตัวมันอาจสร้างชุดแตกต่างกันตามลิงก์ -dd)h[n]h[n]
% Savitzky-Golay Filter
%
clc; clear all; close all;
N = 3; % a0,a1,a2,a3 : 3rd order polynomial
M = 4; % x[-M],..x[M] . 2M + 1 data
A = zeros(2*M+1,N+1);
for n = -M:M
A(n+M+1,:) = n.^[0:N];
end
H = (A'*A)^(-1)* A'; % LSE fit matrix
h = H(1,:); % S-G filter impulse response (nancausal symmetric FIR)
figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 = ' , num2str(2*M+1)]);
subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');
ผลลัพธ์คือ:
หวังว่านี่จะช่วยแก้ปัญหา