卷积与圆周卷积

matlab中fft函数是对序列做DFT,第二个参数是采样点的数量,当缺省时,默认为输入信号序列的长度;当大于信号序列的长度时候,对输入序列后面补零计算,频域信号的分辨率因此而变细,但是这时候的分辨率是伪分辨率。

设定信号序列s1,length(s1) = 9

s1 = [1,7,8,9,5,4,6,3,2]

调用fft函数,对s1进行傅里叶变换

plot(real(fft(s1)))

结果如下

默认参数

将第二个参数设置成100

figure
plot(real(fft(s1,100)))

结果为

100点

通过对比可以看出,补零进行傅里叶变换的结果是频域图形的分辨率变高了,但仍应注意此时候的分辨率是伪分辨率。

因为 DTFT(卷积(s1,s2)) = DTFT(s1)*DTFT(s2),因此想通过Matlab中的fft函数获得线卷积的,可以通过对 IDTFT(DTFT(卷积(s1,s2)) ))采样获得,采样点数 N= length(s1) + length(s2),但是IDTFT(DTFT(卷积(s1,s2)) ))是解析计算式,不容易通过计算机计算获得结果,只能是对DFT(s1,N)*DFT(s2,N)的结果做傅里叶逆变换,在matlab中实现方法。

ifft(fft(s1,N).*fft(s2,N))

同时以上的fft(s1,N).*fft(s2,N)也符合循环卷积的频域表现形式,也就是说conv(s1,s2) = 循环卷积(S1,S2),循环卷积的输入信号S1、S2分别为(这两者的相等也可以直接通过线性卷积和卷积的运算法则进行验证):

S1 = (s1,zeros(1,N+1-length(s2)))

S2= (s2,zeros(1,N+1-length(s1)))

因此对于conv(s1,s2) 这种计算量比较大的计算需求,就先补零转换成循环卷积 (S1,S2),再转换到频域相乘以缩减计算量,相乘后转换回到时域就是循环卷积 (S1,S2)的结果,也就是conv(s1,s2)的结果了,当s1、s2的序列越长,计算资源的节省效果就越明显。

PS:通过以上分析也可以看出,通过ifft(fft(s1).*fft(s2))算出来的不是s1、s2的卷积结果,而是他们的循环卷积结果,要计算卷积结果可以通过conv(s1,s2)进行计算。

猜你喜欢

转载自blog.csdn.net/ljl86400/article/details/81197441