时域卷积定理:
WIKI:
F
{
f
∗
g
}
=
F
{
f
}
⋅
F
{
g
}
F\{f*g\}=F\{f\} \cdot F\{g\}
F{f∗g}=F{f}⋅F{g}
百度:
f
1
(
t
)
↔
F
1
(
ω
)
f_1(t)\leftrightarrow F_1(\omega)
f1(t)↔F1(ω),
f
2
(
t
)
↔
F
2
(
ω
)
f_2(t)\leftrightarrow F_2(\omega)
f2(t)↔F2(ω):
F
[
f
1
(
t
)
∗
f
2
(
t
)
]
=
F
1
(
ω
)
⋅
F
2
(
ω
)
F[f_1(t)*f_2(t)]=F_1(\omega) \cdot F_2(\omega)
F[f1(t)∗f2(t)]=F1(ω)⋅F2(ω)
频域卷积定理:
WIKI:
F
{
f
⋅
g
}
=
F
{
f
}
∗
F
{
f
}
F\{f \cdot g\}=F\{f\} * F\{f\}
F{f⋅g}=F{f}∗F{f} 或者
f
∗
g
=
F
−
1
{
F
{
f
}
⋅
F
{
g
}
}
f*g=F^{-1}\{F\{f\} \cdot F\{g\}\}
f∗g=F−1{F{f}⋅F{g}}
百度:
f
1
(
t
)
↔
F
1
(
ω
)
f_1(t)\leftrightarrow F_1(\omega)
f1(t)↔F1(ω),
f
2
(
t
)
↔
F
2
(
ω
)
f_2(t)\leftrightarrow F_2(\omega)
f2(t)↔F2(ω):
F
[
f
1
(
t
)
⋅
f
2
(
t
)
]
=
1
2
π
F
1
(
ω
)
∗
F
2
(
ω
)
F[f_1(t)\cdot f_2(t)]=\frac{1}{2\pi}F_1(\omega) * F_2(\omega)
F[f1(t)⋅f2(t)]=2π1F1(ω)∗F2(ω)
总体上很相似但是在频域卷积定理上百度百科多除了一个
2
π
2\pi
2π,原因未知。接下来使用matlab验证卷积定理,当前网上都是矩阵验证且使用了IFFT,并不能实实在在的观察到卷积定理,而且在真正项目编码实现的时候既然使用到卷积定理,那大部分是不想用IFFT了。
时域卷积定理:
x1=[1 2 3 4 5];
x2=[2 3 4 5 6];
yx1=fft(x1);
yx2=fft(x2);
xx=cconv(x1, x2, 5);
fftxx=fftshift(fft(xx));
test=fftshift(yx1).* fftshift(yx2);
频域卷积定理:
x1=[1 2 3 4 5];
x2=[2 3 4 5 6];
yx1=fft(x1);
yx2=fft(x2);
xx=x1.*x2;
fftxx=fftshift(fft(xx));
fftxx=fftxx*5;
test = ifftshift( cconv( fftshift(yx1), fftshift(yx2),5 ) );
以上:
- 频域卷积定理验证时的结果形式和WIKI上的是一致的,百度百科上的可能需要该函数或者其他的一些操作。
- 在网上很多验证失败的根本原因是函数使用不正确,要想得到验证,每一个变量fft后都需要做一次fftshift,因为fft后频率是[0,fs/2] +[-fs/2,0]的形式,而shift后则变成[-fs/2,fs/2]。其次,卷积不可直接使用conv或者conv2等线性卷积(即我们经常使用的一种卷积方式,详见matlab的conv文档),直接使用的是cconv圆周卷积,原因是:fft本身是一个无限操作,圆周卷积也可以变成一种无限操作。
- 在频域卷积定理中,卷积之后需要乘以x1或者x2的长度(或者圆周卷积后除以x2长度,好像是圆周卷积做了x2长度个周期),x1和x2的长度肯定是相同的,因为两个之间的操作是点乘。
- 线性卷积和循环卷积可以互换。