Làm cách nào để ngoại suy tín hiệu 1D?


25

Tôi có một tín hiệu của một số chiều dài, nói 1000 mẫu. Tôi muốn mở rộng tín hiệu này lên 5000 mẫu, được lấy mẫu với cùng tốc độ như ban đầu (nghĩa là tôi muốn dự đoán tín hiệu sẽ là gì nếu tôi tiếp tục lấy mẫu trong một khoảng thời gian dài hơn). Tín hiệu này bao gồm một số thành phần hình sin được thêm vào với nhau.

Phương pháp đầu tiên đến với tôi là lấy toàn bộ FFT và mở rộng nó, nhưng điều này để lại sự gián đoạn rất mạnh ở khung 1001. Tôi cũng đã xem xét chỉ sử dụng một phần của phổ gần các cực đại, và trong khi điều này dường như cải thiện tín hiệu phần nào, dường như với tôi rằng pha được đảm bảo là chính xác. Phương pháp tốt nhất để mở rộng tín hiệu này là gì?

Đây là một số mã MATLAB hiển thị một phương thức lý tưởng hóa những gì tôi muốn. Tất nhiên, tôi sẽ không biết trước rằng có chính xác 3 thành phần hình sin, cũng như pha và tần số chính xác của chúng. Tôi muốn đảm bảo rằng chức năng này liên tục, không có bước nhảy khi chúng ta di chuyển đến điểm 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);

Về cơ bản, đưa ra dòng màu xanh lá cây, tôi muốn tìm dòng màu xanh. nhập mô tả hình ảnh ở đây


3
Đây có phải là trong bối cảnh ốp lát một hình ảnh, làm một cái gì đó như một phần mở rộng bầu trời, hoặc một cái gì khác? Nói cách khác, có bất kỳ biện pháp chất lượng nào khác cho phần mở rộng bên cạnh việc nó "trơn tru" ở các cạnh không?
datageist

3
Câu hỏi của bạn không rõ ràng. Bạn có ý nghĩa gì bởi "mở rộng"? Bạn đang cố gắng sao chép và catenate các bản sao tín hiệu của bạn (ốp lát) hoặc bạn muốn lấy mẫu của nó bằng 5x hoặc bạn muốn ghi lại nó lâu hơn 5x? Là tín hiệu của bạn định kỳ? Tôi nghĩ rằng một câu hỏi cụ thể và rõ ràng hơn là cần thiết và một ví dụ tối thiểu về những gì bạn đang cố gắng đạt được chắc chắn sẽ giúp ích.
Lorem Ipsum

1
không mở rộng có nghĩa là nội suy? Câu hỏi không rõ ràng lắm.
Sriram

Không bao giờ nhận ra nó có thể có nghĩa là nhiều thứ như vậy ... Sẽ thử và làm cho nó rõ ràng hơn, về cơ bản tôi muốn có tín hiệu 1-D được lấy mẫu ở cùng một tốc độ, nhưng trong một khoảng thời gian dài hơn.
PearsonArtPhoto

1
@endolith: Điều đó có cải thiện mọi thứ không?
PearsonArtPhoto

Câu trả lời:


16

Tùy thuộc vào vật liệu nguồn, phương pháp nội suy phổ dựa trên DCT được mô tả trong bài báo sau có vẻ đầy hứa hẹn:

lk, HG, Güler S. "Chuyển đổi và nội suy tín hiệu dựa trên tổng hợp DCT đã sửa đổi" , Xử lý tín hiệu số, Bài báo, 2011.

Đây là một trong những số liệu từ bài báo cho thấy một ví dụ về phép nội suy:

nhập mô tả hình ảnh ở đây

Các ứng dụng của kỹ thuật để phục hồi các phân đoạn bị mất ( ví dụ 4.2. Tổng hợp các khoảng thời gian bị mất ) có lẽ phù hợp nhất với phép ngoại suy. Nói cách khác, lấy một phần của tài liệu nguồn hiện có, giả vờ có một đoạn bị mất giữa cạnh và đoạn tùy ý bạn đã chọn, sau đó "tái tạo" phần "bị thiếu" (và có thể loại bỏ phần bạn đã sử dụng ở cuối). Nó xuất hiện một ứng dụng thậm chí đơn giản hơn của kỹ thuật sẽ hoạt động để lặp lại vật liệu nguồn một cách liền mạch ( ví dụ 3.1. Nội suy biên độ phổ ).


1
Đáng buồn là liên kết đã chết. Tôi chỉ có thể tìm thấy tải về trả tiền này .
knedlsepp

@knedlsepp Liên kết này xuất hiện để đưa ra giấy mà không phải là một bức tường.
Peter K.

18

Tôi nghĩ mã hóa dự báo tuyến tính (còn được gọi là trung bình di chuyển tự động hồi quy ) là những gì bạn đang tìm kiếm. LPC ngoại suy một chuỗi thời gian bằng cách trước tiên khớp một mô hình tuyến tính với chuỗi thời gian, trong đó mỗi mẫu được coi là một tổ hợp tuyến tính của các mẫu trước đó. Sau khi lắp mô hình này vào chuỗi thời gian hiện tại, nó có thể được chạy về phía trước để ngoại suy các giá trị tiếp theo trong khi duy trì phổ công suất cố định (?).

Dưới đây là một ví dụ nhỏ trong Matlab, sử dụng lpchàm để ước tính các hệ số 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');

Tất nhiên, trong mã thực, bạn sẽ sử dụng filterđể thực hiện phép ngoại suy, bằng cách sử dụng các hệ số LPC alàm bộ lọc IIR và tải trước các giá trị thời gian đã biết vào trạng thái bộ lọc; đại loại như thế này:

% 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); 

Đây là đầu ra:

Ví dụ về LPC

Nó làm một công việc hợp lý, mặc dù dự đoán sẽ chết theo thời gian vì một số lý do.

Tôi thực sự không biết nhiều về các mô hình AR và cũng sẽ tò mò tìm hiểu thêm.

-

EDIT: @china và @Emre đều đúng, phương pháp Burg dường như hoạt động tốt hơn nhiều so với LPC. Đơn giản chỉ cần bằng cách thay đổi lpcđể arburgtrong sản lượng mã trên kết quả như sau:

Phép ngoại suy bằng phương pháp Burg

Mã có sẵn ở đây: https://gist.github.com/2843661


H(z)=b(z)/a(z)

@Emre Có cách nào để cải thiện phép ngoại suy không?
nibot

Như @chinnu nói, cách dễ dàng là đưa đầu ra vào đầu vào.
Emre

2
Được rồi, bạn đã khiến tôi kích hoạt MATLAB: P Có thể tránh được vấn đề bằng cách sử dụng thuật toán ước tính AR khác nhau; chỉ cần thay thế a=lpc(x,N)bằng a=arburg(x,N). Đối với một cuộc thảo luận (khô khan) về các thuật toán AR, hãy xem Tại sao Yule-Walker không nên được sử dụng cho Mô hình tự phát
Emre

1
Điều này rõ ràng là hơi muộn, nhưng có một vấn đề với thiết lập của bạn. Bạn cung cấp chuỗi toàn thời gian x( Pđo lường) đến lpc(hoặc arburg) khi ước tính các hệ số mô hình. Để ngoại suy theo câu hỏi ban đầu, bạn thực sự chỉ nên dựa vào ước tính này cho các Mphép đo đầu tiên . Cung cấp ít điểm thời gian hơn dẫn đến ngoại suy kém hơn, nhưng vẫn hoạt động tốt.
Chris C

6

1-D 'Phép ngoại suy' khá đơn giản bằng cách sử dụng phương pháp của BURG để ước tính các hệ số LP. Khi hệ số LP có sẵn, người ta có thể dễ dàng tính toán các mẫu thời gian bằng cách áp dụng bộ lọc. Các mẫu được dự đoán với Burg là các mẫu thời gian tiếp theo của phân đoạn thời gian đầu vào của bạn.


6

Nếu bạn hoàn toàn chắc chắn rằng chỉ có một vài thành phần tần số cho tín hiệu, bạn có thể thử thuật toán MUSIC để tìm ra tần số nào được chứa trong tín hiệu của bạn và cố gắng làm việc từ đó. Tôi không hoàn toàn chắc chắn rằng điều này có thể được thực hiện để hoạt động hoàn hảo.

Ngoài ra, vì dữ liệu của bạn hoàn toàn xác định, bạn có thể thử xây dựng một loại dự báo phi tuyến tính, huấn luyện nó bằng cách sử dụng tập dữ liệu hiện có của bạn và để nó ngoại suy phần còn lại.

Nói chung đây là một vấn đề ngoại suy, bạn có thể muốn Google một cái gì đó như ngoại suy giá của Fourier .


(Nhiều năm sau), một thuật toán khác để tìm một vài thành phần tần số là nghịch đảo sóng hài .
chối
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.