%% 时变滤波部分 % 定义时变滤波器的阶数和带宽 order =4; bw =[150,3000]; % 初始化输出信号 z = zeros(length(y),1); % 对每一帧进行时变滤波 for i = 1:frame_num % 计算当前帧的基频周期和帧长 period = round(fs/f0(i)); % 根据基频周期和帧长计算帧内的采样点数 num_samples = round(frame_len / period) * period; % 在帧内选择一些采样点 indices = (i-1)*frame_shift+(1:num_samples); % 构造时变滤波器 b = fir1(order, [bw(1)/(fs/2) bw(2)/(fs/2)], 'bandpass'); % 对选定的采样点进行滤波 filtered_samples = filter(b, 1, y(indices)); % 将滤波后的采样点插入帧内 z(indices) = z(indices) + filtered_samples; end % 输出重构后的语音信号 z=z/max(abs(z));怎么理解
时间: 2023-12-21 20:05:36 浏览: 44
ADwienerfilt_wienerfilter_时变滤波器_时变滤波_
5星 · 资源好评率100%
这段代码实现了对语音信号进行时变滤波的过程。首先,根据前面得到的瞬时频率向量,计算出当前帧的基频周期和帧长,进而确定当前帧内需要进行滤波的采样点。然后,根据基频周期和帧长计算出需要选取的采样点数,并构造时变滤波器。接着,对选定的采样点进行滤波,得到滤波后的采样点,并将其插入到当前帧的对应位置。最后,将所有帧内插入滤波后采样点的信号进行叠加,得到重构后的语音信号。
这里使用的是带通滤波器,其阶数和带宽分别通过变量order和bw进行设置。通过对每一帧进行时变滤波,可以消除语音信号中的非线性失真和时变谐波失真等问题,从而提高语音信号质量。最后,对重构后的语音信号进行了标准化处理,以使其幅度范围在-1到1之间。
阅读全文