2012-05-20 32 views
3

我有一個N個測量值的數組,我應該以圖形的形式呈現,但圖形只能有M個像素寬,而且只能滾動M個像素。如何將n個元素的數組重新取樣爲m個元素的數組

雖然M是恆定的,但N可以是幾十到幾千之間的任何值。每次當我需要顯示圖表時,我知道N是什麼,但是因爲N/M不能是整數,所以我想要以某種方式補償累積的錯誤。

我工作在一個普通的C,沒有數學庫可以使用。

編輯2: 數據相對均勻,偶爾出現峯值,我不想在插值時錯過這些峯值。

編輯3: 我要尋找的解決方案,將工作配不上任何N,大於M和較小的比M

感謝。

+0

甚至沒有'libm'? –

+2

http://en.wikipedia.org/wiki/Interpolation –

+0

不,它是一個非常嚴格的內存限制的嵌入式設備:-) – Flot2011

回答

4

一個好的解決方案不是迭代你的輸入樣本,而是遍歷你的輸出位置。也就是說,你總是會畫出M像素。計算用於i個像素最近的採樣值,可以使用陣列的偏移:

[(i*N+M/2)/M] 

當然僅使用最接近樣品將給出非常別名結果(丟棄大部分的樣品的情況下N很大)。如果您確定N將始終大於M,但一個好的但簡單的方法是對具有加權平均值的足夠相鄰樣本進行平均,使得每個樣本獲得總權重1(使端點的權重在相鄰輸出像素之間分割) 。當然,您可以使用更復雜的重採樣算法,這可能更合適(尤其是如果您的數據類似於頻域中更有意義的音頻採樣),但是對於內存和時鐘週期要求嚴格的嵌入式設備,平均很可能是你想要的方法。

+0

N可能比M小一倍,但是由於你的回答,我開始認爲最好的方法是對這兩種情況使用2種不同的方法。 – Flot2011

+0

是的,你肯定需要不同的方法來處理這兩種情況。當「N」較小時,兩個最接近的樣本之間的線性插值是您將得到的最簡單的解決方案。當「N」較大時,求平均值是最簡單的解決方案。 –

相關問題