低域通過フィルタについて

Trace_1.mat ( 横軸:時間(s)、縦軸:電圧値(V)のデータ ) に
理想的な低域通貨フィルタ (周波数が10MHz以下なら利得あり、10MHzより大きければ利得0) をかけたいです。
そこで、 matlabのコマンドウィンドウにて、「y = lowpass(Trace_1,10e+6)」とプログラムを入力しましたが、「関数 'lowpass' (タイプ'double' の入力引数) が未定義です。」というエラーが出てきました。どのようにコマンドを入力すれば低域通過フィルタがかけられますか?ご回答頂けたら幸いです。

 Accepted Answer

Shoumei
Shoumei on 30 Oct 2019

1 vote

なんでimbinarizeなどが必要なのかわかりませんが、フィルタの使い方が間違っているのが原因です。
まず、理想的なフィルタは存在しません。LPFであれば通過帯域から遮断帯域までの肩特性は斜めに下がっていきますし、遮断帯域の信号の振幅は0にはなりません。
Junyaさんのデータは、1列目が時間軸データ、2列目が振幅データとなっているようですが、lowpassコマンドの1つ目の引数に時間軸データは必要ありませんので、振幅データのみを入力する必要があります。
信号は10MHzの信号と高調波ノイズで構成されているようですが、この高調波ノイズを除去したいのでしょうか?このように書くと良いのでは?
% 入力信号を表示
subplot(2,1,1),plot(Trace_1(:,1), Trace_1(:,2))
% フィルタリング
y = lowpass(Trace_1(:,2),10^6,10^7);
% フィルタリングされた信号を表示
subplot(2,1,2),plot(Trace_1(:,1), y)
フィルタの特性を理想に近づけたく、肩特性を急峻にしたい場合はSteepnessパラメータを1に近い値にします。
y = lowpass(Trace_1(:,2),10^6,10^7, 'ImpulseResponse','iir','Steepness',0.96);
subplot(2,1,2),plot(Trace_1(:,1), y)
使い方はドキュメントに載っているのでドキュメントをよく読みましょう。
doc lowpass

1 Comment

N/A
N/A on 31 Oct 2019
ご回答頂きありがとうございます。
R2018aでプログラムを実行したところ、「関数 'lowpass' (タイプ'double' の入力引数) が未定義です。」というエラーが消え、LPFにかけることが出来ました。

Sign in to comment.

More Answers (1)

Yoshio
Yoshio on 29 Oct 2019

1 vote

lowpass のドキュメントを参考に、Trace_1.mat の中から電圧波形データを取り出して、lowpassの関数に入力しましょう。今の場合
y = lowpass(x,fpass,fs) は、xfs Hz のレートでサンプリングするよう指定します。fpass は Hz 単位でのフィルターの通過帯域周波数です。
を使うのが便利そうです。

5 Comments

N/A
N/A on 29 Oct 2019
ご回答頂きありがとうございます。
y = lowpass(Trace_1,10^6,10^7)
plot(y)
とmatlabのコマンドウィンドウに入力してみましたが、plot(y)の縦軸は0になりませんでした。Trace_1.mat は10MHzのsin波を5周期分とったものなので、1MHzのlowpassfilterをかければ、plot(y)の縦軸は0になると思います。どのようにプログラムを修正すればTrace_1にlowpassfilterをかけることが出来ますか?
Yoshio
Yoshio on 29 Oct 2019
>> whos
Name Size
Trace_1 1000x2
となっているので、一列めは、時間軸データ、電圧波形データは二列目と思われます。この場合、
y = lowpass(Trace_1,10^6,10^7)
は正しいフィルタ処理になっていません。サンプリング周波数を確認してみてください。
N/A
N/A on 30 Oct 2019
ご回答頂きありがとうございます。
標本化の定理を満たすように、サンプリング周波数をsin波 (10MHz) の2倍以上になるように設定し直してみました。
z = Trace_1;
x = imbinarize(z);
x = double(x);
y = lowpass(x(:,2),10^6,10^8);
とmatlabのコマンドウィンドウに入力してみましたが、「関数 'lowpass' (タイプ'double' の入力引数) が未定義です。」というエラーが出てきました。どのように修正すればエラーがなくなり、1MHzのlowpassfilterにかけることが出来ますか?
Yoshio
Yoshio on 30 Oct 2019
Edited: Yoshio on 30 Oct 2019
コマンドウィンドウに
which lowpass
と入れて、何が帰ってきますか?
なお y = lowpass(x,fpass,fs) のfsは、信号xのサンプル周波数ですでに決まっていますから、
t = Trace_1(:,1);
x = Trace_1(:,2);
fs = 1/(t(2)-t(1))
fs =
2.0000e+09
すなわち、2GHzを設定すべきだと思います。
plot(t,x)
でプロットして、正しく信号が10Mzの正弦波であることを確認してみてください。
N/A
N/A on 31 Oct 2019
ご回答頂きありがとうございます。
% 入力信号を表示
subplot(2,1,1),plot(Trace_1(:,1), Trace_1(:,2))
% フィルタリング
y = lowpass(Trace_1(:,2),10^6,2e+9, 'ImpulseResponse','iir','Steepness',0.999);
% フィルタリングされた信号を表示
subplot(2,1,2),plot(Trace_1(:,1), y)
というプログラムをR2018aで実行したところエラーが出ませんでしたが,R2017aとR2016bで実行したところ、「関数 'lowpass' (タイプ'double' の入力引数) が未定義です。」というエラーがでました。R2018aにてコマンドウィンドウにwhich lowpassで検索したところ、「C:\Program Files\MATLAB\R2018a\toolbox\signal\signal\lowpass.m」と帰ってきたので、R2017aとR2016bにはlowpass関数自体が入ってないと思われます。
また、plot(t,x)でプロットしたところ、1周期あたりの時間が0.1μsだったので10MHzの正弦波であると思います。

Sign in to comment.

Products

Release

R2017a

Asked:

N/A
on 29 Oct 2019

Commented:

N/A
on 31 Oct 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!