目次へのリンク
概要
MATLABで記述したプログラムから実行結果のレポートを生成(パブリッシュ)することができます。コードを共有する際に便利です。
レポートには実行プログラムやコメント、数式、実行結果の出力やfigureなどを含めることができます。
より直感的にレポートタイプのプログラムを記述する場合はライブスクリプトがおすすめです。
(この投稿もライブスクリプトを使って記述しています)
対応ファイル:I1_05_publish_butter.m
パブリッシュする対象を確認
パブリッシュする対象のMATLABプログラムを確認します。
type I1_05_publish_butter.m
%% バタワースフィルタの設計とフィルタリング
% 本デモは、雑音を加えた2トーン正弦波に対して、バタワースローパスフィルタを
% かける手順と、グラフの可視化の手順を示します。一般的なデジタルフィルタの
% 伝達関数は以下の表現で表わされます。
%
% $$ H(z) = \frac{\sum^{N}_{k = 0}b_kZ^{-k}}{1 + \sum^{N}_{k = 1}a_kZ^{-k}} $$
%% 初期化
clear all, close all, clc
%% フィルタリング対象の信号生成
Fs = 1000;
t = 0:1/Fs:1; % 時間ベクトルの定義
sig1 = sin(2*pi*15*t + pi/3); % 正弦波信号1の生成
sig2 = sin(2*pi*42*t + pi/5); % 正弦波信号2の生成
noise = randn(size(t)); % 雑音信号の生成
sig = sig1 + sig2 + noise; % フィルタリング対象信号
%% フィルタ設計と特性の可視化
% フィルタの次数を7次、ナイキスト周波数で正規化されたカットオフ
% 周波数を0.1としたフィルタを設計します。Fs = 1000[Hz]の場合、
% カットオフ周波数は、1000/2 * 0.1 = 50[Hz]となります。
[b,a] = butter(7,0.1); % バタワースフィルタ設計
fvtool(b, a) % フィルタ特性の可視化
%% フィルタリング
out = filter(b,a,sig); % フィルタリング
% 入力信号と出力信号の時間軸波形可視化
subplot(2,1,1), plot(t,sig), grid
title('時間軸波形(フィルタリング前)')
subplot(2,1,2), plot(t,out), grid
title('時間軸波形(フィルタリング後)')
%% スペクトル推定
% ローパスフィルタにより、50[Hz]以下の成分が除去されている様子が
% 確認できます。
figure, periodogram(sig,[],[],Fs) % 入力信号のスペクトル
title('パワースペクトル密度推定(フィルタリング前)')
figure,periodogram(out,[],[],Fs) % 出力信号のスペクトル
title('パワースペクトル密度推定(フィルタリング後)')
% Copyright 2014 The MathWorks, Inc.
パブリッシュを実行
MATLABコードを実行し、HTML形式のレポートを生成します。
ワード形式(.doc)、LaTeX形式(.tex)、パワーポイント形式(.ppt)、XML形式(.xml)、PDF形式(.pdf)でも出力することができます。
publish("I1_05_publish_butter.m");
生成したHTMLのレポートを確認
MATLAB内蔵のブラウザで生成されたHTMLレポートを確認します。
web(fullfile('html','I1_05_publish_butter.html'));
MATLABエディターによるパブリッシュ
MATLABエディター上からパブリッシュを実行することもできます。
edit I1_05_publish_butter.m
パブリッシュされたHTMLからコードを取り出し
生成したHTMLコードからコードを取り出すことも可能です。
code = grabcode(fullfile('html','I1_05_publish_butter.html'))
code =
'%% バタワースフィルタの設計とフィルタリング
% 本デモは、雑音を加えた2トーン正弦波に対して、バタワースローパスフィルタを
% かける手順と、グラフの可視化の手順を示します。一般的なデジタルフィルタの
% 伝達関数は以下の表現で表わされます。
%
% $$ H(z) = \frac{\sum^{N}_{k = 0}b_kZ^{-k}}{1 + \sum^{N}_{k = 1}a_kZ^{-k}} $$
%% 初期化
clear all, close all, clc
%% フィルタリング対象の信号生成
Fs = 1000;
t = 0:1/Fs:1; % 時間ベクトルの定義
sig1 = sin(2*pi*15*t + pi/3); % 正弦波信号1の生成
sig2 = sin(2*pi*42*t + pi/5); % 正弦波信号2の生成
noise = randn(size(t)); % 雑音信号の生成
sig = sig1 + sig2 + noise; % フィルタリング対象信号
%% フィルタ設計と特性の可視化
% フィルタの次数を7次、ナイキスト周波数で正規化されたカットオフ
% 周波数を0.1としたフィルタを設計します。Fs = 1000[Hz]の場合、
% カットオフ周波数は、1000/2 * 0.1 = 50[Hz]となります。
[b,a] = butter(7,0.1); % バタワースフィルタ設計
fvtool(b, a) % フィルタ特性の可視化
%% フィルタリング
out = filter(b,a,sig); % フィルタリング
% 入力信号と出力信号の時間軸波形可視化
subplot(2,1,1), plot(t,sig), grid
title('時間軸波形(フィルタリング前)')
subplot(2,1,2), plot(t,out), grid
title('時間軸波形(フィルタリング後)')
%% スペクトル推定
% ローパスフィルタにより、50[Hz]以下の成分が除去されている様子が
% 確認できます。
figure, periodogram(sig,[],[],Fs) % 入力信号のスペクトル
title('パワースペクトル密度推定(フィルタリング前)')
figure,periodogram(out,[],[],Fs) % 出力信号のスペクトル
title('パワースペクトル密度推定(フィルタリング後)')
% Copyright 2014 The MathWorks, Inc.
'
まとめ
MATLABプログラムの自動レポート生成(パブリッシュ)について紹介しました。
コードや実行結果の共有に大変便利な機能です。
参考
謝辞
本記事は @eigs さんのlivescript2markdownを使わせていただいてます。