2013-10-23 11 views
5

Zasadniczo, jeśli mam następujące macierzy:Jak podwoić rozmiar wektora w MATLAB z interpolacją?

[1, 2, 3 ,4, 10] 

muszę eksplodować go podczas interpolacji, co następuje:

[1, 1.5, 2, 2.5, 3, 3.5, 4, 7, 10].

Zasadniczo, spasuj, wypełniając średnią z dwóch otaczających wartości.

Powiedz, czy muszę to zrobić dla n zamiast dodawać tylko 1 wartość, jak mamy tutaj.

Odpowiedz

16

Trzeba użyć interp1 metodą 'linear' interpolacji:

>> v = [1 2 3 4 10]; 
>> newNum = 13; % new number of elements in the "buffed" vector 
>> iv = interp1(linspace(0,1,numel(v)), v, linspace(0,1,newNum)) 
iv = 
1.0000 1.3333 1.6667 2.0000 2.3333 2.6667 3.0000 3.3333 3.6667 4.0000 6.0000 8.0000 10.0000 
7

Wejścia do interp1 nie zawsze są tak trywialne, jak się wydaje - jeśli starają się zwiększyć częstotliwość próbkowania do określonej kwoty bez przesunięcie fazowe, a nie tylko zwiększenie liczby elementów podczas przypinania punktów końcowych. Żądasz tego ostatniego warunku, więc rozwiązanie zostało już zaksięgowane, ale myślę, że warto pokazać, jak kontrolować częstotliwość próbkowania.

Take doskonale poprawną odpowiedź Shai za zwiększenie liczby elementów bez względu na zmiany częstotliwości próbkowania, w tym przypadku:

v = [1 2 3 4 10]; % 1x5 
newNum = 10; % double the number 
X = linspace(0,1,numel(v)); 
Xi = linspace(0,1,newNum); 
iv = interp1(X, v, Xi, 'linear') 

To mówi chcemy zwiększyć liczbę elementów od 5 do 10 - - podwoić liczbę elementów - podczas przypinania punktów końcowych. Zdefiniowanie początkowej częstotliwości próbkowania dla v na 1, a następnie jaka jest częstotliwość próbkowania iv?

>> iv = interp1(linspace(0,1,numel(v)), v, linspace(0,1,newNum)) 
iv = 
    Columns 1 through 8 
    1.0000 1.4444 1.8889 2.3333 2.7778 3.2222 3.6667 4.6667 
    Columns 9 through 10 
    7.3333 10.0000 
>> fs_v = X(2) - X(1) % even spacing 
fs_v = 
    0.2500 
>> fs_vi = Xi(2) - Xi(1) 
fs_vi = 
    0.1111 
>> fs_v/fs_vi 
ans = 
    2.2500 

Ponad dwa razy więcej. Tak, to oczywiste, kiedy o tym myślisz, ale zastanów się, czy tego właśnie chcesz. Końce przypięte są na iv(1)=1 i iv(end)=10, ale nie określasz zmiany częstotliwości próbkowania.

Teraz powiedz, że chcesz dokładnie zwiększyć dwukrotnie częstotliwość próbkowania. Nie można dostać że i mieć końce przypięte na 1 i 10. Aby określić Xi że dostaje odpowiednią zmianę częstotliwości próbkowania:

scale = numel(v)/newNum; % i.e. 0.5 
X = 1:numel(v); 
Xi = (1:newNum)*scale + 0.5 * (1 - scale); % centered 

Końce nie zostanie przypięty, ale tempo próbce podwoiła się:

>> iv = interp1(X, v, Xi, 'linear', 'extrap') 
iv = 
    Columns 1 through 8 
    0.7500 1.2500 1.7500 2.2500 2.7500 3.2500 3.7500 5.5000 
    Columns 9 through 10 
    8.5000 11.5000 
>> (X(2) - X(1))/(Xi(2) - Xi(1)) 
ans = 
    2 

Przynajmniej w przetwarzaniu sygnału, zwykle po zmianie częstotliwości próbkowania, a nie liczby próbek.

Powiązane problemy