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);

Figure Figure 1: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

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

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)

Figure Figure 2: Magnitude Response (dB) contains an axes object. The axes object with title Magnitude Response (dB), xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

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

参考

| | |