本质上,如果我有以下矩阵:
[1, 2, 3 ,4, 10]
我需要在插值时爆炸它,如下所示:
[1, 1.5, 2, 2.5, 3, 3.5, 4, 7, 10]
.
本质上,通过填充两个周围值的平均值来增强它。
假设我是否需要为 n 执行此操作,而不是像我们在这里一样只添加 1 个值。
本质上,如果我有以下矩阵:
[1, 2, 3 ,4, 10]
我需要在插值时爆炸它,如下所示:
[1, 1.5, 2, 2.5, 3, 3.5, 4, 7, 10]
.
本质上,通过填充两个周围值的平均值来增强它。
假设我是否需要为 n 执行此操作,而不是像我们在这里一样只添加 1 个值。
您需要使用interp1
with'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
的输入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)=1
和iv(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
至少在信号处理中,您通常在更改采样率而不是采样计数之后。