【数字信号处理】卷积编程实现 ( 卷积计算原理 | 卷积公式计算 | 使用 matlab 计算卷积 | 使用 C 语言实现卷积计算 )
一、卷积计算原理
对于 线性时不变系统 ( LTI - Linear time-invariant ) 来说 ,
假设
x
(
n
)
x(n)
x(n) 是 LTI 系统的 " 输入序列 " ,
y
(
n
)
y(n)
y(n) 是 " 输出序列 " ,
则有 :
y
(
n
)
=
∑
m
=
−
∞
+
∞
x
(
m
)
h
(
n
−
m
)
=
x
(
n
)
∗
h
(
n
)
y(n) = sum^{+infty}_{m = -infty} x(m) h(n-m) = x(n) * h(n)
y(n)=m=−∞∑+∞x(m)h(n−m)=x(n)∗h(n)
线性时不变系统 ( LTI - Linear time-invariant ) 的
" 输出序列 "
等于
" 输入序列 " 与 " 系统单位脉冲响应 " 的 线性卷积 ;
输出序列 的元素个数 :
输
出
序
列
元
素
个
数
=
输
入
序
列
元
素
个
数
+
单
位
脉
冲
响
应
序
列
元
素
个
数
−
1
输出序列元素个数 = 输入序列元素个数 + 单位脉冲响应序列元素个数 - 1
输出序列元素个数=输入序列元素个数+单位脉冲响应序列元素个数−1
二、卷积计算
给定 输入序列 :
x
(
n
)
=
{
1
,
2
}
[
0
,
1
]
x(n) = {1,2}_{[0, 1]}
x(n)={1,2}[0,1]
单位脉冲响应 :
h
(
n
)
=
{
1
,
2
}
[
0
,
1
]
h(n) = {1,2}_{[0, 1]}
h(n)={1,2}[0,1]
计算卷积 :
x
(
n
)
∗
h
(
n
)
x(n) * h(n)
x(n)∗h(n) ;
卷积结果序列对应的元素个数是
2
+
2
−
1
=
3
2 + 2 - 1 = 3
2+2−1=3
根据如下 卷积 公式 :
y
(
n
)
=
∑
m
=
−
∞
+
∞
x
(
m
)
h
(
n
−
m
)
=
x
(
n
)
∗
h
(
n
)
y(n) = sum^{+infty}_{m = -infty} x(m) h(n-m) = x(n) * h(n)
y(n)=m=−∞∑+∞x(m)h(n−m)=x(n)∗h(n)
x
(
n
)
∗
h
(
n
)
=
∑
m
=
−
∞
+
∞
x
(
m
)
h
(
n
−
m
)
x(n) * h(n) = sum^{+infty}_{m = -infty} x(m) h(n-m)
x(n)∗h(n)=m=−∞∑+∞x(m)h(n−m)
1、计算 y(0)
计算
y
(
0
)
y(0)
y(0) :
∑
m
=
−
∞
+
∞
x
(
m
)
h
(
0
−
m
)
sum^{+infty}_{m = -infty} x(m) h(0-m)
m=−∞∑+∞x(m)h(0−m)
m
m
m 取值
[
−
∞
,
+
∞
]
[-infty, +infty]
[−∞,+∞]
m
<
0
m < 0
m<0 时 , 有
x
(
m
)
=
0
x(m) = 0
x(m)=0 , 则
x
(
m
)
h
(
n
−
m
)
=
0
x(m) h(n-m) = 0
x(m)h(n−m)=0 , 累加没有意义 ;
m
=
0
m = 0
m=0 时 , 有
x
(
0
)
h
(
0
−
0
)
=
x
(
0
)
h
(
0
)
=
1
×
1
=
1
x(0)h(0 - 0) = x(0)h(0) = 1 times 1 = 1
x(0)h(0−0)=x(0)h(0)=1×1=1
m
≥
1
m geq 1
m≥1 时 , 有
h
(
n
−
m
)
=
h
(
0
−
m
)
=
0
h(n - m) = h(0 - m) = 0
h(n−m)=h(0−m)=0 , 则
x
(
m
)
h
(
n
−
m
)
=
0
x(m)h(n - m) = 0
x(m)h(n−m)=0 , 累加没有意义 ;
最终 :
y
(
0
)
=
x
(
0
)
h
(
0
)
=
1
×
1
=
1
y(0) = x(0)h(0)= 1 times 1 = 1
y(0)=x(0)h(0)=1×1=1
2、计算 y(1)
计算
y
(
1
)
y(1)
y(1) :
∑
m
=
−
∞
+
∞
x
(
m
)
h
(
1
−
m
)
sum^{+infty}_{m = -infty} x(m) h(1-m)
m=−∞∑+∞x(m)h(1−m)
m
m
m 取值
[
−
∞
,
+
∞
]
[-infty, +infty]
[−∞,+∞]
m
<
0
m < 0
m<0 时 , 有
x
(
m
)
=
0
x(m) = 0
x(m)=0 , 则
x
(
m
)
h
(
n
−
m
)
=
0
x(m) h(n-m) = 0
x(m)h(n−m)=0 , 累加没有意义 ;
m
=
0
m = 0
m=0 时 , 有
x
(
m
)
h
(
n
−
m
)
=
x
(
0
)
h
(
1
−
0
)
=
x
(
0
)
h
(
1
)
=
1
×
2
=
2
x(m) h(n-m) = x(0)h(1 - 0) = x(0)h(1) = 1 times 2 = 2
x(m)h(n−m)=x(0)h(1−0)=x(0)h(1)=1×2=2
m
=
1
m = 1
m=1 时 , 有
x
(
m
)
h
(
n
−
m
)
=
x
(
1
)
h
(
1
−
1
)
=
x
(
1
)
h
(
0
)
=
2
×
1
=
2
x(m) h(n-m) = x(1)h(1 - 1) = x(1)h(0) = 2 times 1 = 2
x(m)h(n−m)=x(1)h(1−1)=x(1)h(0)=2×1=2
m
≥
2
m geq 2
m≥2 时 , 有
h
(
n
−
m
)
=
h
(
2
−
m
)
=
0
h(n - m) = h(2 - m) = 0
h(n−m)=h(2−m)=0 , 则
x
(
m
)
h
(
n
−
m
)
=
0
x(m)h(n - m) = 0
x(m)h(n−m)=0 , 累加没有意义 ;
最终 :
y
(
1
)
=
x
(
0
)
h
(
1
)
+
x
(
1
)
h
(
0
)
=
2
+
2
=
4
y(1) = x(0)h(1)+x(1)h(0) = 2 + 2 = 4
y(1)=x(0)h(1)+x(1)h(0)=2+2=4
3、计算 y(2)
计算
y
(
2
)
y(2)
y(2) :
∑
m
=
−
∞
+
∞
x
(
m
)
h
(
2
−
m
)
sum^{+infty}_{m = -infty} x(m) h(2-m)
m=−∞∑+∞x(m)h(2−m)
m
m
m 取值
[
−
∞
,
+
∞
]
[-infty, +infty]
[−∞,+∞]
m
<
0
m < 0
m<0 时 , 有
x
(
m
)
=
0
x(m) = 0
x(m)=0 , 则
x
(
m
)
h
(
n
−
m
)
=
0
x(m) h(n-m) = 0
x(m)h(n−m)=0 , 累加没有意义 ;
m
=
0
m = 0
m=0 时 , 有
x
(
m
)
h
(
n
−
m
)
=
x
(
0
)
h
(
2
−
0
)
=
x
(
0
)
h
(
2
)
=
1
×
0
=
0
x(m) h(n-m) = x(0)h(2 - 0) = x(0)h(2) = 1 times 0 = 0
x(m)h(n−m)=x(0)h(2−0)=x(0)h(2)=1×0=0 ,
h
h
h 仅在
0
,
1
0,1
0,1 索引有值 ,
2
2
2 索引值为 0 ;
m
=
1
m = 1
m=1 时 , 有
x
(
m
)
h
(
n
−
m
)
=
x
(
1
)
h
(
2
−
1
)
=
x
(
1
)
h
(
1
)
=
2
×
2
=
4
x(m) h(n-m) = x(1)h(2 - 1) = x(1)h(1) = 2 times 2 = 4
x(m)h(n−m)=x(1)h(2−1)=x(1)h(1)=2×2=4
m
≥
2
m geq 2
m≥2 时 , 有
h
(
n
−
m
)
=
h
(
2
−
m
)
=
0
h(n - m) = h(2 - m) = 0
h(n−m)=h(2−m)=0 , 则
x
(
m
)
h
(
n
−
m
)
=
0
x(m)h(n - m) = 0
x(m)h(n−m)=0 , 累加没有意义 ,
h
h
h 仅在
0
,
1
0,1
0,1 索引有值 , 小于
0
0
0 的索引值为 0 ;
最终 :
y
(
1
)
=
x
(
0
)
h
(
1
)
+
x
(
1
)
h
(
0
)
=
0
+
4
=
4
y(1) = x(0)h(1)+x(1)h(0) = 0 + 4 = 4
y(1)=x(0)h(1)+x(1)h(0)=0+4=4
三、使用 matlab 计算卷积
matlab 源码 :
x = [1, 2];
h = [1, 2];
y = conv(x, h);
最终计算结果 :
y
(
n
)
=
{
1
,
4
,
4
}
[
0
,
2
]
y(n) = {1,4,4}_{[0,2]}
y(n)={1,4,4}[0,2]
四、使用 C 语言实现卷积计算
从百度百科找了个源码 : convolution
是卷积计算的函数 , 仅做参考 ;
void convolution(double *input1, double *input2, double *output, int mm, int nn)
{
double *xx = new double[mm + nn - 1];
// do convolution
for (int i = 0; i < mm + nn - 1; i++)
{
xx[i] = 0.0;
for (int j = 0; j < mm; j++)
{
if (i - j >= 0 && i - j < nn)
xx[i] += input1[j] * input2[i - j];
}
}
// set value to the output array
for (int i = 0; i < mm + nn - 1; i++)
output[i] = xx[i];
delete[] xx;
}
源码参考 https://baike.baidu.com/item/卷积 百度百科 ;