代码:
file='lixiyang.wav' %file='girl1.mp3' [x,fs]=audioread(file); % 读入声音文件,返回样本数据 y 以及该数据的采样率 Fs。 %======时域图像====== 随着时间声音赋值震荡图 data=x(:,1); %取单声道 n=0:length(x)-1; %建立一个信号等长的序列 time=n/fs; %建立时间序列,作为横坐标 figure(1); %图1:时域波形图 plot(time,data); %作图 title('音频信号时域图') %标题 xlabel('时间/s'); %标注横坐标 ylabel('幅值'); %标注纵坐标 grid on; %打开网格线 %=======频域图====== N=length(data); %取信号矩阵的长度 Y1=fft(data,N); %N点傅里叶变换 mag=abs(Y1); %取模 f=n*fs/N; %频率序列 figure(2); %图2:频谱图 plot(f(1:fix(N/2)),mag(1:fix(N/2))); title('音频信号fft频谱图');%标题 xlabel('频率/Hz'); %标注横坐标 ylabel('幅度'); %标注纵坐标 grid on; %打开网格线 %======基音频率提取====== [~,index]=max(data); % 返回最大值 最大值索引 timewin=floor(0.015*fs);%向负无穷舍入 xwin=data(index-timewin:index+timewin); [y,~]=xcov(xwin);%计算xwin的互协方差 ylen=length(y);%求音频长度 halflen=(ylen+1)/2 +30; yy=y(halflen: ylen);%选中见到末尾一段数据 [~,maxindex] = max(yy);%yy矩阵的最大值传递出去 fmax=fs/(maxindex+30); disp([file,'基音频率为 ', num2str(fmax), ' Hz'])%显示频率结果 %======通过基音频率判断男女声====== if fmax<200 disp([file,' 是男声文件']);%频率小于200的为男生 else disp([file,' 是女声文件']);%频率大于200为女生 end
结果: