我想要 convolve 一个带有离散滤波器的离散信号。信号和过滤器是 F# 中的浮点序列。
我能弄清楚如何做到这一点的唯一方法是使用两个嵌套的 for 循环和一个可变数组来存储结果,但它感觉不是很实用。
这是我将如何做到非功能性:
conv = double[len(signal) + len(filter) - 1]
for i = 1 to len(signal)
for j = 1 to len(filter)
conv[i + j] = conv[i + j] + signal(i) * filter(len(filter) - j)
最佳答案
试试这个功能:
let convolute signal filter =
[|0 .. Array.length signal + Array.length filter - 1|] |> Array.map (fun i ->
[|0 .. i|] |> Array.sum_by (fun j -> signal.[i] * filter.[Array.length filter - (i - j) - 1]))
这可能不是最好的功能解决方案,但它应该可以完成这项工作。我怀疑是否存在一种纯粹的功能性解决方案,可以与速度的必要解决方案相匹配。
希望有帮助。
注意:该函数目前未经测试(尽管我已经确认它可以编译)。让我知道它是否没有完全按照它应该做的。另外,请注意
i
和 j
变量与您的原始帖子所指的内容不同。
关于f# - 如何在 F# 中进行卷积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803055/