|
楼主 |
发表于 2006-12-7 10:03
|
显示全部楼层
谢谢你
xcorr做基音的程序,好象时间太长了
另外我这里有一段下载的提取基音程序,但是有问题,因为我求到的基音怎么是44100,请问到底是什么地方有问题,谢谢
%巴特沃斯滤波器提取基音程序:
tic;
clear all;
clc;
fname = sprintf('F:\\code\\music\\%d.wav',5);
[sour,fs,bits] = wavread(fname);
% sour=interp(sour,100);%
% sour=decimate(sour,441);%decrease sampling rate
%设计巴特沃斯低通滤波器
rp=9;%通带衰减不大于
rs=60;%阻带衰减不小于
wp=900;%通带截止频率
ws=1800;%阻带截止频率
[N,Wn]=buttord(wp/(fs/2),ws/(fs/2),rp,rs);
[b,a]=butter(N,Wn); %低通滤波器
sour=filter(b,a,sour);
t=length(sour);
L=300;
N=ceil(t/L);
%取信号中间的450个采样点
j=1;
k=150;
for i=ceil(N/2)*L+1:ceil(N/2)*L+L+k
newsour(j)=sour(i);
j=j+1;
end
%三电平中心消波
amax=max(newsour(1:(L+k)/3));
bmax=max(newsour((L+k)/3+1:L+k));
cl=0.68*min(amax,bmax);
% cl=0.68*max(newsour);
for i=1:L+k
if newsour(i)>cl
newsour(i)=newsour(i)-cl;
elseif newsour(i)<-cl
newsour(i)=newsour(i)+cl;
else
newsour(i)=0;
end
end
newsour2=sign(newsour);
%newsour为450个采样点,newsour2为450个采样点,newrk为150个采样点
newrk=zeros(1,150);
%求出零点的值
for i=21:L%21:300
newrk(1)=newrk(1)+newsour(i)*newsour2(i);
end
%对newsour中的21:300个采样点进行自相关计算
for i=21:150
for j=21:L
newrk(i)=newrk(i)+newsour(j)*newsour2(j+i);
end
end
rmax=max(newrk(21:150))
newrk(1)
0.25*newrk(1)
%求除零点外的第一个极值点所在的位置
if rmax<0.25*newrk(1)
p=0;
else
[y,p]=max(newrk(21:150))
end
%计算出基音周期
s=['基音周期是:',num2str(p/fs),'s','基音频率是:',num2str(fs/p),'hz'];
% s=['基音频率是:',num2str(fs/p),'hz'];
msgbox(s);
toc; |
|