dsp.SineWave
離散正弦波の生成
説明
dsp.SineWave
System object™ は実数または複素数のマルチチャネルの正弦波信号を生成します。各出力チャネルには独立した振幅と周波数および位相があります。
実数正弦波および複素正弦波ともに、Amplitudeプロパティ、FrequencyプロパティおよびPhaseOffsetプロパティをスカラーまたは長さが N のベクトルにすることができます。ここで、N は出力でのチャネル数です。これらのプロパティの少なくとも 1 つを長さが N のベクトルとして指定する場合、他のプロパティに対して指定されたスカラー値は N の各チャネルに対して適用されます。
離散時間正弦波信号を生成するには、次のようにします。
dsp.SineWave
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
説明
は、振幅 1、周波数 100 Hz および位相オフセット 0 で実数値正弦波を生成する正弦波オブジェクトを作成します。既定の設定では、正弦波オブジェクトは 1 つのサンプルのみを生成します。sine
= dsp.SineWave
は指定されたそれぞれのプロパティ セットを指定された値に設定して、正弦波オブジェクトを作成します。各プロパティ名を一重引用符で囲みます。 sine
= dsp.SineWave(Name,Value
)
例: sine = dsp.SineWave('Amplitude',2);
は、Amplitudeプロパティが sine
= dsp.SineWave(amp,freq,phase,Name,Value
)amp
、Frequencyプロパティが freq
、PhaseOffsetプロパティが phase
、他の指定のプロパティが指定の値に設定された正弦波オブジェクトを作成します。
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release
を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
Amplitude
— 正弦波の振幅
1
(既定値) | スカラー | ベクトル
正弦波の振幅。次のいずれかを指定します。
scalar –– スカラーがすべてのチャネルに適用されます。
vector –– 長さ N のベクトルに、N 個の出力チャネルそれぞれの正弦波の振幅が含まれます。ベクトルの長さはFrequencyプロパティとPhaseOffsetプロパティで指定した長さと同じでなければなりません。
調整可能: Yes
依存関係
このプロパティは、Methodを 'Trigonometric function'
または 'Differential'
に設定した場合にのみ調整可能です。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Frequency
— 正弦波の周波数
100
(既定値) | スカラー | ベクトル
正弦波の周波数 (Hz 単位)。次のいずれかを指定します。
scalar –– スカラーがすべてのチャネルに適用されます。
vector –– 長さ N のベクトルに、N 個の出力チャネルそれぞれの正弦波の周波数が含まれます。ベクトルの長さはAmplitudeプロパティとPhaseOffsetプロパティで指定した長さと同じでなければなりません。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
PhaseOffset
— 正弦波の位相オフセット
0
(既定値) | スカラー | ベクトル
ComplexOutput
— 波形が実数または複素数のどちらであるかを示すフラグ
false
(既定値) | true
波形が実数か複素数かを示すフラグ。次のいずれかを指定します。
false
–– 波形出力は実数です。true
–– 波形出力は複素数です。
Method
— 正弦波の生成に使用する手法
'Trigonometric function'
(既定値) | 'Table lookup'
| 'Differential'
正弦波を生成するために使用される手法。次のいずれかを指定します。
'Trigonometric function'
–– オブジェクトは、連続時間関数をサンプリングして正弦波を計算します。'Table lookup'
–– オブジェクトはシミュレーションの開始時に各出力正弦波の一意のサンプルを事前計算し、必要に応じてサンプルをメモリから呼び出します。'Differential'
–– オブジェクトはインクリメンタル アルゴリズムを使用します。このアルゴリズムは、前のサンプル時間で計算された出力値と事前計算された更新項目に基づいて出力サンプルを計算します。
TableOptimization
— 速度またはメモリに対する正弦値テーブルの最適化
'Speed'
(既定値) | 'Memory'
速度またはメモリに対する正弦値テーブルの最適化。次のいずれかに指定します。
'Speed'
–– テーブルに k 要素が含まれます。この k は正弦波の 1 完全周期での入力サンプル数です。各正弦波の期間は 1/Fs の整数倍でなければなりません。ここで、Fs はSampleRateプロパティの値です。つまり、Frequencyプロパティの各要素は Fs/m の形式でなければなりません。ここで m は1
より大きい整数です。'Memory'
–– テーブルに k/4 要素が含まれます。
依存関係
このプロパティは、Method
プロパティを 'Table lookup'
に設定した場合にのみ適用されます。
SampleRate
— 出力信号のサンプル レート
1000
(既定値) | 正のスカラー
出力信号のサンプル レート (Hz 単位)。正のスカラーで指定します。
例: 44100
例: 22050
SamplesPerFrame
— フレームあたりのサンプル数
1
(既定値) | 正の整数
出力フレームにバッファリングする、各正弦波からの連続するサンプル数。正の整数として指定します。
例: 1000
例: 5000
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
OutputDataType
— 正弦波出力のデータ型
'double'
(既定値) | 'single'
| 'Custom'
正弦波出力のデータ型。'double'
、'single'
、または 'Custom'
として指定します。
CustomOutputDataType
— 出力の語長と小数部の長さ
numerictype([],16)
(既定値) | numerictype([],32,30)
出力の語長と小数部の長さ。語長が 16 の自動符号付きの数値型に指定します。
例: numerictype([],32,30)
例: numerictype([],16,15)
依存関係
このプロパティは、Methodプロパティを 'Table lookup'
、OutputDataTypeプロパティを 'Custom'
に設定した場合にのみ適用されます。
使用法
出力引数
sineOut
— 正弦波出力
ベクトル | 行列
正弦波出力。ベクトルまたは行列で返されます。SamplesPerFrameプロパティによって、出力行列の行数が決まります。FrequencyプロパティまたはPhaseOffsetプロパティがベクトルの場合、ベクトルの長さで出力行列の列 (チャネル) の数が決まります。Frequency
プロパティまたは PhaseOffset
プロパティがスカラーの場合、出力行列のチャネル数は 1 になります。
OutputDataTypeプロパティは、出力データ型を設定します。
データ型: single
| double
| fi
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
正弦波信号の生成
振幅 2、周波数 10 Hz および初期位相 0 で正弦波を生成します。
sine1 = dsp.SineWave(2,10); sine1.SamplesPerFrame = 1000; y = sine1(); plot(y)
pi/2 ラジアンの位相で 2 つの正弦波オフセットを生成します。
sine2 = dsp.SineWave; sine2.Frequency = 10; sine2.PhaseOffset = [0 pi/2]; sine2.SamplesPerFrame = 1000; y = sine2(); plot(y)
MATLAB でのノイズを含む正弦波信号フレームのフィルター処理
この例では、ノイズを含む信号を MATLAB® でローパス フィルター処理する方法、およびスペクトル アナライザーを使用して元の信号とフィルター処理された信号を可視化する方法を説明します。この例の Simulink® バージョンについては、Simulink でのノイズを含む正弦波信号フレームのフィルター処理を参照してください。
信号ソースの指定
入力信号は、周波数が 1 kHz と 10 kHz の 2 つの正弦波の和です。サンプリング周波数は 44.1 kHz です。
Sine1 = dsp.SineWave('Frequency',1e3,'SampleRate',44.1e3); Sine2 = dsp.SineWave('Frequency',10e3,'SampleRate',44.1e3);
ローパス フィルターの作成
ローパス FIR フィルター dsp.LowpassFilter
は、一般化された Remez FIR フィルター設計アルゴリズムを使用して、最小次数の FIR ローパス フィルターを設計します。通過帯域周波数を 5000 Hz に設定し、阻止帯域周波数を 8000 Hz に設定します。通過帯域リップルは 0.1 dB、阻止帯域の減衰量は 80 dB です。
FIRLowPass = dsp.LowpassFilter('PassbandFrequency',5000,... 'StopbandFrequency',8000);
Spectrum Analyzer の作成
Spectrum Analyzer を設定して、元の信号とフィルター処理された信号のパワー スペクトルを比較します。スペクトルの単位は dBm です。
SpecAna = spectrumAnalyzer('PlotAsTwoSidedSpectrum',false,... 'SampleRate',Sine1.SampleRate,... 'ShowLegend',true, ... 'YLimits',[-145,45]); SpecAna.ChannelNames = {'Original noisy signal',... 'Lowpass filtered signal'};
フレームあたりのサンプル数の指定
この例では、一度に 1 フレームずつデータを処理する、フレームベースの処理を使用します。データの各フレームには独立チャネルからの連続サンプルが含まれます。フレームベースの処理では、複数のサンプルを一度に処理できるため、多くの信号処理アプリケーションで有利です。データをフレームにバッファリングしてマルチサンプルのデータ フレームを処理することにより、信号処理アルゴリズムの計算時間を改善できます。フレームあたりのサンプル数を 4000 に設定します。
Sine1.SamplesPerFrame = 4000; Sine2.SamplesPerFrame = 4000;
ノイズを含む正弦波信号のフィルター処理
標準偏差 0.1 でゼロ平均のホワイト ガウス ノイズを正弦波の和に付加します。FIR フィルターを使用して結果をフィルター処理します。シミュレーションの実行中に、Spectrum Analyzer には、ソース信号の 8000 Hz を超える周波数が減衰することが示されます。1 kHz のピークはローパス フィルターの通過帯域にあるため、結果の信号はこれを維持しています。
for i = 1 : 1000 x = Sine1()+Sine2()+0.1.*randn(Sine1.SamplesPerFrame,1); y = FIRLowPass(x); SpecAna(x,y); end release(SpecAna)
正弦波のバンドパス フィルター処理
周波数が 1 kHz、10 kHz、および 15 kHz の 3 つの正弦波で構成される離散時間正弦波信号のバンドパス フィルター処理を行います。
最初にバンドパス フィルター設計仕様オブジェクトを作成し、次いでその仕様を使用してフィルターを設計することで、FIR 等リップル バンドパス フィルターを設計します。
バンドパス フィルターの設計
fdesign.bandpass
を使用して、バンドパス フィルター設計仕様オブジェクトを作成します。
bandpassSpecs = fdesign.bandpass('Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2', ... 1/4,3/8,5/8,6/8,60,1,60);
このオブジェクトの使用可能な設計法を示します。
designmethods(bandpassSpecs)
Design Methods for class fdesign.bandpass (Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2): butter cheby1 cheby2 ellip equiripple kaiserwin
等リップル フィルターを設計するには、'equiripple'
を選択します。
bpFilter = design(bandpassSpecs,'equiripple','Systemobject',true)
bpFilter = dsp.FIRFilter with properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator: [-0.0043 -3.0812e-15 0.0136 3.7820e-15 -0.0180 -4.2321e-15 7.1634e-04 4.0993e-15 0.0373 -4.1057e-15 -0.0579 3.7505e-15 0.0078 -3.4246e-15 0.1244 2.4753e-15 -0.2737 -8.6287e-16 0.3396 -8.6287e-16 -0.2737 ... ] (1x37 double) InitialConditions: 0 Use get to show all properties
設計したフィルターの周波数応答を可視化します。
fvtool(bpFilter,'Fs',44100)
正弦波信号の作成
1 kHz、10 kHz、および 15 kHz の周波数をもつ 3 つの正弦波の和である信号を作成します。スペクトル アナライザーを初期化し、元の信号とフィルター処理された信号を表示します。
Sine1 = dsp.SineWave('Frequency',1e3,'SampleRate',44.1e3,'SamplesPerFrame',4000); Sine2 = dsp.SineWave('Frequency',10e3,'SampleRate',44.1e3,'SamplesPerFrame',4000); Sine3 = dsp.SineWave('Frequency',15e3,'SampleRate',44.1e3,'SamplesPerFrame',4000); SpecAna = spectrumAnalyzer('PlotAsTwoSidedSpectrum',false, ... 'SampleRate',Sine1.SampleRate, ... 'ShowLegend',true, ... 'YLimits',[-240,45]); SpecAna.ChannelNames = {'Original noisy signal','Bandpass filtered signal'};
正弦波信号のフィルター処理
設計したバンドパス フィルターを使用して正弦波信号をフィルター処理します。元の信号とフィルター処理された信号をスペクトル アナライザーで表示します。1 kHz のトーンはフィルターで除外され、減衰します。10 kHz のトーンは影響を受けず、15 kHz のトーンはフィルターの遷移帯域に現れるため、少し減衰します。
for i = 1:5000 x = Sine1()+Sine2()+Sine3(); y = bpFilter(x); SpecAna(x,y); end release(SpecAna)
詳細
正弦波
実数値の離散時間正弦波は次のように定義します。
ここで A は振幅、f は周波数 (Hz 単位)、φ は初期位相または位相オフセット (ラジアン単位) です。
複素正弦波は次のように定義されます。
アルゴリズム
三角関数
三角関数法は、以下の連続関数をサンプリングすることによって i 番目のチャネル yi にある正弦波を計算します。
周期は Ts を使用します。Ts はサンプル時間で指定します。
各サンプル時間で、アルゴリズムは正弦波の "最初のサイクル内" の適切な時間値で正弦波関数を評価します。三角評価を各正弦波の最初のサイクルに制限することにより、アルゴリズムは非常に大きな数値の正弦波を計算するときに生じる不正確さを回避します。この制約は、絶対時間変数がオーバーフローする可能性があるときに、拡張演算中に不連続が発生する可能性も除去します。したがって、テーブル ルックアップ法に必要なメモリを回避しますが、より多くの浮動小数点演算の負荷がかかります。
テーブル ルックアップ
テーブル ルックアップ法はシミュレーションの開始時に各出力正弦波の "一意の" サンプルを事前計算し、必要に応じてサンプルをメモリから呼び出します。有限長のテーブルはすべての出力シーケンスが繰り返されるときにのみ作成できるため、この手法では出力の各正弦波の周期をサンプル周期で等分割できる必要があります。すなわち、1/(fiTs) = ki は各チャネル i = 1, 2, ..., N について整数値でなければなりません。
アルゴリズムが Speed
の正弦値のテーブルを最適化すると、各チャネルに作成したテーブルには ki 要素が含まれます。最適化が Memory
を対象としている場合、各チャネルに作成したテーブルには ki/4 要素が含まれます。
長い出力シーケンスの場合、テーブル ルックアップ法に必要となる浮動小数点演算は他のどの手法よりもはるかに少なくなります。ただし、この方法では、特に高いサンプル レート (長いテーブル) の場合に非常に大量のメモリが要求されます。この手法は DSP ハードウェアのコードのエミュレートまたは生成を目的としたモデルに推奨され、実行速度を最適化する必要があります。
メモ
このオブジェクトのルックアップ テーブルは倍精度浮動小数点値から作成されます。したがって、Table Lookup
計算モードを使用する場合、出力で得られる精度の最大量は 53 ビットです。出力データ型の語長を 53 ビットより大きい値に設定しても出力の精度は上がりません。
微分
微分法はインクリメンタル アルゴリズムを使用します。このアルゴリズムは、次の恒等式を使用して、前のサンプル時間 (および事前計算された更新項目) で計算された出力値に基づいて出力サンプルを計算します。
したがって、i 番目のチャネルの正弦波の更新方程式 yi は行列形式で次のように記述することができます。
Ts はサンプル時間で指定します。Ts は定数のため、右側の行列は定数となり、シミュレーションの開始時に 1 回計算できます。その後、各タイム ステップでの単純な行列の乗算によって、Aisin[2πfi(t+Ts)+ϕi] の値を sin(2πfit+ϕi) と cos(2πfit+ϕi) の値から計算します。
このモードでは計算負荷が減少しますが、累積量子化誤差により、時間の経過と共にドリフトする可能性があります。この手法は絶対時間値に依存しないので、絶対時間変数がオーバーフローする可能性がある場合、拡張演算中に不連続が発生する危険性はありません。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
このオブジェクトには、コード生成で調整可能なプロパティはありません。
MATLAB コード生成における System object (MATLAB Coder)を参照してください。
バージョン履歴
R2012a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)