zerocrossrate
構文
説明
は、追加の名前と値の引数を指定します。この構文は、前の構文の入力引数のいずれかと一緒に使用します。rate = zerocrossrate(___,Name,Value)
出力引数を指定しないで 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™ の文字起こし機能を使用することで、オーディオ ファイルから単語を抽出することができます。ラベル付き信号セット ls を SpeechTranscription.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 サンプルのオーバーラップを使用します。
wl = 4096; ol = 512; yB = framesig(y,wl,OverlapLength=ol);
各フレームのゼロ交差率を取得します。初期状態を各フレームの最初のサンプルの前回の値として指定することで、フレームのオーバーラップを考慮します。
init = wl - ol; 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))*((wl-ol)/Fs); plot(xx',zcr) ylabel("Zero-crossing rate")

バッファリングされていない信号のゼロ交差率を計算します。バッファリングされた信号のゼロ交差率と等価な結果を取得するには、WindowLength を 4096 に設定し、OverlapLength を 512 に設定します。2 つの結果が等価であるかを判定します。
zcr_batch = zerocrossrate(y,WindowLength=wl,OverlapLength=ol); isequal(zcr_batch,zcr)
ans = logical
1
入力引数
データ。実数値のベクトルまたは行列として指定します。x が行列の場合、この関数は各値がデータ列に対応する行ベクトルとしてゼロ交差率を返します。
データ型: single | double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。
例: zerocrossrate(x,Method="comparison",Level=7,transitionEdge="rising") は、比較法を使用して x が 7 で正に遷移するレートを計算します。
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) は、入力信号 x が 1 をクロッシングするレートを返します。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
交差率を計算する Level の値の上下のしきい値。実数スカラーとして指定します。関数は、[–threshold, threshold] の範囲の入力のすべての値を 0 に設定してからゼロクロッシングを求めます。
例: zerocrossrate(x,Threshold=0.1) は、–0.1 ~ 0.1 の許容誤差で交差率を返します。
メモ
Level と Threshold の両方を指定した場合、関数は入力からレベルの値を減算してから、結果の [–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++ コードを生成します。
この関数は、GPU 配列を完全にサポートします。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2021b で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)