5

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

[1, 2, 3 ,4, 10]

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

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

本质上,通过填充两个周围值的平均值来增强它。

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

4

2 回答 2

17

您需要使用interp1with'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
于 2013-10-23T05:30:41.643 回答
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 - 元素数量的两倍 - 同时固定端点。将初始采样率定义为v1,那么 的采样率是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

至少在信号处理中,您通常在更改采样率而不是采样计数之后。

于 2013-10-23T06:36:35.853 回答