ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

信号アナライザー

複数の信号とスペクトルの可視化および比較

説明

信号アナライザー アプリは、時間領域、周波数領域、時間-周波数領域における信号の視覚化、前処理、測定、解析、比較用の対話型ツールです。このアプリを使用して以下ができます。

  • MATLAB® ワークスペース内のすべての信号への容易なアクセス

  • アプリを離れることなく、信号の平滑化、フィルター処理、リサンプリング、複製、抽出、または名前の変更

  • カスタム前処理関数の追加および適用

  • 複数の信号波形、スペクトル、パーシステンス、スペクトログラム、およびスカログラム表現の可視化および比較の同時実行

信号アナライザーアプリを使用すると、持続時間が異なる多数の信号を同じビュー内で同時に扱うことができます。

詳細は、信号アナライザー アプリの使用を参照してください。

スカログラムの表示を使用するには、Wavelet Toolbox™ のライセンスが必要です。

信号アナライザー アプリを開く

  • MATLAB のツールストリップ: [アプリ] タブの [信号処理と通信] でアプリのアイコンをクリックします。

  • MATLAB コマンド プロンプト: signalAnalyzer と入力します。

すべて展開する

標準のデジタル ミュージック シンセサイザーを実装し、3 音声配置で民謡の演奏に使用します。サンプルレートを 2 kHz に指定します。歌曲を MATLAB® の timetable として保存します。

fs = 2e3;
t = 0:1/fs:0.3-1/fs;

l = [0 130.81 146.83 164.81 174.61 196.00 220 246.94];
m = [0 261.63 293.66 329.63 349.23 392.00 440 493.88];
h = [0 523.25 587.33 659.25 698.46 783.99 880 987.77];
note = @(f,g) [1 1 1]*sin(2*pi*[l(g) m(g) h(f)]'.*t);

mel = [3 2 1 2 3 3 3 0 2 2 2 0 3 5 5 0 3 2 1 2 3 3 3 3 2 2 3 2 1]+1;
acc = [3 0 5 0 3 0 3 3 2 0 2 2 3 0 5 5 3 0 5 0 3 3 3 0 2 2 3 0 1]+1;

song = [];
for kj = 1:length(mel)
    song = [song note(mel(kj),acc(kj)) zeros(1,0.01*fs)];
end
song = song'/(max(abs(song))+0.1);

% To hear, type sound(song,fs)

tune = timetable(seconds((0:length(song)-1)'/fs),song);

信号アナライザーを開いて、ワークスペース ブラウザーから信号テーブルに timetable をドラッグします。[グリッドの表示] ▼ をクリックして、2 行 2 列のグリッドの表示を作成します。上の 2 つと左下の表示を選択し、[スペクトル] ボタンをクリックしてスペクトル表示を追加します。右下の表示を選択し、[時間-周波数] をクリックしてスペクトログラムの表示を追加し、[時間] をクリックして時間の表示を削除します。4 つすべての表示に歌曲をドラッグします。右下の表示を選択し、[スペクトログラム] タブで、0.31 秒 (310 ms) の時間分解能、0% の隣接するセグメント間のオーバーラップを指定します。[パワーの範囲] dB と dB に設定します。

[アナライザー] タブで、[複製] を 3 回クリックして歌曲のコピーを 3 つ作成します。信号テーブルの [名前] 列をダブルクリックして、コピーの名前を highmediumlow に変更します。コピーを上の 2 つと左下の表示に移動します。

フィルターを使用して複製信号を前処理します。

  1. high 信号を、信号テーブルで名前をクリックして選択します。[アナライザー] タブの [ハイパス] をクリックします。表示された [ハイパス] タブで 450 Hz の通過帯域周波数を入力し、急峻さを 0.95 に増やします。[ハイパス] をクリックします。

  2. medium 信号を、信号テーブルで名前をクリックして選択します。[アナライザー] タブの [前処理] ▼ をクリックして、[バンドパス] を選択します。表示された [通過帯域] タブで、低域および高域通過帯域周波数としてそれぞれ 230 Hz と 450 Hz を入力します。急峻さを 0.95 に増やします。[バンドパス] をクリックします。

  3. low 信号を、信号テーブルで名前をクリックして選択します。[アナライザー] タブの [ローパス] をクリックします。表示された [ローパス] タブで、230 Hz の通過帯域周波数を入力し、急峻さを 0.95 に増やします。[ローパス] をクリックします。

フィルター処理された信号が含まれる 3 つの表示のそれぞれで次を行います。

  1. 元の信号の名前の隣にあるチェック ボックスをオフにして元の信号を削除します。

  2. [表示] タブの [時間-周波数] をクリックしてスペクトログラムの表示を追加し、[時間] をクリックして時間の表示を削除します。

  3. [スペクトログラム] タブで、0.31 秒の時間分解能を指定し、隣接するセグメント間のオーバーラップとして 0% を指定します。[パワーの範囲] dB と dB に設定します。

フィルター処理された 3 つの信号を、信号テーブルの [名前] 列をクリックして選択します。[アナライザー] タブで [エクスポート] をクリックして信号を music.mat という MAT ファイルに保存します。MATLAB で、ファイルをワークスペースに読み込みます。3 つの信号のスペクトルをプロットします。

load music

pspectrum(low)
hold on
pspectrum(medium)
pspectrum(high)
hold off

% To hear the different voices, type 
% sound(low.Var1,fs), pause(5), sound(medium.Var1,fs), pause(5), sound(high.Var1,fs)

4 kHz でサンプリングされた太平洋のシロナガスクジラのオーディオ データを含むファイルを読み込みます。ファイルは、コーネル大学の生物音響学研究プログラムが管理する動物発声ライブラリのものです。データの時間スケールは、音の高さを上げ鳴き声を聞き取りやすくするために係数 10 で圧縮されています。信号を MATLAB® の timetable に変換します。

whaleFile = fullfile(matlabroot,'examples','matlab','bluewhale.au');
[w,fs] = audioread(whaleFile);

whale = timetable(seconds((0:length(w)-1)'/fs),w);

% To hear, type soundsc(w,fs)

"信号アナライザー" を開いて timetable をディスプレイにドラッグします。ノイズの中で 4 つの特徴が目立っています。最初は "ふるえ声"、他の 3 つは "うめき声" として知られています。

[表示] タブで [スペクトル] をクリックしてスペクトル表示を開き、[パナー] をクリックしてパナーをアクティブにします。パナーを使用して、約 2 秒の幅をもつズーム ウィンドウを作成します。ふるえ声の中央に配置されるように、ズーム ウィンドウをドラッグします。スペクトルによって、900 Hz のあたりに目立ったピークが示されます。

3 つのうめき声を抽出し、そのスペクトルを比較します。

  1. パナーのズーム ウィンドウを最初のうめき声の中央に置きます。スペクトルで 8 つのピークが明瞭に定義されました。これらのピークは、170 Hz の倍数に非常に近い位置にあります。[信号の抽出] ▼ をクリックし、Between Time Limits を選択します。

  2. [パナー] をクリックしてパナーを非表示にします。スペース キーを押して信号全体を表示します。[X 軸方向にズーム イン] をクリックし、時間表示において 2 番目のうめき声が中心の 2 秒間を拡大します。ここでも、170 Hz の倍数の位置にスペクトルのピークがあります。[信号の抽出] ▼ をクリックし、Between Time Limits を選択します。

  3. スペース キーを押して信号全体を表示します。[データ カーソル] ▼ をクリックし、Two を選択します。時間領域のカーソルを 3 番目のうめき声を含む 2 秒間の位置に置きます。ここでも、170 Hz の倍数の位置にピークがあります。[信号の抽出] ▼ をクリックし、Between Time Cursors を選択します。

元の信号をディスプレイから削除するために、信号テーブルで元の信号の名前の隣にあるチェック ボックスをオフにします。抽出した 3 つの関心領域を表示します。それぞれのスペクトルは、お互いのほぼ頂点の位置にあります。周波数領域のカーソルを最初と 3 番目のスペクトル ピークの位置に移動します。カーソル ラベルのアスタリスクは、内挿された信号値を示しています。

オオクビワコウモリ ("Eptesicus fuscus") の発する反響定位パルスを 7 マイクロ秒間隔のサンプリングで測定したデータを含むファイルを読み込みます。信号と時間情報を使用して MATLAB® timetable を作成します。

load batsignal

t = (0:length(batsignal)-1)*DT;
sg = timetable(seconds(t)',batsignal);

信号アナライザーを開いて、ワークスペース ブラウザーから信号テーブルに timetable をドラッグします。[グリッドの表示] ▼ をクリックして、2 つのディスプレイを並べて作成します。各ディスプレイを選択し、[時間-周波数] ボタンをクリックしてスペクトログラム表示を追加します。

両方のディスプレイに timetable をドラッグします。

[スペクトログラム] タブを選択します。右側のディスプレイの [再割り当て] をオンにします。各ディスプレイについて以下を行います。

  • 時間分解能を 280 マイクロ秒に設定し、隣接するセグメント間のオーバーラップとして 85% を指定します。

  • [漏れ] スライダーを使用して、RBW が約 4.5 kHz になるまで漏れを増やします。

  • パワーの範囲を -45 dB と -20 dB に設定します。

再割り当てされたスペクトログラムでは、3 つの時間-周波数リッジが明瞭に表示されます。リッジを追跡するために、右側のディスプレイを選択します。[表示] タブの [スクリプトの生成] をクリックして、Spectrogram Script を選択します。スクリプトがエディターで開きます。

% Compute spectrogram

% Generated by MATLAB(R) 9.3 and Signal Processing Toolbox 7.5.
% Generated on: 13-Jul-2017 19:32:31

% Parameters
timeLimits = seconds([3.805177e-06 0.002796805]); % seconds
frequencyLimits = [0 71428.57]; % Hz
leakage = 0.9;
timeResolution = 0.00028; % seconds
overlapPercent = 85;
reassignFlag = true;

% Index into signal time region of interest
sg_batsignal_ROI = sg(:,'batsignal');
sg_batsignal_ROI = sg_batsignal_ROI(timerange(timeLimits(1),timeLimits(2)),1);

% Compute spectral estimate
% Run the function call below without output arguments to plot the results
[P,F,T] = pspectrum(sg_batsignal_ROI, ...
    'spectrogram', ...
    'FrequencyLimits',frequencyLimits, ...
    'Leakage',leakage, ...
    'TimeResolution',timeResolution, ...
    'OverlapPercent',overlapPercent, ...
    'Reassign',reassignFlag);

スクリプトを実行します。再割り当てされたスペクトログラムをプロットします。

mesh(seconds(T),F,P)
xlabel('Time')
ylabel('Frequency')
axis tight
view(2)
colormap pink

リッジの追跡に関数 tfridge を使用します。

[fridge,~,lridge] = tfridge(P,F,0.01,'NumRidges',3,'NumFrequencyBins',10);

hold on
plot3(seconds(T),fridge,P(lridge),':','linewidth',3)
hold off

この例では、イリノイ大学の Curtis Condon 氏、Ken White 氏、Al Feng 氏にコウモリのデータの提供および使用許可をいただきました。ご協力に謝意を申し上げます。

データが指定した飽和点より大きい場合、センサーはクリップした読み取り値を返します。読み取り値を再構成するために、飽和区間に隣接する点から多項式をあてはめることができます。再構成を実行する関数を記述し、信号アナライザーに組み込みます。

1 kHz で 14 秒間サンプリングされた 3 チャネルの信号を生成します。信号には、さまざまなサイズと形状の複数のピークがあります。信号を読み取るセンサーは、0.1 V で飽和します。

fs = 1000;
t = 0:1/fs:14-1/fs;

sig = [chirp(t-1,0.1,17,2,'quadratic',1).*sin(2*pi*t/5);
    chirp(t-2,2,2,2.1,'quadratic',100).*exp(-(t-6.5).^2/20).*sin(2*pi*t*2);
    0.85*besselj(0,5*(sin(2*pi*(t+1.5).^2/20).^2)).*sin(2*pi*t/9)]';

sigsat = sig;
stv = 0.1;
sigsat(sigsat >= stv) = stv;

信号アナライザーを開いて、元の信号と飽和した信号を信号テーブルにドラッグします。元のチャネルと飽和したチャネルをそれぞれのディスプレイにドラッグします。

多項式を使用する関数を記述して、信号のピークを再構成します。

  • 最初の入力引数 x は、入力信号です。この引数はベクトルでなければならず、単一チャネルとして取り扱われます。

  • 2 番目の入力引数 tIn は、時間値のベクトルです。ベクトルは信号と同じ長さでなければなりません。入力信号に時間情報がない場合、関数はこの引数を空の配列として読み取ります。

  • 追加の入力引数を指定するには、varargin を使用します。追加の入力引数がない場合は、varargin を省略できます。追加の引数は、[前処理] タブに順序付きのコンマ区切りリストとして入力します。

  • 最初の出力引数 y は、前処理済みの信号です。

  • 2 番目の出力引数 tOut は、出力時間値のベクトルです。入力信号に時間情報がない場合、tOut は空の配列として返されます。

  • アルゴリズムを実装するために、MATLAB® 関数または Signal Processing Toolbox™ 関数を使用できます。

function [y,tOut] = declip(x,tIn,varargin)
% Declip saturated signal by fitting a polynomial

    % Initialize the output signal

    y = x;

    % For signals with no time information, use sample numbers as abscissas
    
    if isempty(tIn)
        tOut = [];
        t = (1:length(x))';
    else
        t = tIn;
        tOut = t;
    end
    
    % Specify the degree of the polynomial as an optional input argument
    % and provide a default value of 4
    
    if nargin<3
        ndx = 4;
    else
        ndx = varargin{1};
    end

    % To implement your algorithm, you can use any MATLAB or Signal
    % Processing Toolbox function
    
    % Find the intervals where the signal is saturated and generate an 
    % array containing the interval endpoints
    idx = find(x==max(x)); 
    fir = [true;diff(idx)~=1];
    ide = [idx(fir) idx(fir([2:end 1]))];
    % For each interval, fit a polynomial of degree ndx over the ndx+1 points
    % before the interval and the ndx+1 points after the interval
    for k = 1:size(ide,1)
        bef = ide(k,1); aft = ide(k,2);
        intv = [bef-1+(-ndx:0) aft+1+(0:ndx)];
        [pp,~,mu] = polyfit(t(intv),x(intv),ndx);
        y(bef:aft) = polyval(pp,t(bef:aft),[],mu);
    end

end

関数をカスタム前処理関数として信号アナライザーに追加します。[アナライザー] タブの [前処理] ▼ をクリックして、[カスタム関数の追加] を選択します。関数名と説明を入力します。表示されるエディター ウィンドウに関数のテキストを貼り付けます。ファイルを保存します。関数が前処理ギャラリーに表示されます。

作成した関数が、飽和した領域を再構成することを確認します。

  1. 信号テーブルで、飽和した信号の最初のチャネルを選択します。

  2. [アナライザー] タブの [前処理] ▼ をクリックして、[declip] を選択します。

  3. 表示された [前処理] タブで、[前処理] をクリックします。

信号に時間情報がある場合に前処理関数が機能することを確認します。

  1. 信号テーブルのすべての信号を選択します。

  2. [アナライザー] タブで [時間値] をクリックし、Sample Rate and Start Time を選択して、サンプルレートとして fs を指定します。

  3. 上部パネルの信号は、再構成された領域を含み、時間情報を持ちます。

オプションの入力を指定した場合に関数が機能することを確認します。

  1. 信号テーブルで、飽和した信号の 2 番目と 3 番目のチャネルを選択します。

  2. [前処理] タブで、[引数] フィールドに 8 を入力して、[前処理] をクリックします。前処理関数は次数 8 の多項式を使用して飽和した領域を再構成します。

関連する例

プログラムによる使用

すべて展開する

signalAnalyzer信号アナライザーアプリを開きます。

signalAnalyzer(sig)信号アナライザーアプリを開き、信号 sig をインポートしてプロットします。‎アプリが既に開いている場合は、現在のディスプレイで sig がプロットされます。sig が既にプロットされたが、変更されている場合、関数呼び出しでプロットが更新されます。

sig はワークスペースの変数または MATLAB の式です。sig は以下になります。

  • 各列に独立した信号を含むベクトルまたは行列。

  • 時間値が持続時間として指定された timetable

  • timeseries オブジェクト。

詳細は、信号アナライザーでサポートされるデータ型を参照してください。

既定では、アプリは信号をサンプル インデックスの関数としてプロットします。時間情報を指定した場合、または信号が固有の時間情報をもつ場合、アプリは信号を時間の関数としてプロットします。

signalAnalyzer(sig1,...,sigN) は、N 個の信号ベクトルまたは行列をインポートし、現在のディスプレイでプロットします。アプリは、同じ関数呼び出しによる、固有の時間情報をもつ信号と固有の時間情報をもたない信号のインポートはサポートしません。

signalAnalyzer(___,'SampleRate',fs) は、サンプルレート fs を Hz 単位の正のスカラーとして指定します。アプリはこのサンプルレートを使用し、開始時間をゼロとして 1 つ以上の信号を時間に対してプロットします。固有の時間情報をもたない信号のサンプルレートを指定できます。

signalAnalyzer(___,'SampleTime',ts) は、サンプル時間 ts を秒単位の正のスカラーとして指定します。アプリはこのサンプル時間を使用し、開始時間をゼロとして 1 つ以上の信号を時間に対してプロットします。固有の時間情報をもたない信号のサンプル時間を指定できます。

signalAnalyzer(___,'StartTime',st) は、信号の開始時間 st を秒単位のスカラーとして指定します。サンプルレートまたはサンプル時間を指定しない場合、アプリはサンプルレートを 1 Hz と仮定します。固有の時間情報をもたない信号の開始時間を指定できます。

signalAnalyzer(___,'TimeValues',tv) は、時間値がデータ点に対応するベクトル tv を指定します。tv は秒単位の値をもつ実数の数値ベクトルとして指定できます。tv は配列 duration としても指定できます。tv の値は一意で、NaN にすることはできませんが、その間隔は均一である必要はありません。すべての入力信号は tv と同じ長さでなければなりません。固有の時間情報をもたない信号に、時間値のベクトルを指定できます。

フィルター処理とスカログラム表示は一様にサンプリングされていない信号はサポートしていません。

R2016a で導入