离散卷积
2025-02-08
2
0
原文转自:https://songho.ca/dsp/convolution/convolution.html
离散卷积公式定义为:
其中x[n]激励输入信号,h[n]是过滤信号,y[n]是响应信号
n是滑动窗口的位移,也可以被认为是步长,或者时间
y[n]的值表示该时刻x[n]在h[n]下的响应,对所有y[n]求和,是为总量。
卷积是对过滤信号反向,故取h[-k],每时的右位移n,故函数变化h[n-k]
1维卷积
卷积 1D 的 C++ 实现
for ( i = 0; i < sampleCount; i++ )
{
y[i] = 0; // set to zero before sum
for ( j = 0; j < kernelCount; j++ )
{
y[i] += x[i - j] * h[j]; // convolve: multiply and accumulate
}
}
但是,您应该在实现中关注几件事。
注意输入信号的范围。您可能超出输入信号的范围,例如 x[-1]、x[-2] 等。你可以为那些未定义的样本填充零,或者只是跳过边界处的卷积。无论如何,开始边缘和结束边缘的结果都不可能准确。
其次,如果输出数据类型为整数且脉冲响应为浮点数,则需要对输出值进行四舍五入。并且,输出值可能会超过最大值或最小值。
如果输出信号为无符号 8 位整数数据类型,则输出范围应介于 0 和 255 之间。您必须检查该值是否大于最小值和小于最大值。
下载 1D 卷积例程和测试程序。
conv1d.zip