音频信号分帧

为什么要分帧?

为什么要分帧处理?因为这么做有很多好处啊!比如:

1. 若本来就是数据流,不可能所有数据都拿到,再统一处理吧?

2. 有些文件很大啊,肯定要分段处理啊。

3. 逐点(pointwise)处理看起来虽然时间分辨率高,但计算量大,

而且真的非常缺乏一种连贯性。e.g. 麦克风录音的时候,可能突然有个突发噪声,

导致采样序列中有个别野点。这些野点会对逐点处理造成很大的伤害。

4. ……

综上,分帧处理,is necessary.


什么是分帧?怎么分?

什么是分帧?通俗地理解就是,加窗处理、分段处理。随着窗口的往右(假设向右代表时间向前)推移,对加窗后的信号逐步展开处理。

因此,知道三点就够了。

1. 窗口长度是多少wlen(window length)。For the sake of simplicity,先假定窗口长度一旦确定下来,在这次计算过程中长度就不可变化了。其实按理说是可变长的。

2. 每次窗口往右移动多长,即增量increment,或步长step。也是简单起见,假定步长一旦确定下来,在这次计算过程中长度就不可变化了。

3. 窗口选什么类型。时域上的加窗就是把原始信号x(t)与窗口w(t)相乘,频域就是对应的Fourier Transform相乘(感谢读者帮我指出问题。频域是卷积…)。不同的窗函数有不同的性质。常见的有矩形窗、三角窗、Hanning窗、Hamming窗、Blackman窗、Kaiser窗……


分帧注意事项

A. 帧数Nframe(number of frame)怎么算?不一定能整除嘛。

我的理解,两种做法。

1. 若帧都很短,最后一帧,不够wlen长度的,干脆就不要了。无伤大雅。

2. 完美主义者,就先前面(Nframe-1)帧都是wlen长,最后一帧,不够wlen的,就补零(zero padding)吧。

B. 窗函数有不同的性质,要根据需求,trial and error,反复试验。


Matlab示例代码

Matlab代码大概、好像是这样。

Nframe = floor( (length(x) - wlen) / nstep) + 1;
for k = 1:Nframe
  idx = (1:wlen) + (k-1) * nstep;
  x_frame = x(idx);
end

最后,分帧以后,应该把帧的序号对应上时间嘛。

frame-to-time的函数如下。


而给定一个时刻,想求得其对应的帧的代码如下。

% fs 采样率
% t0 特定时刻
frame_idx=fix((t0*fs-wlen)/nstep +1);


另外,给一个分帧的函数。

把输入的信号x分帧(可重叠)。分帧以后的信号存放在一个矩阵中。


最后,加窗分帧以后,怎么拼起来?以后总结。

你可能感兴趣的:(matlab,分帧)