ฉันจะประมาณค่าสัญญาณ 1D ได้อย่างไร


25

ฉันมีสัญญาณที่มีความยาวประมาณ 1,000 ตัวอย่าง ฉันต้องการขยายสัญญาณนี้เป็น 5,000 ตัวอย่างซึ่งเก็บตัวอย่างในอัตราเดียวกับต้นฉบับ (เช่นฉันต้องการทำนายว่าสัญญาณจะเป็นอย่างไรถ้าฉันยังคงทดลองต่อไปเป็นระยะเวลานานขึ้น) สัญญาณประกอบด้วยส่วนประกอบหลายรูปแบบที่เพิ่มเข้าด้วยกัน

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

นี่คือรหัส MATLAB บางส่วนที่แสดงวิธีการในอุดมคติของสิ่งที่ฉันต้องการ แน่นอนว่าฉันจะไม่ทราบล่วงหน้าว่ามีองค์ประกอบของซายน์ 3 อย่างแน่นอนไม่ว่าจะเป็นเฟสและความถี่ที่แน่นอน ฉันต้องการตรวจสอบให้แน่ใจว่าฟังก์ชั่นนั้นต่อเนื่องไม่มีการกระโดดเมื่อเราเลื่อนไปที่จุด 501

vals = 1:50;
signal = 100+5*sin(vals/3.7+.3)+3*sin(vals/1.3+.1)+2*sin(vals/34.7+.7); % This is the measured signal
% Note, the real signal will have noise and not be known exactly.
output_vals = 1:200;
output_signal = 100+5*sin(output_vals/3.7+.3)+3*sin(output_vals/1.3+.1)+2*sin(output_vals/34.7+.7); % This is the output signal

figure;
plot(output_signal);
hold all;
plot(signal);

โดยพื้นฐานแล้วที่เส้นสีเขียวฉันต้องการหาเส้นสีฟ้า ป้อนคำอธิบายรูปภาพที่นี่


3
สิ่งนี้อยู่ในบริบทของการเรียงต่อกันเป็นภาพทำบางสิ่งบางอย่างเช่นการขยายท้องฟ้าหรืออย่างอื่นหรือไม่? กล่าวอีกนัยหนึ่งมีมาตรการด้านคุณภาพอื่น ๆ สำหรับส่วนขยายที่นอกเหนือจากที่เป็น "เรียบ" ที่ขอบหรือไม่
เก็บข้อมูล

3
คำถามของคุณไม่ชัดเจน "ขยาย" หมายความว่าอย่างไร คุณพยายามที่จะทำสำเนาและส่งสำเนาสัญญาณของคุณ (เรียงต่อกัน) หรือคุณต้องการที่จะสุ่มตัวอย่างโดย 5x หรือคุณต้องการที่จะบันทึกอีกต่อไป 5 เท่า? สัญญาณของคุณเป็นระยะ? ฉันคิดว่าคำถามที่เป็นรูปธรรมและชัดเจนยิ่งขึ้นนั้นเป็นสิ่งจำเป็นและเป็นตัวอย่างเล็ก ๆ น้อย ๆ ของสิ่งที่คุณพยายามจะทำให้บรรลุ
Lorem Ipsum

1
ส่วนขยายหมายถึงการแก้ไขหรือไม่ คำถามไม่ชัดเจน
ศรีราม

ไม่เคยรู้เลยว่าอาจหมายถึงสิ่งต่าง ๆ มากมาย ... จะพยายามทำให้ชัดเจนขึ้นโดยทั่วไปฉันต้องการให้สัญญาณ 1-D ถูกสุ่มตัวอย่างในอัตราเดียวกัน แต่เป็นเวลานานขึ้น
PearsonArtPhoto

1
@endolith: มันปรับปรุงสิ่งต่าง ๆ เหรอ?
PearsonArtPhoto

คำตอบ:


16

วิธีการแก้ไขสเปกตรัมตาม DCT ที่อธิบายในเอกสารต่อไปนี้ขึ้นอยู่กับวัสดุที่มา

lk, HG, Güler S. "การแปลงสัญญาณและการแก้ไขตามการสังเคราะห์ DCT ที่ได้รับการดัดแปลง" , การประมวลผลสัญญาณดิจิตอล, บทความในการกด, 2011

นี่คือหนึ่งในตัวเลขจากกระดาษที่แสดงตัวอย่างของการแก้ไข:

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

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


1
น่าเศร้าที่ลิงค์นั้นตายไปแล้ว ฉันหาได้เฉพาะการดาวน์โหลดที่ชำระเงินนี้เท่านั้น
knedlsepp

@knedlsepp ลิงค์นี้ให้กระดาษโดยไม่ต้องจ่ายเงิน
Peter K.

18

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

นี่คือตัวอย่างเล็กน้อยใน Matlab โดยใช้lpcฟังก์ชันเพื่อประมาณค่าสัมประสิทธิ์ LPC

N = 150;    % Order of LPC auto-regressive model
P = 500;    % Number of samples in the extrapolated time series
M = 150;    % Point at which to start predicting

t = 1:P;

x = 5*sin(t/3.7+.3)+3*sin(t/1.3+.1)+2*sin(t/34.7+.7); %This is the measured signal

a = lpc(x, N);

y = zeros(1, P);

% fill in the known part of the time series
y(1:M) = x(1:M);

% in reality, you would use `filter` instead of the for-loop
for ii=(M+1):P      
    y(ii) = -sum(a(2:end) .* y((ii-1):-1:(ii-N)));
end

plot(t, x, t, y);
l = line(M*[1 1], get(gca, 'ylim'));
set(l, 'color', [0,0,0]);
legend('actual signal', 'extrapolated signal', 'start of extrapolation');

แน่นอนว่าในรหัสจริงคุณจะต้องใช้filterการคาดการณ์โดยใช้สัมประสิทธิ์ LPC aเป็นตัวกรอง IIR และโหลดค่าชุดเวลาที่ทราบล่วงหน้าไว้ในสถานะตัวกรอง บางสิ่งเช่นนี้

% Run the initial timeseries through the filter to get the filter state 
[~, zf] = filter(-[0 a(2:end)], 1, x(1:M));     

% Now use the filter as an IIR to extrapolate
y((M+1):P) = filter([0 0], -a, zeros(1, P-M), zf); 

นี่คือผลลัพธ์:

ตัวอย่าง LPC

มันเป็นงานที่สมเหตุสมผลแม้ว่าคำทำนายจะตายไปด้วยเวลาด้วยเหตุผลบางอย่าง

จริง ๆ แล้วฉันไม่รู้เกี่ยวกับแบบจำลอง AR และอยากรู้เพิ่มเติมด้วย

-

แก้ไข: @china และ @Emre ถูกต้องวิธี Burg ดูเหมือนจะทำงานได้ดีกว่า LPC มาก เพียงโดยการเปลี่ยนlpcไปarburgในอัตราผลตอบแทนโค้ดข้างต้นผลต่อไปนี้:

การคาดการณ์โดยใช้วิธี Burg

รหัสมีอยู่ที่นี่: https://gist.github.com/2843661


LPC เป็น AR จริง ๆ แล้ว MA สัญญาณ extrapolate "ตาย" เนื่องจากฟังก์ชันถ่ายโอนของ extrapolator ทำให้เกิดการลดทอน H(z)=b(z)/a(z)
เอ็ม

@Emre มีวิธีในการปรับปรุงการคาดการณ์หรือไม่?
nibot

ในฐานะที่เป็น @chinnu พูดว่าวิธีที่ง่ายคือการป้อนข้อมูลผลลัพธ์ลงในอินพุต
เอ็ม

2
เอาล่ะคุณทำให้ฉันเป็นไฟขึ้น MATLAB: P ปัญหาสามารถหลีกเลี่ยงได้โดยใช้อัลกอริทึมการประมาณค่า AR ที่แตกต่างกัน เพียงแทนที่โดยa=lpc(x,N) a=arburg(x,N)สำหรับการอภิปรายเกี่ยวกับอัลกอริธึม AR (ดูแห้ง) ทำไมไม่ควรใช้ Yule-Walker สำหรับการสร้างแบบจำลองอัตโนมัติ
Emre

1
เห็นได้ชัดว่ามันช้าไปหน่อย แต่มีปัญหากับการตั้งค่าของคุณ คุณให้อนุกรมเวลาแบบเต็มของx( Pการวัด) แก่lpc(หรือarburg) เมื่อประมาณค่าสัมประสิทธิ์ของแบบจำลอง สำหรับการคาดการณ์ตามคำถามต้นฉบับคุณควรประเมินจากการMวัดครั้งแรกเท่านั้น การให้คะแนนเวลาน้อยลงส่งผลให้การคาดการณ์ด้อยกว่า แต่ก็ยังทำงานได้ดีพอสมควร
Chris C

6

1-D 'การคาดการณ์' นั้นค่อนข้างง่ายโดยใช้วิธีของ BURG ในการประมาณค่าสัมประสิทธิ์ LP เมื่อค่าสัมประสิทธิ์ LP มีอยู่หนึ่งสามารถคำนวณตัวอย่างเวลาได้อย่างง่ายดายโดยใช้ตัวกรอง ตัวอย่างที่ทำนายด้วย Burg's เป็นตัวอย่างครั้งถัดไปของกลุ่มเวลาที่คุณป้อน


6

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

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

โดยทั่วไปนี่เป็นปัญหาที่คาดการณ์คุณอาจต้องการให้ Google คาดการณ์ราคาของฟูริเยร์หรือไม่


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