【特征提取】基于matlab基音周期估计【含Matlab源码 551期】

158 阅读3分钟

一、简介

基于matlab基音周期估计

二、源代码

% 基音周期检测的端点检测算法
clc; close all; clear all;
wlen=320; inc=80;              % 分帧的帧长和帧移
T1=0.05;                       % 设置基音端点检测的参数
[x,fs]=wavread('C4_2_y.wav');                        % 读入wav文件
x=x-mean(x);                                % 消去直流分量
x=x/max(abs(x));                            % 幅值归一化

[voiceseg,vosl,SF,Ef]=pitch_vad(x,wlen,inc,T1);   % 基音的端点检测
fn=length(SF);
time = (0 : length(x)-1)/fs;                % 计算时间坐标
frameTime = FrameTimeC(fn, wlen, inc, fs);  % 计算各帧对应的时间坐标
plot(time,x,'k');  title('语音信号')
axis([0 max(time) -1 1]); ylabel('幅值');
xlabel('时间/s');

%  带通滤波器设计
clear all; clc; close all;

fs=8000; fs2=fs/2;                      % 采样频率
Wp=[60 500]/fs2;                        % 滤波器通带
Ws=[20 1500]/fs2;                       % 滤波器阻带
Rp=1; Rs=40;                            % 通带的波纹和阻带的衰减
[n,Wn]=ellipord(Wp,Ws,Rp,Rs);           % 计算滤波器的阶数
[b,a]=ellip(n,Rp,Rs,Wn);                % 计算滤波器的系数
fprintf('b=%5.6f   %5.6f   %5.6f   %5.6f   %5.6f   %5.6f   %5.6f\n',b)
fprintf('a=%5.6f   %5.6f   %5.6f   %5.6f   %5.6f   %5.6f   %5.6f\n',a)

[db, mag, pha, grd,w]=freqz_m(b,a);     % 求取频率响应曲线
plot(w/pi*fs/2,db,'k');                 % 作图
grid; ylim([-90 10]);

%   倒谱法基音周期检测
clc; close all; clear all;
wlen=320; inc=80;              % 分帧的帧长和帧移
T1=0.05;                       % 设置基音端点检测的参数
[x,fs]=wavread('C4_2_y.wav');                        % 读入wav文件
x=x-mean(x);                                % 消去直流分量
x=x/max(abs(x));                            % 幅值归一化

[voiceseg,vosl,SF,Ef,period]=pitch_Ceps(x,wlen,inc,T1,fs); %基于倒谱法的基音周期检测

fn=length(SF);
time = (0 : length(x)-1)/fs;                % 计算时间坐标
frameTime = FrameTimeC(fn, wlen, inc, fs);  % 计算各帧对应的时间坐标
% 作图
subplot 211, plot(time,x,'k');  title('语音信号')
axis([0 max(time) -1 1]); ylabel('幅值');
subplot 212; plot(frameTime,period,'k');
xlim([0 max(time)]); title('倒谱法基音周期检测'); 
xlabel('时间/s'); ylabel('样点数');
for k=1 : vosl                              % 标出有话段
    nx1=voiceseg(k).begin;
    nx2=voiceseg(k).end;
    nxl=voiceseg(k).duration;
    fprintf('%4d   %4d   %4d   %4d\n',k,nx1,nx2,nxl);
%  自相关法基音周期检测
clc; close all; clear all;

wlen=320; inc=80;              % 分帧的帧长和帧移
T1=0.05;                       % 设置基音端点检测的参数
[x,fs]=wavread('C4_2_y.wav');                        % 读入wav文件
x=x-mean(x);                                % 消去直流分量
x=x/max(abs(x));                            % 幅值归一化

[voiceseg,vosl,SF,Ef,period]=pitch_Corr(x,wlen,inc,T1,fs); %基于自相关法的基音周期检测

fn=length(SF);
time = (0 : length(x)-1)/fs;                % 计算时间坐标
frameTime = FrameTimeC(fn, wlen, inc, fs);  % 计算各帧对应的时间坐标
subplot 211, plot(time,x,'k');  title('语音信号')
axis([0 max(time) -1 1]); grid;  ylabel('幅值');
subplot 212; plot(frameTime,period,'k'); hold on;
xlim([0 max(time)]); title('自相关基音周期检测'); 
grid; xlabel('时间/s'); ylabel('样点数');
for k=1 : vosl
    nx1=voiceseg(k).begin;
    nx2=voiceseg(k).end;
    nxl=voiceseg(k).duration;
    fprintf('%4d   %4d   %4d   %4d\n',k,nx1,nx2,nxl);
    subplot 211
    line([frameTime(nx1) frameTime(nx1)],[-1 1],'color','r','linestyle','-');
    line([frameTime(nx2) frameTime(nx2)],[-1 1],'color','b','linestyle','--');
    subplot 212

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a
完整代码或代写加1564658423