过零率(Zero Crossing Rate)是在每个音框中,音讯通过零点的次数,具有如下特性:
1. 一般而言,杂讯的过零大于气音的过零率,而气音的过零率又大于有声音的过零率
2. 通常在断点侦测,估测气音的起始位置和结束位置
3. 可用来预估信号的基频,但很容易出错,所以必须先进行前处理
以下显示如何计算过零率
范例 1输入:
close all
waveFile='test.wav';
frameSize=256;
overlap=0;
[y, fs, nbits]=wavread(waveFile);
framedY=buffer(y, frameSize, overlap);
zcr1=sum(framedY(1:end-1, :).*framedY(2:end, :)<=0);
zcr2=sum(abs(diff(framedY>0)));
time=(1:length(y))/fs;
frameNum=size(framedY, 2);
frameTime=((0:frameNum-1)*(frameSize-overlap)+0.5*frameSize)/fs;
subplot(2,1,1);
plot(time, y);
title(waveFile);
set(gca, 'xlim', [0, length(y)/fs]);
subplot(2,1,2);
plot(frameTime, zcr1, '.-', frameTime, zcr2, '.-');
legend('zcr1', 'zcr2');
set(gca, 'xlim', [0, length(y)/fs]);
title('过零率');
输出图形:
在下面这个范例中可以同时显示音量和过零率
范例2 输入
% 显示音量及过零率
recordViaMic=0;        % 若要自行录音,将这个值改为 1
% 获取音频数据
if recordViaMic,    % 自行录音
    fs=16000;                % 取样频率
    duration=3;                % 录音时间
    waveFile='test.wav';    %音频文件名称
    dataType='uint8';        % 解析度 8 bits/sample
    nbits=8;
    % 录音
    fprintf('按任意键后开始 %g 秒录音:', duration); pausematlab中fprintf是什么意思
    fprintf('录音中...');
    y=wavrecord(duration*fs, dataType);
    fprintf('录音结束\n');
else    % 读取音频文件
    waveFile='test.wav';
    [y, fs, nbits]=wavread(waveFile);
    y=uint8(y*(2^nbits)/2+2^nbits/2);    %恢复到原先档案所记载的unit8整数值
end
% 绘制音频的时域数据
y=double(y);        % 转成 double型文件
y=y-mean(y);        % 零点校正
sampleNum=length(y);
time=(1:sampleNum)/fs;
figure;
subplot(4,1,1);
plot(time, y);
ylabel('Amplitude');
title(waveFile);
axis([min(time), max(time), -2^nbits/2, 2^nbits/2]);
% 音框设置
frameSize=256;
overlap=84;
frameRate=fs/(frameSize-overlap);
framedY=buffer(y, frameSize, overlap);
frameNum=size(framedY, 2);
%计算音量
intensity=10*log10(mean(framedY.^2));
frameTime=(1:frameNum)*(frameSize-overlap)/fs;
subplot(4,1,2);
plot(frameTime, intensity);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。