このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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);
信号のストリーミングと処理
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)
処理ループの終了時に、CenterFrequency
が 100 Hz になります。フィルター出力では、100 Hz の周波数がノッチ フィルターによって完全に無効化されますが、1000 Hz の周波数は影響を受けません。
参考
MATLAB でのノイズを含む正弦波信号フレームのフィルター処理 | Simulink でのノイズを含む正弦波信号フレームのフィルター処理 | Simulink でのローパス IIR フィルター設計 | Multirate Filtering in MATLAB and Simulink