《MATLAB在语音信号分析与合成中的应用》Ext_F0ztms函数具体内容
时间: 2023-10-29 16:06:54 浏览: 207
《MATLAB在语音信号分析与合成中的应用》中的`Ext_F0ztms`函数是用于提取基频信息的函数,其具体内容如下:
输入参数:
- `x`:语音信号
- `fs`:采样率
输出参数:
- `f0`:基频(单位:Hz)
- `t`:每个基频对应的时间点
函数实现:
该函数主要分为三个步骤:
1.对输入语音信号进行预处理,包括去直流分量、加汉明窗、预加重等。
```matlab
% 预处理
x = double(x);
x = x - mean(x); % 去直流分量
x = x .* hamming(length(x)); % 加窗
x = filter([1, -0.95], 1, x); % 预加重
```
2.对预处理后的语音信号进行基频提取,使用自相关法计算每个时刻的基频,然后进行平滑处理,去除不合理的基频值。
```matlab
% 提取基频
t0 = round(fs * 0.012); % 自相关分析区间
f0 = zeros(1, length(x)); % 保存每个时刻的基频
for i = t0 + 1 : length(x)
r = x(i - t0 : i);
r = r .* hanning(length(r)); % 窗函数
R = fft(r);
r = ifft(R .* conj(R));
[~, locs] = findpeaks(r(t0 + 1 : end), 'MinPeakDistance', round(fs / 400)); % 寻找谷值
if ~isempty(locs)
f0(i) = fs / locs(1);
end
end
f0 = medfilt1(f0, round(fs / 100)); % 中值滤波
f0(f0 < 50) = 0; % 去除不合理的基频值
```
3.对基频进行后处理,包括去除基频跳变、插值等。
```matlab
% 后处理
f0(f0 == 0) = NaN; % 为了方便插值,将基频为0的点设为NaN
f0 = fillmissing(f0, 'linear'); % 插值
f0 = smooth(f0, round(fs / 50)); % 平滑处理
f0 = medfilt1(f0, round(fs / 100)); % 中值滤波
f0 = fixjump(f0, round(fs / 50)); % 去除基频跳变
t = (0 : length(f0) - 1) / fs;
```
其中,`fixjump`函数是用于去除基频跳变的函数,具体实现如下:
```matlab
function f0 = fixjump(f0, N)
% 去除基频跳变
for i = 2 : length(f0)
if abs(f0(i) - f0(i - 1)) > N
f0(i) = f0(i - 1);
end
end
end
```
以上就是`Ext_F0ztms`函数的具体内容。
阅读全文