我有一个数组,其大小为256.此数组包含0到1范围内的元素。现在,我需要一个大小应为65536的数组,其中每个元素应该从256个值的原始数组进行插值或缩放。我问另一个帖子,但我不够清楚:(
某种映射,例如,原始图像中的10个值应与较大数组中的更多数值匹配。它可行吗?
编辑:假设我有一个256浮点数的数组,每个浮点数在0到1范围内。现在,我需要一个新的数组,应该是65536浮点数,每个浮点数在0到1范围内。这些新的浮点值应该从原始的256个浮点数进行插值或缩放。
答案 0 :(得分:3)
听起来你问的是sample rate conversion。最好的方法取决于数据的含义。例如,如果您的阵列代表声波,则必须注意不要引入谐波失真,如果您使用线性插值会发生这种失真。
Wikipedia article on interpolation应该给你一些起点。
答案 1 :(得分:3)
免责声明:如今,我的C ++并不是那么出色。这看起来更像Java。我假设你还没有计划复制和粘贴:知道算法比实现语言更重要。
以下算法不会为256个条目输入生成65536个条目。相反,它使得65281.原因是你需要从某物扩展到其他东西。考虑一个有256个帖子的围栏。你只有255个栅栏部分。每个缩放对应于栅栏的一部分。对于简单的数学运算,我使每个原始样本之间的样本数等于原始样本的数量。因此,如果您输入4个输入,您将获得13个输入。 100条输入将输入9901条。
享受!
std::vector<double> sample(std::vector<double> orig) {
std::vector<double> result(orig.size() * (orig.size() - 1) + 1);
/* for each value, make that many values scaled between this and the last piece */
for(int i = 0; i < orig.size() - 1; i++) {
double last = orig[i];
double curr = orig[i+1];
double diff = curr - last;
double step = diff / orig.size();
int offset = i * orig.size();
for(int j = 0; j < orig.size(); j++) {
result[offset + j] = last + (step * j);
}
}
result[result.size() - 1] = orig[orig.size() - 1];
return result;
}