我正在尝试执行数学定义的卷积在数值模拟中。因此,我的信号是点的采样.
我需要计算准确、公正。确实,模拟在那里可以显示出非常精细的效果,所以我不能丢弃原则上的小错误。另请注意,此卷积将在大型阵列上执行很多次,因此它需要高效。
我的问题是我是否以及如何正确计算这个卷积?我已经尝试过已经在 Julia(或 Python,同样的故事)中实现的 FFT 算法,但我似乎有系统错误,如下所示。这些是我不了解的产物吗?我还应该怎么做?
此代码是一个“测试”,用于检查卷积两个框是否以数字方式给出分析结果:
using Plots
using FFTW
using DSP
function box(x)
if abs(x) < 0.5
return 1
else
return 0
end
end
function analytical_convolved_box(x)
if x <= 0 && x > -1
return x + 1
elseif x > 0 && x < 1
return 1 - x
else
return 0
end
end
x = range(-2, stop = 2, length = 20)
dx = x[2] - x[1]
input = box.(x)
l_half = convert(Int,length(input)/2)
output = dx *conv(input, input)[l_half+1:3l_half]
plot(x, box.(x), color = :blue)
plot!(x, box.(x), seriestype = :scatter, color = :blue)
plot!(x, analytical_convolved_box.(x), color = :green)
plot!(x, analytical_convolved_box.(x), seriestype = :scatter , color = :green)
plot!(x, output, color = :black)
plot!(x, output, seriestype = :scatter, color = :black)
11分:
x = range(-2, stop = 2, length = 11)
dx = x[2] - x[1]
input = box.(x)
l_half = convert(Int,length(input)/2 - 0.5)
output = dx *conv(input, input)[l_half+1:3l_half+1]
我想清楚地了解事情。请注意,在这两个示例中,并不清楚要使用哪些索引,所以我基本上不得不尝试和猜测。