Main Content

MATLAB でのストリーミング信号処理の紹介

MATLAB® では、System object を使用してストリーミング信号を処理します。信号の読み取りと処理は、各処理ループでフレームごと (またはブロックごと) に行われます。各フレームのサイズを制御できます。

この例では、1024 サンプルのフレームを、ノッチピーク フィルターを使用して各処理ループでフィルター処理しています。入力は、dsp.SineWave オブジェクトからフレームごとにストリーミングされる正弦波信号です。フィルターは、dsp.NotchPeakFilter オブジェクトを使用して作成されたノッチピーク フィルターです。各フレームのフィルター処理がスムーズに行われるよう、System object はフレームからフレームへのフィルターの状態を自動的に維持します。

ストリーミング コンポーネントの初期化

正弦波ソースを初期化して、正弦波、正弦波をフィルター処理するノッチピーク フィルター、およびスペクトル アナライザーを生成し、フィルター処理された信号を表示します。入力正弦波は 2 つの周波数 (1 つは 100 Hz、もう 1 つは 1000 Hz) をもちます。2 つの dsp.SineWave オブジェクトを作成します。1 つは 100 Hz 正弦波を生成し、もう 1 つは 1000 Hz 正弦波を生成するオブジェクトです。

Fs = 2500;
Sineobject1 = dsp.SineWave('SamplesPerFrame',1024,...
                     'SampleRate',Fs,'Frequency',100);
Sineobject2 = dsp.SineWave('SamplesPerFrame',1024,...
                     'SampleRate',Fs,'Frequency',1000);

SA = spectrumAnalyzer('SampleRate',Fs,...
    'Method','welch',...
    'AveragingMethod','exponential',...
    'ForgettingFactor',0.1,...
    'PlotAsTwoSidedSpectrum',false,...
    'ChannelNames',{'SinewaveInput','NotchOutput'},'ShowLegend',true);

ノッチピーク フィルターの作成

正弦波信号をフィルター処理する 2 次 IIR ノッチピーク フィルターを作成します。このフィルターのノッチは 750 Hz、Q ファクターは 35 です。Q ファクターが大きくなるほどノッチの 3 dB 帯域幅は狭くなります。ストリーミング中にフィルターのパラメーターを調整すると、スペクトル アナライザーの出力でその効果をすぐに確認できます。

Wo = 750; 
Q  = 35;
BW = Wo/Q;
NotchFilter = dsp.NotchPeakFilter('Bandwidth',BW,...
    'CenterFrequency',Wo, 'SampleRate',Fs);
fvtool(NotchFilter);

{"String":"Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains an object of type line.","Tex":"Magnitude Response (dB)","LaTex":[]}

信号のストリーミングと処理

for ループを作成して、3000 回の反復を実行します。各反復では、正弦波の 1024 サンプル (1 フレーム) をストリーミングして、入力信号の各フレームにノッチ フィルターを適用します。入力信号を生成するために、2 つの正弦波を追加します。結果として得られる信号は 2 つの周波数 (1 つは 100 Hz、もう 1 つは 1000 Hz) をもつ正弦波です。フィルターのノッチは、VecIndex の値に基づいて、100、500、750、1000 Hz のいずれかの周波数に調整されます。フィルターの帯域幅もそれに応じて変化します。ストリーミング中にフィルターのパラメーターを変更すると、スペクトル アナライザーの出力もそれに応じて更新されます。

FreqVec = [100 500 750 1000];
VecIndex = 1;
VecElem = FreqVec(VecIndex);
for Iter = 1:3000
    Sinewave1 = Sineobject1();
    Sinewave2 = Sineobject2();
    Input = Sinewave1 + Sinewave2;
    if (mod(Iter,350)==0)
        if VecIndex < 4 
            VecIndex = VecIndex+1;
        else
            VecIndex = 1;
        end
        VecElem = FreqVec(VecIndex); 
    end
    NotchFilter.CenterFrequency = VecElem;
    NotchFilter.Bandwidth = NotchFilter.CenterFrequency/Q;
    Output = NotchFilter(Input);
    SA(Input,Output);
end

fvtool(NotchFilter)

{"String":"Figure Figure 2: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB) contains an object of type line.","Tex":"Magnitude Response (dB)","LaTex":[]}

処理ループの終了時に、CenterFrequency が 100 Hz になります。フィルター出力では、100 Hz の周波数がノッチ フィルターによって完全に無効化されますが、1000 Hz の周波数は影響を受けません。

参考

| | |