基本上,如果我有以下矩阵:
[1, 2, 3 ,4, 10]
我需要在插值时将其爆炸,如下所示:
[1, 1.5, 2, 2.5, 3, 3.5, 4, 7, 10]
。
基本上,通过填写两个周围值的平均值来增加它。
说我是否需要为n执行此操作,而不是像我们这里只添加1个值。
答案 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)=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
至少在信号处理中,通常是在采样率发生变化而不是样本数量之后。