转自:http://wenku.baidu.com/link?url=_XsCGpmz9URT55q82Ka0Amgu2svvG8VyuTq71BvzTQmNIzqj_5DIanp8NkI6duePNyuxltuTWcJcnFi1MWseTXxgJuysud0CawPHrjGCh77
关于MATLAB中conv()卷积结果的长度的探讨
1. 问题的提出众所周知,已知信号长度为M的时间序列{x(i), i=1,M}与长度为N的近似理想脉冲响
应滤波器{h(i),i=1,N}的卷积长度为M+N-1的序列{y(i),i=1,M+N-1}。实际上只有中间的M-N+1的长度是有效卷积的内容。而两端各有N/2的长度,是部分{h(i)}和{x(i)}乘积求和的结
果,是两个脉冲函数,这两端的部分不是我们想要的。
在实际应用中,我们希望得到的{y(i)},不仅能够在长度上与{x(i)}一致,而且在内容
上也全部是有效的。MATLAB中conv(x,h,flag)的函数flag有三个选项“full”,”same”和
“valid”。在默认情况下是“full”全部长度即M+N-1,完整的调用格式为conv(x,h,’full’)。
‘valid’选项的长度只M-N+1, 其内容就是’same’和‘full’的中间M-N+1的部分。而‘same’中
的前首尾两端各N/2不是我们想要的,’full’首尾两端各N的长度也不是我样想要的。
2. 解决方法
(1) 周期延拓
将原始的{x(i)}中尾部N/2长度的数据接在其前面,并且将原始{x(i)}中头部的数据
接在其后面,即完成了周期延拓。再使用conv(x,h,’valid’)就可以得到与原始{x(i)}在长度上
相同,重要的是有效的卷积序列。
(2) 多天数据首尾相接法
如果{x(i)}是一天的长度,那么可将前天的数据末尾N/2长度的数据接在当天{x(i)}的前
面,将下一天的数据的头部N/2长度的数据接在当天{x(i)}的尾部。再进行conv(x,h,’valid’)
就可以得到与原始{x(i)}在长度上相同,重要的是有效的卷积序列。
方法(1)与(2)的差别在于有效部分形开始的少量结果有一致,到中间有效部分的
长度就是完全一样的了。