Scilabで連続ウェーブレット変換-8 (縦軸を周波数,横軸を時間に)

こんにちは。
今回は、周波数の軸をもう少し見やすくして、さらに横軸を時間軸に変更します。
前回の表示ですと、周波数の軸が、無駄に桁数が長く表示されていました。そこで、有効数字で丸めてみます。
また、横軸がSample数のままでしたので、時間軸に変更します。

//関数定義
//Matplot_with_axes(data,rect)
// data : 画像化する行列
// rect : [xmin,ymin,xmax,ymax] X軸、Y軸の最小値、最大値を指定(省略可)
function Matplot_with_axes(data,rect)
if argn(2)<2 then rect=[1,1,size(data,2),size(data,1)],end
rectx=(rect(3)-rect(1))/(size(data,2)-1)/2;
recty=(rect(4)-rect(2))/(size(data,1)-1)/2;
rect=[rect(1)-rectx,rect(2)-recty,rect(3)+rectx,rect(4)+recty];
Matplot1(data($:-1:1,:),rect);

ca = gca();
ca.data_bounds = matrix(rect,2,2)';
ca.tight_limits = "on";
ca.axes_visible = ["on" "on" "off"];
ca.axes_reverse = ["off" "on" "off"];
// ca.x_location="top";
endfunction




//ウェーブレット関数
wname = 'cmor';

//サンプリング周波数
fs=100;

//周波数の有効数字
sig_figs=3;

//時間軸生成
t = [0:1/fs:10];

//データ生成
x=sin((2*%pi.*(t)).*t);
x=x+x($:-1:1);

// スケーリング列
scales = 2^[1:1/8:6];
coef=cwt(x,scales,wname);

//ウェーブレット係数を画像に変換
cmap_n=512;
cmap=jetcolormap(cmap_n);
n2=int(abs(coef)/max(abs(coef))*(cmap_n-1)+1);

//表示
scf(0);clf;f=gcf();f.color_map=cmap;
Matplot_with_axes(n2,[t(1),1,t($),size(scales,2)]);

xlabel("Time[s]");
ylabel("Frequency[Hz]");

//Y軸を変更する
//scales_ticks=find(fix(scales)==scales)'; //切りが良い数値のみ抜出し
scales_ticks=[1:2:size(scales,2)]'; //切りが良い数値のみ抜出し

a=gca(); //AXISを取得
yticks=a.y_ticks; //Y軸を取得
yticks.locations=scales_ticks; //位置を指定
freqs_=scal2frq(scales(scales_ticks)',wname,1/fs); //スケールを周波数に変換
//有効数字にまるめる
tmp_sig=10^(sig_figs-1);tmp=10^floor(log10(freqs_));freqs=(round(freqs_./tmp*tmp_sig)/tmp_sig).*tmp;
yticks.labels=string(freqs); //表示する内容を指定
a.y_ticks=yticks;


l2.jpg



見栄えの問題だけですが、見やすくなりました。

以前に Scilabで行列の内容を画像化する で紹介した、Matplot1を使って軸の最大・最小値を指定できる自作関数を使っています。
横軸を時間で表示できるようになりました。
縦軸は、有効数字3桁でまるめる処理を行っています。まるめたら見やすくなったので、表示を密にしてみました。
スポンサーサイト

Scilabで連続ウェーブレット変換-7 (縦軸を周波数にする)

こんにちは。
今回は、前回に引き続いて、さらに縦軸を修正して見ます。

縦軸の表示をスケールから周波数に変えて見ましょう。

//ウェーブレット関数
wname = 'cmor';

//サンプリング周波数
fs=100;

//時間軸生成
t = [0:1/fs:10];

//データ生成
x=sin((2*%pi.*(t)).*t);
x=x+x($:-1:1);

// スケーリング列
scales = 2^[1:1/8:6];
coef=cwt(x,scales,wname);

//ウェーブレット係数を画像に変換
cmap_n=512;
cmap=jetcolormap(cmap_n);
n2=int(abs(coef)/max(abs(coef))*(cmap_n-1)+1);

//表示
scf(0);clf;f=gcf();f.color_map=cmap;
ca=gca();
ca.axes_reverse(2)="on";
ca.tight_limits = "on";
Matplot(n2($:-1:1,:));

xlabel("Samples");
ylabel("Scale");

//Y軸を変更する
scales_ticks=find(fix(scales)==scales)'; //切りが良い数値のみ抜出し

a=gca(); //AXISを取得
yticks=a.y_ticks; //Y軸を取得
yticks.locations=scales_ticks; //位置を指定
yticks.labels=string(scal2frq(scales(scales_ticks)',wname,1/fs)); //表示する内容を指定
a.y_ticks=yticks;


k.jpg

プログラムは前回から1行変わっているだけです。scal2frqを足しました。
ウェーブレットの周波数が中途半端なので、半端な表示になりますが、わかりやすくなったのはないでしょうか。

Yahoo!知恵袋で回答した質問まとめ

Yahoo!知恵袋には、ちょこちょこScilabについて質問がでるので、わかる範囲で回答しています。
最近回答した質問をまとめます。


ScilabについてScilabで極座標表示を点でプロットしようとしています。
polarplotの使い方について。styleの使い方は、Scilabのplot系の関数は共通しています。


scilabを使って、波形に20Hzのハイパスフィルタをかけたいのです
これはちょっとがんばって調べてコードを書きました。FIRフィルタの使い方は覚えといて損はないですね。


scilabでグラフの軸レンジの指定
これは過去にも同様な質問がありました。gca()でプロパティを設定します。


Scilab-5.4.1でparam3d1を使って3つの曲線を描きたい
color関数を誤って使っていたようでした。Scilabは関数名が安易なものが多く、意図せず変数名に使わないよう注意が必要です。


Scilabプログラミングについて. forの文を使って変数名を自動的に作りたい.
execstrを使った例。evstrや、evalなど、似たような機能を持った関数が複数ありますが、いまいち使い分けがわかりません。

Scilabのplot2dで、y軸のグリッド(横線)だけ表示させる方法

問題18(川を渡る船)をScilabで書いたのですが、うまくいきません。
MATLABプログラムをScilabプログラムに書き換えてほしいです。
上記2つは、微分方程式の問題でした。このプログラムは結構おもしろかったです。


関数内で変更された値を外に教えたい
変数のスコープについて。Scilabのスコープはわかりにくいと思います。

Scilabでtextファイルを入力するとき"read"を使えばいいと思いますが区間を区切って入力する仕方がわかりません。
ScilabのCSVを読む関数はもうちょっと高機能になると良いのですね。

1列目と3列目を入れ替えるようなコマンド

Scilabのcsv_Writeで配列データを書き出しエクセルで 読み込むと値と値の間に空白の行が出来てしまいます。
これは、バグでした。BugTrackerに登録しておきましたが、すでに登録されていたようです。

scilabで2軸のグラフを描く方法はないのでしょうjか?

一つのプロットに二つのグラフを表示するにはどうしたらいいでしょうか?

scilabで大きなデータの表示
Matplotは大きなデータを表示しきれないので不便です。うまくデータ量をへらしてやらなければなりません。

Scilabについてわからない点があれば、
このブログに関係する質問は、コメント欄に記入していただければ回答しますが、
それ以外のScilab全般に関することは、知恵袋に質問していただいたほうが、私としても回答しやすいので助かります。

Scilabで連続ウェーブレット変換-6 (縦軸を修正する)

こんにちは。
今回は、表示を修正します。

前回の表示は、縦軸に表示されている数値は、実際とは関係ない数値になっていました。
スケールを2の冪乗で定義したため、線形で表示されている軸と合わなくなったためです。
そこで、Scilabの機能を使い、縦軸を修正してみます。

//ウェーブレット関数
wname = 'cmor';

//サンプリング周波数
fs=100;

//時間軸生成
t = [0:1/fs:10];

//データ生成
x=sin((2*%pi.*(t)).*t);
x=x+x($:-1:1);

// スケーリング列
scales = 2^[1:1/8:6];
coef=cwt(x,scales,wname);

//ウェーブレット係数を画像に変換
cmap_n=512;
cmap=jetcolormap(cmap_n);
n2=int(abs(coef)/max(abs(coef))*(cmap_n-1)+1);

//表示
scf(0);clf;f=gcf();f.color_map=cmap;
ca=gca();
ca.axes_reverse(2)="on";
ca.tight_limits = "on";
Matplot(n2($:-1:1,:));

xlabel("Samples");
ylabel("Scale");

//Y軸を変更する
scales_ticks=find(fix(scales)==scales)'; //切りが良い数値のみ抜出し

a=gca(); //軸を取得
yticks=a.y_ticks; //Y軸を取得
yticks.locations=scales_ticks; //位置を指定
yticks.labels=string(scales(scales_ticks)'); //表示する内容を指定
a.y_ticks=yticks;



j.jpg


gca() を実行することで、現在表示しているグラフのプロパティを取得できます。
その中身を変更することで、グラフの見栄えを変更できます。
Y軸の数値は、yticks.locationsとyticks.labelsで変更できます。
これらは2つ同時に変更しないといけないので、一度別の変数に格納してから代入します。


今回はこれくらいで。
しばらく表示をいじっていこうと思います。実データ解析にたどりつくのは、まだ少しかかりそうです。
全記事表示リンク

全ての記事を表示する

最新記事
最新コメント
最新トラックバック
カテゴリ
検索フォーム
RSSリンクの表示
リンク