我正在编写自己使用Conduit的WAVE
解析器,因此我可以通过管道一个接一个地传输值。
我通过hGet
从.wav文件中获取样本(n是该wav文件的每个样本的字节数):
bytes <- hGet h n
这给了我一个ByteString,表示样本的Double值。例如:
"\131\237\242"
代表-0.10212671756744385
"g\238\242"
代表-0.10209953784942627
"\215\238\242"
代表-0.10208618640899658
。
可能的值介于-1和+1之间。
有没有方便的方法进行此转换?有没有图书馆可以做到这一点?
我已经看了Haskell的现有WAVE
解析器。 Data.WAVE解析.wav
文件,并将样本作为左对齐Int32
值返回。我找到了一种解决方法,我使用它的库函数将我的ByteString
转换为左对齐Int32
,然后使用库的Double
函数将其转换为sampleToDouble
。这有效,但我想知道是否有更直接的方法来解决这个问题。
另一种可能的解决方案是将ByteString
转换为[Word8]
ByteString.unpack
,将[Word8]
转换为Word32
,然后将此值转换为{{ 1}}使用Data.Binary.IEEE754中的转换函数。这会是一个很好的解决方案吗?一个问题是我目前不知道如何将[Word8]的四元素列表转换为Word32。
答案 0 :(得分:0)
这是我目前将ByteString转换为双精度的解决方案:
poltergeist
我想知道这是否可以以更有效的方式完成。