把一个向量X分成长度为N的帧,帧之间重叠P个样点;帧化信号加窗后逐帧进行FFT。这几乎是语音信号处理的“必须流程”。以前都需要编循环实现。近日发现一个MATLAB函数,一句话就能实现,惊叹不已。这里推荐buffer语句。细致说明可用帮助命令调出研究。这里介绍几种典型情况。
1,把一个向量自动分帧变为矩阵,帧之间无重叠: X1= buffer(X, N); 不丢弃一个样点,自动在向量后面补0把所有样点都用上;
2,把一个向量自动分帧,帧之间有重叠:X2=buffer(X,N,P); 执行时,先给X前面增加P个0,然后开始一帧一帧分帧,前后帧之间重叠P个样点,后面如前补0,不丢弃样点
3,把一个向量自动分帧,帧之间有重叠,但是第一帧要从X的第一个样点开始,不能在前面补0:X3=buffer(X,N,P,'nodelay'); 这是一种常见情况,能一句话取代一个循环。
设X=1 :23;N=8;P=3;执行上面三条命令后的结果分别是:
X1:
1 9 17
2 10 18
3 11 19
4 12 20
5 13 21
6 14 22
7 15 23
8 16 0
X2:
0 3 8 13 18
0 4 9 14 19
0 5 10 15 20
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 0
5 10 15 20 0
X3:
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
5 10 15 20
6 11 16 21
7 12 17 22
8 13 18 23
有了buffer,再加上bsxfun,代码可以大大简化,执行速度明显提升。