2014-06-28 27 views
5

我在思考專門用於信號處理。比方說,我想要做一些事情,比如輸入信號的幅度的兩倍。我希望它速度非常快,所以我希望信號保存在連續的存儲器中(例如,非盒裝向量)。但是這個信號可能無限期地繼續下去,所以我希望它被視爲無限的列表;我寧願撥打map (*2) signal一次,而不是爲每個信號塊調用它。是否有無限列表與無盒矢量性能?

Haskell中是否有數據結構會緩衝這些數據塊,以便獲得連續的內存性能,但將數據視爲無限流?

+0

[我探討它是否可行,設計一個通用功能DSP庫這種方式前不久](https://github.com/leftaroundabout/timed-media/blob/master/Media/Timed/Audio.hs)。 (我想是的,至少你可以製作一些流暢的例子旋律的東西......但我沒有做過很多認真的工作。)一個大塊的無限列表,但沒有所有的時間簿記將是一個有趣的項目它自己的權利。 – leftaroundabout

+1

懶惰的bytestrings這樣做,除了它們只能保存字節。在內部,一個懶惰的字符串是一個unboxed數組列表。我不知道其他數據類型的類似庫。 – Heatsink

+0

惰性字節串似乎正是我所要求的。看起來像[這個庫](http://hackage.haskell.org/package/storablevector-0.2.8.3/docs/Data-StorableVector-Lazy.html)試圖做同樣的事情,但隨意的元素。 – awelkie

回答

6

這只是一個長鏡頭,但是如何使用streams足夠大的無盒子矢量塊呢?這將有利於向量的性能,同時,由於流,fusion

更新:的想法是定義一個newtype如:

import Data.Array.Unboxed 
import Data.Stream 
import Data.Word 

newtype Word8Stream = Word8Stream (Stream (UArray Int Word8)) 

,然後確定你需要如

smap :: (Word8 -> Word8) -> Word8Stream -> Word8Stream 
smap f (Word8Stream s) = Word8Stream $ fmap (amap f) s 
+0

這解決了性能問題,但我不能將塊流作爲一個長列表(或向量)來處理,對嗎?如果我想應用一個需要元素向量的函數,我將不得不使用map.map,而不是一次調用map,對嗎? – awelkie

+4

@DurnWhippersnapper你是對的,但可以隱藏在'newtype'數據類型和一組相應的函數中,這樣內部實現對其他模塊來說是完全不透明的。我更新了答案。 –

+0

只是讓它成爲一個函數。 – PyRulez