スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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桁でまるめる処理を行っています。まるめたら見やすくなったので、表示を密にしてみました。
スポンサーサイト

コメントの投稿

非公開コメント

scalesの設定方法

大変参考になり助かります。
ただ、scalesをどの様に設定したら良いかわからず困っています。
ヘルプでもscale vectorとしか書かれていません。

書き込みありがとうございます。

scaleについては、よく質問があります。

scaleは、ウェーブレットの大きさを指定するものです。
大きくすると低周波を検出し、小さいと高周波です。

ウェーブレット関数によって違うのですが、上のサンプルで使っているcmorでは、scale=1でサンプリング周波数と同じになります。scale=2とするとナイキスト周波数を指しています。scale=4でナイキスト周波数のさらに半分の周波数になります。

また、scaleは、対数にするのが一般的です。

scales = 2^[1:1/8:6];

上記の部分で、scaleが、2から64までで、対数軸となるように指定しています。1/8としているのは刻みです。
上記では、サンプリング周波数が100Hzなので、ウェーブレットは、50〜1.56Hzを指定していることになります。

久々なので、間違っている部分があるかもしれませんが、ご参考になれば。

プログラムのエラー

現在ウェーブレット変換について勉強しているため,
参考にさせていただいています.

上記のプログラムを実行してみたところ

coef=cwt(x,scales,wname);
!--error 4
変数は定義されていません: cwt

という表示が出ます.
Scilabに関する知識も浅いため解決方法が分かりません.
教えていただけると幸いです.

Re: プログラムのエラー

ツールボックスが入ってないからではないでしょうか。

下記を参考にしてください。

http://hotic.blog129.fc2.com/blog-entry-14.html

No title

ツールボックスをインストールしたところ
プログラムを実行することができました.

親切な回答をくださりありがとうございました.
全記事表示リンク

全ての記事を表示する

最新記事
最新コメント
最新トラックバック
カテゴリ
検索フォーム
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。