f# - 如何在 F# 中进行卷积?

标签 f# signal-processing convolution

我想要 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]))

这可能不是最好的功能解决方案,但它应该可以完成这项工作。我怀疑是否存在一种纯粹的功能性解决方案,可以与速度的必要解决方案相匹配。

希望有帮助。

注意:该函数目前未经测试(尽管我已经确认它可以编译)。让我知道它是否没有完全按照它应该做的。另外,请注意 ij 变量与您的原始帖子所指的内容不同。

关于f# - 如何在 F# 中进行卷积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803055/

相关文章:

matlab - 带汉宁窗的傅立叶滤波器后恢复信号

tensorflow - 什么是 "convolution warmup"?

python - ConvLSTMCell : Dimensions of inputs should match 的 Tensorflow 错误

java - Android 音频录制与处理

.net - F# 绑定(bind)重定向不适用于 F# 4.3.0-4.3.1

c# - 尾部。 ILAsm中的前缀–使用示例吗?

generics - 可区分联合的通用容器上的模式匹配

python - 频率响应 Scipy.signal

python - 3d 内核和 3d 图像(例如 RGB)的矩阵乘法到底是如何产生 2d 输出的?

vb.net - f# 将函数的返回值分配给对象,使用 microsoft odbc