2011-09-07 65 views
0

我有一個數組,其大小爲256.此數組的元素數在0到1的範圍內。現在,我需要一個數組的大小應該是65536,其中每個元素應該插值或從256值的原始數組縮放。我問在另一個線程,但我不是足夠清晰:(從較小的數組中縮放數值到一個較大的數組

某種映射,其中,可以說,從原始圖像中的10個值應該與更多的數值更大的陣列中。是否可行?

編輯:可以說我有一個數組,這是256浮點數,每個浮點數在0到1範圍內現在,我需要一個新的數組,應該是65536浮動每個浮點數在0到1範圍內。從原來的256輛彩車內插或縮放。

+4

是的,這是可行的。但直到你讓你的問題更具體,你將不會得到任何答案;按照原樣,這個問題很可能因爲你最後一個原因而被關閉。 – ildjarn

+0

作爲一個想法:對於您的新數組,索引384位於舊數組索引1和2之間的一半,因此它應該包含這兩個數據的相應加權平均值。現在只是概括一下。 –

+0

@你需要箱子嗎? –

回答

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; 
} 
+0

這是一個線性插值? –

+0

@Duck應該去看醫生,這是一個線性插值。 – corsiKa

+0

@andand感謝C++的幫助! :) – corsiKa

3

這聽起來像你問sample rate conversion。如何最有效地做到這一點取決於你的數據的含義。例如,如果你的陣列表示聲波,你米請注意不要引入諧波失真,如果使用線性插值,會發生這種情況。

Wikipedia article on interpolation應該給你一些出發點。

+0

我相信他問的是一個直接/非偏斜的翻譯 –