将较小数组中的值缩放为较大的数组

时间:2011-09-07 18:13:45

标签: c++ algorithm math

我有一个数组,其大小为256.此数组包含0到1范围内的元素。现在,我需要一个大小应为65536的数组,其中每个元素应该从256个值的原始数组进行插值或缩放。我问另一个帖子,但我不够清楚:(

某种映射,例如,原始图像中的10个值应与较大数组中的更多数值匹配。它可行吗?

编辑:假设我有一个256浮点数的数组,每个浮点数在0到1范围内。现在,我需要一个新的数组,应该是65536浮点数,每个浮点数在0到1范围内。这些新的浮点值应该从原始的256个浮点数进行插值或缩放。

2 个答案:

答案 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;
}