声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1369|回复: 0

[混合编程] 基音提取程序 问题 请大人给整理一下

[复制链接]
发表于 2009-6-5 16:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位达人  小弟最近做毕业设计 是基音提取问题

我设计的基音周期分析函数
function nmax=find_maxn(r)
%寻找峰值最大的n值及基音周期
%r,自相关序列
%maxn,为峰值最大的n
zer=find(r==0); %找第一个零点如果存在
jiaocha=0; %找第一近零点
ii=1;
while (jiaocha<=0)
if(r(ii)>0 && r(ii+1)<0 && (ii+1)<length(r))
jiaocha=ii;
end

ii=ii+1;
if ii==length(r) %没有找到符合要求的点
jiaocha=1;
end
end

if length(zer)>0 %检查是否存在零点
if zer(1)<jiaocha %存在,则和jiaocha比较大小,用于祛除前点的对基音周期的查找带来的影响
jiaocha=zer(1);
end
end

r(1:jiaocha)=0; %祛除影响
maxn=max(r); %找最大值
temp=find(r==maxn);%返回第一个最大值
nmax=temp(1);


下面是基因周期提取程序

function zhouqi=jiyinzhouqi(filename)
%帧长和帧位移是重要的参数,位移是帧长的0~1/2
%短时自相关分析
%filename语音文件*.wav
%zhouqi基音周期,以毫秒为单位表示

[signal,fs]=wavread(filename);%用于得到声音文件的数据和采样率
shift=0.01;%每次移动10毫秒
shift=round(fs*shift);  %帧移
n1=fix(fs*0.01)+1;     %分析起点0.01ms,帧长30ms
n2=fix(fs*0.03)+1;
shift_count=fix((length(signal)-n1)/shift);
value =zeros(1,shift_count);%存放每次移位后的帧的基音周期
for ii=1:shift_count %分析次数
   if n2<length(signal)            %防止溢出
     data=signal(n1:n2);%加窗,提取一帧数据
     N=n2-n1+1;%每一帧的长度
     R=zeros(1,N);               
     for k=1:N-1                   %求自相关序列
       for jj=1:N-k
         R(k)=R(k)+data(jj)*data(jj+k);
       end
     end
     value(ii)=find_maxn(R);       %调用基音周期分析函数,求最大值所对应的位置,即基音周期
     n1=n1+shift;                  %移动帧,计算下一帧的基音周期  
     n2=n2+shift;
   end
end
%figure(3)
%plot(R);
%axis([0,1000 -300 300])
figure(1)
stem(value);%画出基因周期走势图
axis([0 length(value) 0 1000])
% len =length(value);                %基音周期多次分析数组长度
aver=mean(value);%基音周期的平均值,未去除野点

%  index=find(abs((value-aver))>aver/5);%找出偏移均值超出均值的1/5的基音,将其去除
%  value(index)=0;                    %去除大野点的影响
%  value=value(value>0);%将基音周期曲线中不符合的野点抠出

value=value(logical(abs(value-aver)<=aver/5));%找出偏移均值超出均值的1/5的基音周期,将其去除
len= length(value);%去除大野点后剩余的基音点数
for jj=1:3:len/3                   %中值平滑,滑动窗口宽度3,精度为中值1/4(剔除野点)
    average=(value(jj)+value(jj+1)+value(jj+2))/3;
    for kk=1:3
        if abs((value(jj-1+kk))-average)>average/4
            value(jj-1+kk)=0;      %将野点置零,同时数组长度减一
%              len=len-1;
        end
    end
end
value=value(( value~=0));%出去所有野点后的基音周期数组
len= length(value);%去除野点以后的基音点数
figure(2)
stem(value);
axis([0 length(value) 0 max(value)])
zhouqi=1000*sum(value)/len/fs;              %求平均的基音周期,单位是毫秒
% zhouqi=sum(value)/len;%用采样的点数表示基音周期

请问 如何用基因周期提取程序  调用 那个基因分析函数  如何 让两个函数整合在一起??
这是小弟代同学问的 请明白的达人指点
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 03:02 , Processed in 0.069998 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表