matlab 基音周期估计后处理

fid=fopen('zhouqi.txt', 'rt');
zhouqi=fscanf(fid, '%f');
fclose(fid);

zhouqi0=medfilt1(zhouqi, 5);
zhouqi1=medfilt1(zhouqi0, 3);
zhouqi2=linsmooth(zhouqi0, 5);

w=[];
w=zhouqi;
w1=w-zhouqi2;
w1=linsmooth(w1, 5);
zhouqi3=w1+zhouqi2;

v=[];
v(1)=0;v(2)=0;v(3)=0;v(4)=0;
for i=1:(length(zhouqi) - 4)
    v(i+4)=zhouqi(i);
end
%v(:,1)为取v矩阵中第一列元素
%v(1,:)为取v矩阵中第一行元素
%v(:)矩阵v转换为一个行向量,就是一行
%例如:
%>> A = rand(2,3)
%
%A = 
%0.6925    0.3965    0.7802
%0.5567    0.0616    0.3376
%>> B = A(:)
%B =
%0.6925
%0.5567
%0.3965
%0.0616
%0.7802

v=v(:);
v1=v-zhouqi2;
v1=medfilt1(v1, 5);
v1=linsmooth(v1, 5);
zhouqi4=v1+zhouqi2;

figure(1);
subplot(511);
plot(zhouqi);
xlabel('帧数');
ylabel('样点数');
title('原始基音周期轨迹')

subplot(512);
plot(zhouqi1);
xlabel('帧数');
ylabel('样点数');
axis([0, 360, 0, 150]);
title('五点中值平滑和三点中值平滑组合')

subplot(513);
plot(zhouqi2);
xlabel('帧数');
ylabel('样点数');
axis([0, 360, 0, 150]);
title('五点中值平滑和五点线性平滑组合')

subplot(514);
plot(zhouqi3);
xlabel('帧数');
ylabel('样点数');
axis([0, 360, 0, 150]);
title('二次平滑算法')

subplot(515),plot(zhouqi4);
xlabel('帧数')
ylabel('样点数')
axis([0,360,0,150])
title('加延时的二次平滑算法')

function [y]=linsmooth(x, n)
    %disp(size(x));% x 是360行,1列的矩阵
    win=hann(n);
    win=win/sum(win); % 归一化
    %disp(size(win));
    disp(win);
    [r,c]=size(x);%size(x)返回 [行数,列数]
    if min(r,c)~=1 % ~=代表不等于
       error('sorry, no matrix here!:')
    end

    if r==1 % 行向量
        len=c;
    else    % 列向量
       len=r;
       x=x.';% 将列向量转置为行向量
    end
    %disp(len);
    %走到这里 x 一定是行向量
    y=zeros(len,1);
    if mod(n,2)==0 %返回用 m 除以 2 后的余数
       m=n/2;
       x = [ones(1,m)*x(1) x ones(1,m)*x(len)]';
    else
       m=(n-1)/2; %这里实验的n=5, m=2
       x = [ones(1,m)*x(1) x ones(1,m+1)*x(len)]';%生成新的数组,在数组 x 前面加2个元素,在数组 x 后面加3个元素
    end

    for k=1:len
        y(k) = win'*x(k:k+n-1); % 一行五列 * 五行一列
    end
end

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值