• 検索結果がありません。

LabVIEW課題 文字列の表示

N/A
N/A
Protected

Academic year: 2021

シェア "LabVIEW課題 文字列の表示"

Copied!
16
0
0

読み込み中.... (全文を見る)

全文

(1)

LabVIEW 画像処理参考プログラム

(最終改訂

2016/10/26)

LV_sample2.zip の更新内容 LabVIEW で簡単な画像処理を行う情報学実験Ⅱ課題⑦「画像情報処理」(以下「課題Ⅱ⑦」という。) の作業手順では処理内容をフォーミュラノードで記述することとしている。画素データから各色情報の 抽出にはビットシフトを用いるが、LabVIEW のフォーミュラノード内のビットシフト演算(演算 子”<<”、”>>”)は課題Ⅱ⑦テキスト(以下「テキスト」という。)p.3 で言及の通り、真のビットシフ トではない。このことを確認するプログラムがLV_bitshift.zip として情報学実験のページにアップロー ドされ、「色光のスペクトル分析」の項目にリンクされている(最終改訂2016/09/28)。 LabVIEW ではブロックダイアグラムに配置する関数部品として「2 の冪乗でスケール [Scale By Power of 2]」( )が用意されており、パラメータが正で左シフト、負で右シフトに対応(MATLAB の 関数 bitshift と同じになる)する。この部品を用いたフォーミュラノードを使用しない 8 種類 12 本 のプログラム例を、課題Ⅱ⑦の項目にリンクされている LV_sample2.zip にソース VI(レイアウトは Virtual Desktop 準拠)として追加公開したので各プログラムについて解説する(LV_sample2.zip 中の 追加分以外のプログラムについてはテキストpp. 3-6 を参照のこと)。 LabVIEW ビットシフトの仕様 LabVIEW のフォーミュラノード内のビットシフトの結果は 32 ビット符号無し整数(uInt32 型)に 対して次の通りである。 (0) 実際にシフトで使用されるパラメータは 32 を法とした値で、以下ではこの値をnとする。 (1) nが 0 のとき、MSB が 1 のデータに対して左右シフト共に結果は 0x7FFFFFFF となる。 (2) 左シフト(0<n<32)では MSB が 1 のデータに対して結果が 0 となる。 MSB が 0 のデータに対しても真のシフト結果の MSB が 1 となるときは結果が 0 となる。 (3) 右シフト(0<n<32)では MSB が 1 のデータに対して、結果は 0x7FFFFFFF をnビット右シフトした値となる。 すなわち、 (a) シフト対象データの MSB が 1 のときはシフト前に 0x7FFFFFFF とし、この値に対してシフトする。 (b) シフト結果の MSB が 1 となるときは結果を 0 とする。 となっている。 真のビットシフト LabVIEW のフォーミュラノード内のビットシフト演算を元に真のビットシフト結果を得るには次の 様にすればよい。ここでは 0<n<32 とする。 対象データ(uInt32 の a とする)の MSB(int の s とする)が 1 の場合は 0 に変更してシフトする。 左シフトでは元のMSB は失われるためシフト後に s の値は不要であるが右シフトではシフト後に必要 となる。フォーミュラノードではMSB が 1 の定数は書けない(0 とみなされる)ので次の様にする。

(2)

左シフト

左 n ビットシフトの結果 MSB となるシフト前データのビット 31-n(図 1 で値 d)が 1 の場合、 ビ ット 31-n の値を 0 に変更して LabVIEW のシフト演算を行い、シフト後に MSB を 1 とする。d を抽 出するにはビット 31-n のみが 1 であるマスク(uInt32 の m とする。図 3)と論理積を取ればよい。

if(a>0x7FFFFFFF) a=(a-0x7FFFFFFF)-1; m=0x01<<(31-n);

if(a & m) a=(((a ^ m)<<n) + 0x7FFFFFFF)+1; else a=a<<n;

31 30 ・・・・・・・・・・・・・・・・ 32-n 31-n 30-n ・・・・・・・・・・・ 0 x x ・・・・・・・・・・・・・・・・ x d [31-n bits] 図1 シフト前のデータ 31 30 ・・・・・・・・・・・ n n-1 n-2 ・・・・・・・・・・・・・・・・・・・ 0 d [31-n bits] 0 0 ・・・・・・・・・・・・・・・・・ 0 0 図2 図 1 のデータをnビット左シフトした結果 31 30 ・・・・・・・・・・・・・・・・ 32-n 31-n 30-n ・・・・・・・・・・・ 0 0 0 ・・・・・・・・・・・・・・・・ 0 1 0 0 ・・・・・・・・ 0 0 図3 ビット 31-n のみが 1 であるマスク m 右シフト MSB が 1 の場合、これを 0 に変更して LabVIEW のシフト演算を行い、シフト後に MSB のシフト 先であるビット 31-n に元の MSB をセットする。左シフトで用いたマスクをここでも使用する。

s=(a>0x7FFFFFFF); if(s) a=(a-0x7FFFFFFF)-1; m=0x01<<(31-n); a=(a>>n)+s*m;

31 30 ・・・・・・・・・・・ n n-1 n-2 ・・・・・・・・・・・・・・・・・・・ 0 s [31-n bits] x x ・・・・・・・・・・・・・・・・・ x x 図4 シフト前のデータ 31 30 ・・・・・・・・・・・・・・・・ 32-n 31-n 30-n ・・・・・・・・・・・ 0 0 0 ・・・・・・・・・・・・・・・・ 0 s [31-n bits] 図5 図 4 のデータをnビット右シフトした結果 2 値化参考プログラム threshold.vi / threshold_RGB.vi LabVIEW では多くの関数にスカラー以外のデータを入力可能で、画像の回転等を含まない単純な処 理であればフォーミュラノードを使用せず関数部品のみで容易に構成できる。threshold.vi は、テキス トで例題として取り上げた閾値指定による2 値化処理(ブロックダイアグラムとフロントパネルはテキ ストp.14 図 20、21)を関数部品で行うものである。ここではシフト、加減乗除、冪乗を配列に対して 行い、グレー画像の表示とガンマ値の入力を追加している。2 値化(ここでは白と黒)には、画像配列 と同じサイズで全要素が閾値に等しい配列を生成し(p.3 図 6 赤枠内の部分)、閾値から画素データの色 平均値を減算し(閾値を超える画素に対しては負となる)31 ビット右シフトして求めた符号ビットに

(3)

0xFFFFFF(白画素に対応)を乗じて「ピックスマップを平坦化」に出力(以降の「平坦化ピックスマ ップ描画」を介して「2D ピクチャ」に送る部分はテキスト記述の例と同じ)している。

ブロックダイアグラムウィンドウと実行中のフロントパネルウィンドウを図 6、7 にそれぞれ示す。 テキストの例では説明を簡単にするため各色の単純平均をグレーレベルとして閾値と比較しているが、 threshold.vi ではガンマ値を垂直スライド(対数スケール:ラベル gamma)で設定する(ガンマを考 慮した色平均の計算は図6 紫枠内の部分)。水平トグル SW(ラベル grey level 2-level)でグレーレ ベルと閾値による2 値化の表示を切替える。課題Ⅱ⑦では画像ファイルの拡張子として.jpg のみを扱っ ているが本プログラムでは、拡張子 .jpg 以外に .png、.bmp のファイルも開ける(ファイルを開かな いbitshift.vi、alias.vi、barber_pole.vi、barber_pole_rev.vi の 4 本を除く後述のプログラムに共通)。 発展課題として.jpg 以外の画像ファイルを扱いたい場合は本 VI を参考にされたい。 図6 threshold.vi のブロックダイアグラムウィンドウ 図7 threshold.vi を実行中のフロントパネルウィンドウ 閾値による 2 値化(左)グレーレベル(右) 色平均値に対して2 値化を行う threshold.vi に対して、threshold_RGB.vi は色毎に閾値を設定して 2 値化(平均ではないのでガンマの値は無関係)するもので、閾値の指定はスライドと数値入力ボック ス入力を垂直トグルSW(ラベル slide)で切替える。ブロックダイアグラムウィンドウと実行中のフロ ントパネルウィンドウをp. 4 図 8、9 にそれぞれ示す。各色の閾値を超える画素の色レベルは255、閾 値以下の画素の色レベルは0 で表示される。例えば閾値を 254 に設定するとレベル 255 の画素のみが表 示され、デジタルカメラでおなじみの色飛び、白飛びの簡易表示(正確な色飛びの判定にはヒストグラ

(4)

図8 threshold_RGB.vi のブロックダイアグラムウィンドウ 図9 threshold_RGB.vi を実行中のフロントパネルウィンドウ 閾値 127(左)閾値 254(右) テキストでは、「PC の画面キャプチャの保存では、同じ非可逆圧縮でも JPEG ではなく PNG による 圧縮を使用すべきである」(p.4)と注意されている。LV_sample2.zip に同梱の test.jpg を開いて緑と 青の閾値を255(これを超える値は無いので G と B のレベルは全て 0 として表示する)とし、赤の閾 値を0(レベル 0 以外は全て 255 となる)と 254(レベル 255 以外は全て 0 となる)とした例を図 10 に示す。左図では本来赤の成分を含まない(例えば青と黒の)境界部分の赤レベルが 0 ではないこと、 右図ではレベルが255 であるべき(例えば白と黄の)境界部分のみならず赤そのものの領域で赤レベル が255 ではないことをそれぞれ示している。test.png ではこの様なことは起らない。 図10 緑と青の閾値を 255 として赤の閾値を変えた test.jpg の結果 閾値 0(左)、閾値 254(右)

(5)

指定画素値表示参考プログラム pixel_color.vi

pixel_color.vi は、LV_sample2.zip に実行ファイルとして含まれていた Pixel_data からカーソル指定 箇所を中心とする拡大表示と円LED によるビット表示(参考プログラム bitshift.vi で後述の u8toB.vi をサブVI として参照)を省き、RGB 各色のレベルを 32×32 画素の 2D ピクチャで表示し、また画素 を指定するカーソルの色を8 色(白、黒を含む)ではなく自由に指定できる様にしたものである。ブロ ックダイアグラムウィンドウを図11(橙枠内は元画像にカーソルを重畳する部分)に示す。 図11 pixel_color.vi のブロックダイアグラムウィンドウ(橙枠内はカーソル重畳部分) カーソルの重畳には水平垂直両方向のカーソルデータ(1 次元配列)の生成、画素配列の行と列の置 換に配列関数が計4 個必要となり、フォーミュラノードで処理する方が容易でアルゴリズムとしても分 り易いことは言うまでもない。本参考プログラムはあくまでもフォーミュラノードを用いないプログラ ム例として公開している。図12 は pixel_color.vi を実行中のフロントパネルウィンドウの例で、画素を 指定する指標値とカーソルの色指定ではそれぞれボックスの数値入力(指標は十進数値、カーソル色は 16 進文字列)とスライド入力とを水平トグル SW で切替える。 図12 pixel_color.vi を実行中のフロントパネルウィンドウ

(6)

画像色シフト参考プログラム color_shift.vi / color_shift_rev.vi LV_bitshift.zip 中の Pixel_data_rev は、開いた画像ファイル中の、カーソルで指定した画素をシフ トした結果とこれを同じだけ逆方向にシフトした結果を表示するものであった。color_shift.vi は、単一 の 画 素 の シ フ ト 結 果 で は な く画 像 全 体 に 同 じ シ フ ト 処 理 を 行 っ た 結 果を 表 示 す る も の で 、 color_shift_rev.vi では Pixel_data_rev と同じくシフト後に逆方向に同じだけシフトした結果を併せて 表示する。両プログラム共にpixel_color.vi と同じく、サブ VI を参照する円 LED によるビット表示は 省略している。 シフト対象を画素データ24 ビット全体とするか(シフト量は水平スライドで指定:左シフトを左側 に目盛るためスケールを逆にしているのはLV_bitshift.zip 中のプログラムと同様である)RGB 各色の 独立な3 個の 8 ビットデータとするか(シフト量は各色に対応する 3 本の垂直スライドで指定)を水平 トグルSW(ラベル pixel color)で切替える。後者の場合、シフト結果は 256 を法とする値を用い、 シフトにより他の色に越境することはない。 Pixel_data_rev では LabVIEW のビットシフト演算の特性を確認する目的から 24 ビット画素データ を 32 ビットデータとして扱っている。画像全体のシフト結果とこれを逆方向にシフトした結果を表示 するcolor_shift_rev.vi では、水平トグル SW が pixel 側で画素データ全体のシフトを指定した場合に、 32 ビットデータとして扱う(左シフトにより本来の画像データとしては失われる上位ビットを 8 ビッ トまで保持する)か24 ビットデータとして扱うかを垂直トグル SW(ラベル keep 8MSBs:水平トグ ルSW が pixel 側の場合のみ有効)で切替えられる。 color_shift.vi のブロックダイアグラムウィンドウと実行中のフロントパネルウィンドウを図 13、p.7 図14 に示す。図 14 左が画素データ 24 ビット全体のシフト、図 14 右が色毎の独立なシフトの例であ る。 図13 color_shift.vi のブロックダイアグラムウィンドウ

(7)

図14 color_shift.vi を実行中のフロントパネルウィンドウ 画素シフト(左)、色毎にシフト(右) color_shift_rev.vi のブロックダイアグラムウィンドウを図 15 に、test.png(テキスト pp. 3-4 参照) を開いて実行中のフロントパネルウィンドウの例を図16 に示す。図 16 は左 16 ビットシフト後に右 16 ビットシフトして戻した例で、左が24 ビットデータ、右が 32 ビットデータの処理結果である。右シフ トで戻した結果、24 ビットデータでは青のデータのみが残るが(図 16 左)、32 ビットデータでは緑の データも復元されて青以外に緑とシアンのセルが現れることが分る(図16 右)。 図15 color_shift_rev.vi のブロックダイアグラムウィンドウ 図16 color_shift_rev.vi を実行中のフロントパネルウィンドウ 24bit(左)、32bit(右)

(8)

ビットシフト参考プログラムbitshift.vi LV_bitshift.zip 中の LV_bitshift と同様に 16 進数字または十進数字で入力した 32 ビットデータのシ フト結果を色と円LED で表示するプログラムである。フォーミュラノードを使用しないため LabVIEW ビットシフト演算との切替機能は含まない。データの各ビットを円LED で表示するため u8toB.vi をサ ブVI として参照しており、これを bitshift.vi と同じフォルダに置いて実行すること。図17 はメイン VI のブロックダイアグラム、図 18 は実行中のフロントパネルウィンドウの例である。 図17 bitshift.vi のブロックダイアグラム(サブ VI を除く) 図18 bitshift.vi を実行中のフロントパネルウィンドウ 隣接画素処理参考プログラム pixel_mixture.vi フォーミュラノードでは入力された配列のサイズを関数 sizeOfDim で取得することはできるが、こ れと等しいサイズを指定して出力用の配列を宣言することはできない(配列宣言のサイズは整数定数で なければならない)。入力される配列の最大サイズを想定して出力用の配列を宣言することは無駄が多 く、ここに煩雑であっても関数部品を用いて配列の処理をすることの意味がある。 pixel_mixture.vi は、フォーミュラノードを使用せずにテキスト p. 19 処理例 7 の隣接画素処理を構 成したもので配線量を削減するため 3 個のサブ VI(Pf2RGBc.vi、RGBcf2P.vi、noise_generator.vi) を使用しており、これらのサブVI を同じフォルダに置いて実行すること。 ある画素の画素データを上下左右と斜め4 方向の計 8 個の隣接画素に当該画素を含めた 9 個の画素か ら得る演算はフォーミュラノードでは容易に記述できるが、関数部品では例えば m 行 n 列の配列を右に 1 画素分ずらす(シフト後の配列では、同じ指標値の対応する配列要素は逆方向の左隣接画素となるこ とに注意する)操作は次の様な煩雑なものとなる。

(9)

(0) 配列のサイズを求め(m 行 n 列とする)、サイズ m で全要素が 0 である 1 次元配列を生成する。 (1) 対象となる配列の第 1 列(指標の値は 0)の前に前項の 1 次元配列を挿入する(挿入後のサイズは m 行(n+1)列となる)。 (2) 前項の配列の第(n+1)列(指標の値は n )を削除する(削除後のサイズは m 行 n 列に戻る)。 図19 は pixel_mixture.vi のメイン VI のブロックダイアグラムウィンドウで「右シフト」赤枠内が上 記の(1)(2)に対応する。重み付きの和を取った配列の有効な部分のサイズは(m-2)×(n-2)であり、 最後に外枠の要素をクリアする(図19 の「外枠クリア」緑枠内)。 図19 pixel_mixture.vi のブロックダイアグラムウィンドウ 画素配列(サイズを m×n とする)に係数を掛けた結果は色毎にサイズ m×n の配列に符号無しバイ ト整数として出力するのではなく、後続の処理の便宜のため、R、G、B の順に行方向に連結した配列 (サイズは 3m×n となる)に倍精度浮動小数点数として出力する Pf2RGBc.vi(ブロックダイアグラム は図20 左上)と連結した配列に係数を掛けた結果を通常の画素配列に出力する RGBcf2P.vi(ブロック ダイアグラムは図20 左下)をサブ VI として使用する。 図20 pixel_mixture.vi が参照するサブ VI のブロックダイアグラム

(10)

対象画像のサイズを256×256 に限定していないため、読込まれた画像配列のサイズを表示し 2D ピ クチャに水平垂直両スクロールバーを表示している。256×256 の画像を余白も欠損も無く表示する 2D ピクチャのサイズは262×262 であるが(テキスト p. 8)、スクロールバーを表示する場合には 280×280 となる。 図21 はドット雑音を付加しこれを移動平均で軽減(テキストp. 20 図30 に対応)するpixel_mixture.vi 実行中のフロントパネルウィンドウ例である。 図21 pixel_mixture.vi を実行中のフロントパネルウィンドウ pixel_mixture.vi とテキスト処理例 7 とのスクロールバーの表示以外の違いは次の通りである。 ● 全体にかかる係数(処理例7 の水平スライド factor)の入力を省き、9 個の重み係数の和の逆数(和 が0 となるときは 1)としている。 ● 処理結果を画像ファイルとして保存できる(p.9 図 19 のブロックダイアグラムで「ファイル保存」 紫枠内の部分)。操作は LV_sample2.zip 中の RGB_setting と同様に保存ファイルの種類を水平ト グルSW で選択し、 を押下するが、ファイル名は文字列入力ボックス(ラベル file name)で 指定する(省略時は ”_temp” に水平トグル SW で選択した拡張子が付く)。

● 付加する雑音の色(文字列入力ボックスで16 進数値を指定:ラベル noise color (hex))と間隔(垂 直スライド:ラベルspace)を指定でき(図 19 右端の「ノイズ生成」橙枠内参照)、種類にドット (noise type が 0)以外にライン(1 水平、2 垂直)、クロス(3)を追加している。参照されるサブ VI noise_generator.vi のブロックダイアグラムを p.9 図 20 右に示す。

形状補正参考プログラム perspective_control.vi

ここまでの参考プログラムでは、必要な処理に対して配列全体の演算により一度に行うもので配列サ イズに基づく反復部分は無いが(pixel_mixture.vi では雑音付加の noise_generator.vi に for ループを 使用しているが隣接画素の混合自体には反復不要である)、テキストp.18 処理例 6 の様に表示画素の指 標を幾何学的な計算で求める処理では、for ループによる反復が必要となる。

(11)

版換算の焦点距離の他に整形前の元画像のアスペクト比の入力を求められる。perspective_control.vi は(リサイズはされていても)アスペクト比の保存された整形しない画像を対象として同様の処理をフ ォーミュラノードを使用せずに関数部品で構成するもので、pixel_mixture.vi 同様にファイルサイズを 限定しない。スクロールバーを表示し、処理結果をファイルに保存できることもpixel_mixture.vi と同 じである。 図22 は perspective_control.vi のブロックダイアグラムウィンドウで、緑枠内は 2 重 for ループによ る指標計算部分を示す。for ループにおいて関数部品による処理とフォーミュラノードの文による処理 とはそのまま対応しているが(例えば図22 赤枠内の文と内側の for ループ)、「指標配列 [Index Array]」 では範囲外の指標に対する要素には既定値(ここでは0)を取るため、フォーミュラノードの if 文に相 当する指標の範囲チェックを省略している。 処理例6 で定数 127.5 で与えられる値はサイズを m×n とするとき、外側の for ループでは(m-1)/2、 内側のfor ループでは(n-1)/2 となる。 図22 perspective_control.vi のブロックダイアグラムウィンドウ(緑枠内は指標計算部分) 図23 はテキスト p.19 図 27 右の画像をアスペクト比3:2 のまま読み込み、 を押下して処理結果 をファイルに保存した例である。 図23 perspective_control.vi を実行中のフロントパネルウィンドウ(左) 保存した画像(右)

(12)

統計参考プログラム histogram.vi 画像の各色レベルのヒストグラムを表示するテキストp.20 処理例 8 も、フォーミュラノードを用い ない場合に配列に対する一度の演算では構成できず、histogram.vi は perspective_control.vi と同様に for ループを使用している。図 24 は histogram.vi のブロックダイアグラムで、図の左下赤枠内は画像 全体の頻度配列生成の2 重 for ループ(While ループの外側で一度だけ実行される)、中央緑枠内は指定 ラインの頻度配列生成のfor ループ(ケースストラクチャの TRUE で実行され、画像サイズが小さく指 定したラインの指標が範囲外となるときはFALSE で全要素 0 の配列が渡される)、その右の橙枠内はヒ ストグラム画像生成のfor ループ(サイズ 256 の 1D 配列で 1 行ずつ生成するので 2 重 for ループでは ない)、右上の紫枠内は頻度配列の保存処理をそれぞれ示す。 図24 histogram.vi のブロックダイアグラム 枠内は頻度配列生成・保存、ヒストグラム画面生成 ここでは画像のサイズを256×256 に限定している。サイズがこれを超える画像では左上の256×256 画素が対象となることはPixel_data(テキスト p.4)と同様であるが、サイズが満たない画像の場合に フォーミュラノードで出力配列を宣言している Pixel_data では空いた部分の配列要素は代入時に 0 と なり黒で表示されるのに対し、histogram.vi では配列をそのまま「平坦化ピックスマップ描画」を介し て「2D ピクチャ」に送っているため文字通りの「余白」となる。histogram.vi とテキスト処理例 8 の 違いは次の通りである。 ● ラインの指定に列選択の水平スライドを追加し、行と列とは水平トグルSW(ラベル row column) で切替える。 ● 画像全体および指定したラインの画素レベルの頻度配列を表示し、各要素の内容を確認できる。行 は色(0, 1, 2 がそれぞれ R, G, B)、列は色レベル(0~255)を示す。 を押下するとトグルSW とカーソルで選択された頻度配列を(テキストエディタ、スプレッドシートでの表示を考慮し行を レベル、列を色と転置して)テキストファイルに保存する(列の区切りは水平タブ0x09、行の区切 りは復帰改行0x0D0A)。ファイル名は画像ファイルのファイル名(ピリオドはアンダーバーで置き 換える)に対象範囲を連結したもの(例:test_png_whole.txt、test_jpg_column127.txt)となる。 ● 各色でレベル255 の画素が 254 の画素よりも多い場合に色飽和と判定して円LED で表示する。 ● ヒストグラムの縦軸最大値を直接指定する処理例8 の垂直スライド range に代え、最大値を画像全 体では65536、ライン指定では 256 をそれぞれ基準とし、縦軸の拡大率を垂直スライド magnifier の値(1~256)で指定する。 p.13 図 25 は色飛びの無い画像(左)と緑と青で色飛びのある画像(右)の画像全体のヒストグラム の表示例である。p.4 図 10 では R, G, B, C, M, Y, W, K の矩形に対する JPEG 圧縮画像では 0、255 以 外のレベルの画素が存在する(PNG 圧縮ではこの様なことはない)ことを見たが実際の画素レベルの 表示例と保存した頻度配列のテキストファイルをExcel で開いた例(レベル 0~7、240~255 の部分を

(13)

表示)を図26 に示す。PNG 圧縮では、各色とも 0 と 255 がそれぞれ画像全体では 32768 画素、水平 ライン(行)ではどの行も128 画素となっている(test.png は垂直ライン(列)では列により異なるが、 追加のtest2.png では列方向についても全て各色 0 と 255 が 128 画素ずつとなる様に色を配置し、辺を 共有するどの色の組合せも4 回ずつ現れる様に構成している)。 図25 画像全体のヒストグラム 色飛びの無い画像(左)、緑と青で色飛びのある画像(右) 図26 JPEG 圧縮画像(左)では PNG 圧縮(右)と異なり 0、255 以外のレベルの画素が存在する 図27 はライン指定のヒストグラムの例で、ここではカーソルの色に緑(16 進文字列で ff00 を入力) を指定している。 図27 ライン指定のヒストグラム 行指定(左) 列指定(右)

(14)

パタン移動参考プログラム alias.vi / barber_pole.vi / barber_pole_rev.vi 配列の処理にフォーミュラノードを用いて記述するよりも明らかに関数部品による操作の方が簡単 な例として周期パタンの移動表示があり、alias.vi は、折り返し雑音参考プログラム LV_alias のパタン を正弦波波形に限定し関数部品で構成したものである。パタンは最初にWhile ループの外で初期値を生 成(図28 緑枠)すれば、移動パタンの生成は単なる配列の切り貼りで行える(画面上ではパタンを横 (列方向)に移動させるのに対し配列の連結が行方向で行われるため、転置して表示している。図 28 赤枠、図29)。図 28 にブロックダイアグラム、図 29 に切り貼り操作、図 30 に実行中のフロントパネ ルウィンドウを示す。 図28 alias.vi のブロックダイアグラム(緑枠内はパタン生成、赤枠内は移動・転置部分) 図29 配列の切り貼りによる 1 フレームのパタン移動 図30 alias.vi を実行中のフロントパネルウィンドウ

(15)

barber_pole.vi は理髪店の回転ポール(回転運動により円筒上の三色の縞模様が無限に上昇するかの 様に見える)を模したもので、見かけの移動方向が配列の行方向であるため転置を要しないこととパタ ンが塗り潰しであることによりパタン生成部分が 2 重の for ループとなっていることを除き構成は alias.vi と同様である。図 31 にパタン初期値(横に表示している。円筒上の模様らしく見せるため視線 と法線との成す角の余弦で色レベルを落としている)、ブロックダイアグラムウィンドウ、実行中のフ ロントパネルウィンドウを示す。 図31 barber_pole.vi のパタン、ブロックダイアグラムウィンドウ、フロントパネルウィンドウ 回転ポールの無限上昇運動に喩えられるものにシェパードトーン(Shepard tone)と呼ばれる無限音 階がある。部分音を可聴域にわたりオクターブ間隔で配し(標準ピッチのA の音であれば、27.5, 55, … 440, 880 … 7040, 14080。単位は Hz)、部分音の振幅に高域と低域で減衰するエンベロープを掛けて合 成し各部分音の周波数を同比率で増加させると(部分音が低域から現れ高域で消えてゆく)周波数が無 限に増加を続けるかの様に聴こえ(逆にすればどこまでも減少するかの様に聴こえる。聴こえ方は個人 により異なりエンベロープと機器の周波数特性にも依存する)、半音程ずつステップで変化するものを discrete Shepard scale(図 32 左は WaveSpectra の再生画面)、連続的に変化させるものを continuous Risset scale または Shepard-Risset glissando(図 32 右)と呼ぶ。

(16)

たMATLAB_sample.zip に含まれる MATLAB スクリプト Shepard_tone.m で生成したもの(左チャ ンネルは上昇、右チャンネルは下降。0.5 秒で半音程ステップしオクターブ変化を 5 回繰返す)である。 音程のステップの間に短いフェードアウトとフェードインがあるため、周波数スペクトルは鈍った表示 となること、離散であるため赤のピーク表示が連続無限音階の様にきれいなエンベロープとならないこ とが分る。興味のある人はスクリプト13 行目のエンベロープ中心周波数と 14 行目のエンベロープ尖鋭 度の値を変えて実行し聴こえ方の違いを確かめられたい。 LabVIEW は計測制御ソフトウェアであり画像だけでなく音声の処理も容易に行うことができる。2 次元の画像配列を「ピックスマップを平坦化」して「平坦化ピックスマップ描画」を介して「2D ピク チャ」に送る様に、例えば音声信号配列を再生するには、「波形作成」で変換後、「サウンド出力構成」 で設定した「サウンド出力書き込み」に送るだけである(図33 橙枠)。barber_pole_rev.vi は、回転ポ ールの上昇、下降の表示に加えRisset の連続版無限音階の再生を行うもので、1 フレームのパタン移動 量を指定するフロントパネルの垂直スライドを移動方向指定のみの垂直トグルSW に変更(1 フレーム の移動量は24fps で 90rpm 相当となる 16 行に固定)している。連続無限音階の生成には、各部分音を 高速スイープ信号(MATLAB_sample.zip 中の signal_gene.m 50 行以降)と同様に正弦の引数を指数 関数とすればよい。図33 に barber_pole_rev.vi のブロックダイアグラムと実行中のフロントパネルウ ィンドウを示す。 図33 barber_pole_rev.vi のブロックダイアグラム(左)、フロントパネルウィンドウ(右) 回転ポールのパタンの様に無限音階の音声信号配列もWhile ループの外で最初に 1 周期分(1 オクタ ーブ6 秒)のデータを生成してループ内で反復使用すれば計算量を削減できるが、ループ内の制御器の 応答時間が平均3 秒最長 6 秒と長くなり過ぎる(ツールバーの「実行を中断」ボタンへの応答も同様で ある)ため、ここでは While ループの中で生成しながら再生(図 33 緑枠内)している。この例では While ループの外に置いているパラメータ(図 33 紫枠は中心周波数と尖鋭度)の設定をループ内に入 れて数値制御器で入力することで再生時にその変化を確認できる。興味のある人は確かめられたい(ソ ースVI を編集してパラメータを変更する場合に注意することとして、離散的な変化の場合には 1 周期 を12 音のどの音からでも始められるのに対し、連続的な変化の場合に1 オクターブ分を周期データと するには両端の位相を等しくする必要があることで、最低部分音の周波数の初期値は log2 を周期で割 った値の偶数倍でなければならない)。 回転ポールの上下の移動方向と無限音階の上昇下降との連動には、LabVIEW のノーティフィケーシ ョンを使用して異なるWhile ループに情報を伝えている(図 33 赤丸内)。1 回のループ処理時間の短い 方を送信側に選ぶ必要があり、無限音階生成・再生ループ(生成ブロックを441 標本としており 10ms) を送信側、回転ポール表示ループ(フレームレートを最小にした場合1 秒)を待機側としている。

図 8  threshold_RGB.vi のブロックダイアグラムウィンドウ  図 9  threshold_RGB.vi を実行中のフロントパネルウィンドウ  閾値 127(左)閾値 254(右)  テキストでは、 「PC の画面キャプチャの保存では、同じ非可逆圧縮でも JPEG ではなく PNG による 圧縮を使用すべきである」 (p.4)と注意されている。LV_sample2.zip に同梱の test.jpg を開いて緑と 青の閾値を 255(これを超える値は無いので G と B のレベルは全て 0
図 14  color_shift.vi を実行中のフロントパネルウィンドウ  画素シフト(左)、色毎にシフト(右)  color_shift_rev.vi のブロックダイアグラムウィンドウを図 15 に、test.png(テキスト pp
図 32  無限音階を再生中の WaveSpectra 画面    離散無限音階(左)  連続無限音階(右)

参照

関連したドキュメント

管理画面へのログイン ID について 管理画面のログイン ID について、 希望の ID がある場合は備考欄にご記載下さい。アルファベット小文字、 数字お よび記号 「_ (アンダーライン)

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

従来から iOS(iPhone など)はアプリケーションでの電話 API(Application Program

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

ダウンロードした書類は、 「MSP ゴシック、11ポイント」で記入で きるようになっています。字数制限がある書類は枠を広げず入力してく

関西学院大学には、スポーツ系、文化系のさまざまな課