如何使用插值在MATLAB中将矢量的大小加倍?

时间:2013-10-23 04:38:34

标签: matlab matrix interpolation sampling

基本上,如果我有以下矩阵:

[1, 2, 3 ,4, 10]

我需要在插值时将其爆炸,如下所示:

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

基本上,通过填写两个周围值的平均值来增加它。

说我是否需要为n执行此操作,而不是像我们这里只添加1个值。

2 个答案:

答案 0 :(得分:16)

您需要interp1使用'linear'插值方法:

>> 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

答案 1 :(得分:7)

interp1的输入并不像看起来那么简单 - 如果你试图将采样率提高到一定数量而没有相移,而不仅仅是增加元素数量固定终点。您正在请求后一种情况,因此已经发布了解决方案,但我认为还有必要展示如何控制采样率。

在这种情况下,采用Shai完全有效的答案来增加元素数量而不考虑采样率的变化:

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')

这表示我们希望将元素数量从5增加到10 - 将元素数量增加一倍 - 同时固定终点。将v的初始采样率定义为1,那么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

不止一倍。是的,当你想到它时很明显,但要考虑这是否是你想要的。您确实可以将结果固定在iv(1)=1iv(end)=10,但您没有指定采样率的变化。

现在说你希望确保双倍的采样率增加。你不能得到那个的结尾固定在1和10.要指定一个Xi来获得正确的采样率变化:

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

不会固定末端,但采样率会翻倍:

>> 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

至少在信号处理中,通常是在采样率发生变化而不是样本数量之后。