Main Content

zerocrossrate

ゼロ交差率

R2021b 以降

説明

rate = zerocrossrate(x) は、x のゼロ交差率を返します。x が行列の場合、この関数は各列を個別のチャネルとして解析し、各値がチャネルに対応する行ベクトルとしてゼロ交差率を返します。

rate = zerocrossrate(TT) は、MATLAB® timetable TT に格納されるデータのゼロ交差率を返します。TT に複数のチャネルが含まれている場合、関数は各チャネルを個別に解析します。

rate = zerocrossrate(___,Name,Value) は、追加の名前と値の引数を指定します。この構文は、前の構文の入力引数のいずれかと一緒に使用します。

また、[rate,count] = zerocrossrate(___)count でクロッシングの総数を返します。

[rate,count,indices] = zerocrossrate(___) は、信号におけるクロッシング発生位置の logical インデックスも返します。

出力引数を指定しないで zerocrossrate(___) を使用すると、rate"y" 軸に、対応するウィンドウ番号が "x" 軸にプロットされます。ウィンドウの長さが信号の全長に一致する場合、関数はウィンドウの長さを "x" 軸に、交差率をウィンドウ中央にプロットします。

すべて折りたたむ

交互に符号を変える 1 のベクトルについて考えます。データをプロットします。

x = [1 -1 1 -1 1 -1 1 -1 1 -1];
plot(x)

x のゼロ交差率を計算します。

r = zerocrossrate(x)
r = 0.9500

3 番目の出力引数を使用して、クロッシングが発生する位置を求めます。x とゼロクロッシングの位置をプロットします。この関数は、クロッシングの直後のサンプルのインデックスを返します。これは必ずしも厳密なクロッシング位置ではありません。関数は、x の初期状態は既定の設定でゼロであると見なすため、最初のサンプルはクロッシング ポイントとしてマークされます。

[~,~,indices] = zerocrossrate(x);
plot(x)
hold on
plot(x(indices),'*')
hold off

比較法を使用して、x のゼロ交差率を計算します。このゼロクロッシング率は、差分法を使用して計算される値とは異なります。

rC = zerocrossrate(x,Method="comparison")
rC = 0.9000

差分法を使用して、再度 x のゼロ交差率を計算し、ゼロを正に指定します。このゼロクロッシング率は、比較法を使用して計算される値と等しくなります。

rZ = zerocrossrate(x,ZeroPositive=1)
rZ = 0.9000

次に、x の初期状態を 1 として指定します。このゼロクロッシング率は前の結果と等しくなります。

rI = zerocrossrate(x,InitialState=1)
rI = 0.9000

2011 年 1 月に 1 か月間にわたってボストンのローガン空港で 1 時間間隔で測定された摂氏単位の温度を読み込みます。timetableを作成し、retimeを使用してデータを日次平均値に集計します。

load bostemp

t = hours(1:24*31)';
TT = timetable(t,tempC);
rTT = retime(TT,'daily','mean');

温度が月平均をクロッシングした日数をカウントします。データをプロットし、月平均の温度を示す水平線を追加することで、どこでクロッシングが発生しているかを可視化します。

avg = mean(TT.tempC)
avg = -1.3007
[~,count] = zerocrossrate(rTT,Level=avg)
count = 9
plot(hours(rTT.t/24),rTT.tempC)
yline(avg)
xlabel('Time elapsed since January 1, 2011 (days)')
ylabel('Average daily temperature (\circC)')
axis tight

音声には有声と無声という特徴があります。母音などの "有声" の音声は、声帯が振動するときに発せられます。ほとんどの子音など、"無声" の音声は、発声時に声帯が振動しません。ゼロクロッシングを使用することで、オーディオ信号を有声領域と無声領域に分類することができます。

オーディオ信号を MATLAB® ワークスペースに読み込みます。"Oak is strong, and also gives shade" という音声が流れます。

[y,fs] = audioread("oak.m4a");

% To hear, type soundsc(y,fs)

信号は 44.1 kHz でサンプリングされています。比較法を使用して、10 ms のウィンドウのゼロ交差率を計算します。

win = fs*0.01;
rate = zerocrossrate(y,WindowLength=win,Method="comparison");

各セグメントの交差率を可視化するには、rate をプロットします。有声音は交差率が低く、無声音は交差率が高くなることが想定されています。

plot(rate)

しきい値 0.1 を使用して有声セグメントと無声セグメントを区別します。2 つのカテゴリ ("Unvoiced" と "Voiced") をもつsignalMaskオブジェクトを作成して、関心領域 (ROI) をプロットします。無声音と有声音の領域を、発声された各単語の位置と比較します。

Audio Toolbox™ の文字起こし機能を使用することで、オーディオ ファイルから単語を抽出することができます。ラベル付き信号セット lsSpeechTranscription.mat からワークスペースに読み込みます。ラベル付き信号セットには、オーディオ信号、ROI 範囲、および発声された各単語のラベルが含まれています。発声された単語をプロットに表示します。オーディオ信号のラベル付けの詳細については、オーディオ信号内の発声された単語のラベル付けを参照してください。

h = 0.1;
idu = find(rate > h);
idu(1:2) = [];
vi = [(idu-1) idu]*win;

m = sigroi2binmask(vi,length(y));
mask = signalMask([m ~m],Categories=["Unvoiced" "Voiced"],SampleRate=fs);
plotsigroi(mask,y)

load SpeechTranscription

ln = getLabelNames(ls);
v = getLabelValues(ls,1,ln);
v.Value = categorical(v.Value,v.Value);

RL = v.ROILimits;
VL = v.Value;

hold on
text(mean(RL,2),-0.7*ones(size(VL)),VL,HorizontalAlignment="center", ...
    FontSize=11,FontWeight="bold")
hold off

15 秒間のアコースティック ギター音楽を含むオーディオ ファイルを読み込みます。サンプル レートは 44.1 kHz です。音楽を再生するには、次のコードの最後の行のコメントを解除します。

Fs = 44100;
y = audioread("guitartune.wav");

% sound(y,Fs)

オーディオ信号を、オーバーラップするフレーム (各フレームに 4096 サンプルを格納) にバッファリングします。512 サンプルのオーバーラップを使用します。

winLength = 4096;
overlap = 512;

[yB,~] = buffer(y,winLength,overlap,"nodelay");

各フレームのゼロ交差率を取得します。初期状態を各フレームの最初のサンプルの前回の値として指定することで、フレームのオーバーラップを考慮します。

init = winLength - overlap;
state = 0;
zcr = [];
for i = 1:size(yB,2)
    zcr = [zcr;zerocrossrate(yB(:,i),InitialState=state)];
    state = yB(init,i);
end

オーディオ信号をプロットし、各フレームのゼロ交差率を重ね合わせます。

figure
yyaxis left
x = 0:1/Fs:(numel(y)-1)/Fs;
plot(x',y)
xlabel("Seconds")
ylabel("Amplitude")
yyaxis right
xx = (1:size(yB,2))*((winLength-overlap)/Fs);
plot(xx',zcr)
ylabel("Zero-crossing rate")

バッファリングされていない信号のゼロ交差率を計算します。バッファリングされた信号のゼロ交差率と等価な結果を取得するには、WindowLength4096 に設定し、OverlapLength512 に設定します。2 つの結果が等価であるかを判定します。

zcr_batch = zerocrossrate(y,WindowLength=winLength,OverlapLength=overlap);

isequal(zcr_batch,zcr)
ans = logical
   1

入力引数

すべて折りたたむ

データ。実数値のベクトルまたは行列として指定します。x が行列の場合、この関数は各値がデータ列に対応する行ベクトルとしてゼロ交差率を返します。

データ型: single | double

入力 timetable。timetableとして指定します。TT には、等間隔にサンプリングされた単精度データまたは倍精度データを含めなければなりません。RowTimesプロパティには、値が増加し、かつ有限であるdurationベクトルまたはdatetimeベクトルを含めなければなりません。TT が行列を含む単一の変数をもつ timetable、またはそれぞれがベクトルを含む複数の変数をもつ timetable である場合、関数は各チャネルを個別に解析します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: zerocrossrate(x,Method="comparison",Level=7,transitionEdge="rising") は、比較法を使用して x7 で正に遷移するレートを計算します。

x の前の状態。要素数が入力チャネルの数と一致するベクトルとして指定します。

例: zerocrossrate(x,InitialState=[1 0 –1 3]) は 4 チャネル入力信号 x の交差率を返します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

ゼロ交差率の計算法。"difference" または "comparison" として指定します。Method を指定しない場合、関数は差分法を使用して交差率を計算します。

  • comparison — 関数は、クロッシングが完全に完了した位置で indices を true とマークします。

  • difference — 関数は、abs(sign(xi)–sign(xi–1)) > 0 の位置で indices を true とマークします。

例: zerocrossrate(x,Method="comparison") は比較法を使用して、x の交差率を計算します。

データ型: char | string

交差率を計算するウィンドウの長さ。正の整数として指定します。既定のウィンドウの長さは信号長です。

例: zerocrossrate(x,WindowLength=20) は、x の 20 サンプルのウィンドウの交差率を返します。

例: zerocrossrate(x,WindowLength=fs*0.05) は、サンプル レート fs が指定された x の 50 ms のウィンドウの交差率を返します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

隣接するセグメント間でオーバーラップするサンプルの数。正の整数として指定します。オーバーラップはウィンドウの長さよりも小さくなくてはなりません。

例: zerocrossrate(x,OverlapLength=0) は、オーバーラップのないセグメントの交差率を返します。

例: zerocrossrate(x,WindowLength=20,OverlapLength=5) は、5 サンプルがオーバーラップするセグメントの交差率を返します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

交差率を計算する信号レベル。実数スカラーとして指定します。関数は信号から Level の値を減算してゼロクロッシングを求めます。Level を指定しない場合、関数は 0 の既定値を使用し、ゼロ交差率を返します。

例: zerocrossrate(x,Level=1) は、入力信号 x1 をクロッシングするレートを返します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

交差率を計算する Level の値の上下のしきい値。実数スカラーとして指定します。関数は、[–threshold, threshold] の範囲の入力のすべての値を 0 に設定してからゼロクロッシングを求めます。

例: zerocrossrate(x,Threshold=0.1) は、–0.1 ~ 0.1 の許容誤差で交差率を返します。

メモ

LevelThreshold の両方を指定した場合、関数は入力からレベルの値を減算してから、結果の [–threshold, threshold] の範囲の入力値を 0 に設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

ゼロクロッシングをカウントするときに含める遷移。"falling""rising"、または "both" として指定します。"falling" を指定すると、関数は立ち下がり遷移のみカウントします。"rising" を指定すると、関数は立ち上がり遷移のみカウントします。

例: zerocrossrate(x,TransitionEdge="rising") は、立ち上がり遷移についてのみ x の交差率を返します。

データ型: char | string

符号の規則。logical スカラーとして指定します。ZeroPositive を true として指定した場合、関数は 0 を正であると見なします。ZeroPositive を false として指定した場合、関数は関数signの規則に従い、0、-1、および+1 が別個の符号をもつものと見なします。

例: zerocrossrate(x,ZeroPositive=1) は 入力信号 x の交差率を返し、ゼロを正であると見なします。

データ型: logical

出力引数

すべて折りたたむ

ゼロ交差率。行ベクトルまたは行列として返されます。WindowLength が信号長に等しい場合、rate は要素数が x または TT のチャネルの数と一致する行ベクトルです。WindowLength が信号長よりも小さい場合、関数は、"i" 行目に "i" 番目のウィンドウの交差率を含み、"j" 列目が "j" 番目の入力チャネルに対応する行列として rate を返します。

クロッシングの回数。N 行 M 列の行列として返されます。ここで、N はウィンドウの数、M は入力チャネルの数です。"i" 行目は "i" 番目のウィンドウのクロッシング回数に対応し、"j" 列目は "j" 番目のチャネルのクロッシング回数に対応します。

信号におけるクロッシング発生位置の logical インデックス。N×WindowLength×M の配列として返されます。ここで、N はウィンドウの数、M は入力チャネルの数です。

メモ

インデックスは必ずしも信号における厳密なクロッシング位置を表しているわけではありません。関数 zerocrossrate は、クロッシングの直後のサンプルのインデックスを返します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2021b で導入

参考

関数