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
07-02
3万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-15
918
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)