スクリプト - みる会図書館


検索対象: マーマレード第3号
17件見つかりました。

1. マーマレード第3号

一歩 2.3 シミュレーションの第 プロットスタイル ( マーカー ) 表 2.4 指定子 マーカー 上向き三角幵 下向き 右向き三角系 左向き三角系 星型五角形 pentagram 指定子 マーカー プラス記号 十 丸 0 アスタリスク 点 X 記号 マーカーなし ( デフォルト : 省略可 ) none プロットを行ったら、続けてグラフの設定を行います。 "set(gca(), 'data bounds', は min, y_min; x max, y_maxl と入力することで、各軸の表示範囲を設定できます。 "set(gca(),'log_flags', logflag) " で軸を対数に設定することができ、 logflag が 'nn' だと両軸とも 線形、 ' ⅲ ' では x 軸が対数、 'nl' では y 軸が対数、そして 'll' では両軸とも対数となります。 'data bounds' を設定している場合は、対数軸の範囲設定が正の値になっている必要があります。 "xlavel() " "ylabel()" 、 "legend()" はそれぞれ x 軸、 y 軸、凡例を表示するコマンドです。詳細は割愛 します。 ・スクリプト こまでで様々なコマンドについて説明してきましたが、決まったコマンドを何回も実行 する場合は、スクリプトファイルを使用すると便利です。 SciIab のスクリプトは、コマンドを羅列したテキストファイルです。例えば、先程の正弦波をプロッ トするコマンド群をスクリプト化するためには、リスト 2.1 のようなテキストファイルを作成するだけ で構いません。 リスト 2.1 : sin_plot. sce "set(gca(), 'tight limits', ' 0 Ⅱ / / frequency / / time range [ 0 : 0 .001 sin(2 * %pi * f * t); 3 : ft 4 : ft2 = sin(2 * %pi * (f 5 : 6 : clf ( ) ; 7 : 8 : 9 : set(gca() , 'log—flags' 0.5 , 1 . 2 ] ) ; 10 : set (gca() , ' data—bounds ' ー 1 . 2 ; 11 : set(gca() , 'tight—limits ' 12 : x1abe1("Time [s] ” "fontsize", 2 ) ; 13 : ylabel ( "Amp1itude" "fontsize", 2 ) ; 14 : legend ( ' 5Hz ' ' 2 .5Hz ' ) ; スクリプト内で " / / " 以降の行は、コメントとして扱われます。 なお、スクリプトの編集は、 scilab に付属するエデイタ、 SciNotes を使うと、色分けなどがされて便 利です。図 2.7 のメインウインドウから、メニューバーの一アプリケーショ刻→ [SciNotesl で起動でき ます。 43

2. マーマレード第3号

1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 第 2 章 SciIab と FPGA で学んでみる△ DAC 第 1 回 リスト 2.4 : gen_signal.sce ( 信号べクトル生成スクリプト ) 1 : ifCisdef("fs")) then fs = 48000 ; end; sin(2 * %pi * f * ifCisdef("res")) then if(¯isdef ("len") ) then len = 32768 ; end ifCisdef("f")) then f ifCisdef("a")) then a = 1 . 0 ; end; res 16 ; end; 997 ; end; sampling rate 1 Ⅱ e てて = 1n; out if (res ( [ 0 : 1 : len ー 1 ] / fs ) ) (2A(res / / amplitude signal frequency sample length signal frequency (res 1 ) ; end; 1 ) in = in * out ; リスト 2.5 : quantize. sce ( 単純量子化スクリプト ) 1 : 2 : 3 : 4 : 5 : 6 : if(res out else out end ; 1n 1 ) then sign(out) ; て ou Ⅱ d ( 2 (res out ; リスト 2.6 : calc thdn. sce (THD 十 N 計算スクリプト ) 2 : 3 : sqrt(sum(i1É2) / len) xn_rms sqrt(sum(errA2) / len) err_ thdn = 20 * 10g10 (err—rms / in-rms) リスト 2.7 : plot_signal.sce ( 時間軸信号表示スクリプト ) if(&isdef("t—min")) then t-min = 1 ; end ifCisdef("t-max")) then t—max = 100 ; end 4 : clf ( ) ; (t—min:t-max) / fs * 1000 ; time p10t (time, in(t—min:t—max) , 'b') ; pIOt (time, out (t—min:t—max) , plot(time, err(t—min:t—max) , 'g-- ' ) ; x1abe1("Time [ms]' "fontsize' y1abe1("Amp1itude [dB] " , "fontsize" legend ( ' input ' error ) ; ' output ' 11 : 10 : 9 : 8 : 7 : 6 : 5 : 3 : 2 : 1 : / / visible range min / / visible range max リスト 2.8 : plot_fft. sce (FFT & スペクトル表示スクリプト ) 1 : 2 : 3 : 4 : //win = window( 're' , len) ; win = i Ⅱ dO ( 'hn' , len) ; //win = window( 'hn' , len) //win = window( 'hm' , len) ; / / rectangular window / / hanning window / / squared hanning window / / hamming window 54

3. マーマレード第3号

第 2 章 SciIab と FPGA で学んでみる△ DAC 第 1 回 実際にこのスクリプトを実行するには、 Scilab のファイルプラウザでこのファイルを置いたディレク トリに移動した後、コンソールから次のコマンドを実行します。 ー > exec("sin—plot . scet' , 2 ) ; 値を指数表現することで、広い範囲の数値を扱うことができ、またその範囲内において約 53bit の精 は、実数をプログラムで扱うためのフォーマットの一つで、図 2.9 のような構造になっています。数 Scilab では、内部の数値はすべて倍精度の浮動小数点数で表されています。倍精度浮動小数点数 ーコラム : シミュレーションの精度 さい。 で [ 2 司、本書のスクリプトではこれを記載していません。旧バージョンをお使いの方は、適宜設定して下 最新バージョンの 6.0.0 では、ダイナミックメモリという機能により、この設定が不要となりましたの 関数を使用してスタックサイズを大きくする必要がありました。 デフォルトで 10 , 000 , 000 スタックに設定されており、大きなデータを扱う場合には事前に " stacksize ( 11 ) " ■スタックサイズ設定 Scilab では、変数の値をスタックに保存しますが、このスタックの大きさは従来 ルでコマンド入力と同じく、スクリプトファイル内で " ・ " をつけていない行のみ結果の出力が行われます。 exec の第 2 引数は、スクリプトの実行内容の出力レベルを設定するもので、 2 を指定するとコンソー 度を持っています。 符号指数部 (lbit) ( 1 1 bit) 仮数部 (52bit) 図 2.9 倍精度浮動小数点数のフォーマット 52 44 ) x 2 ( 指数部 ) ー 1023 数点数の演算により、十分なシミュレーションができると考えられます。 処理系でも高々 32bit 程度の信号処理をシミュレーションしますので、 Scilab による倍精度浮動小 今回のシミュレーションでは、オーディオ信号入力として 16bit 、 24bit の信号を仮定し、途中の 実際の数値 = ( ー 1 ) ( 符号乙ト ) ( 1 + を ( 仮数部ビット ) を 2 ・一 53

4. マーマレード第3号

2.3 シミュレーションの第一歩 input output ー 20 一 M8N 、 S 」 8 三 le 」 pedS 」éMOd ー 160 ー 180 ー 200 20 000 15 000 10 000 5 000 Frequency [Hz] 図 2.13 量子化ビット数 lbit の時の量子化誤差 ( ハニング窓 ) 実効値を求めた時と同様、 lbit の場合は△が大きいためー△ / 2 ~ △ / 2 の範囲で量子化誤差が均一に なりづらく、そのためいくつかのピークが見えてしまっていますが、それも含めて全帯域におよそ均一に 分布していることがわかります。 このように、量子化ビット数が低くなってくると少し偏りが生じるものの、量子化誤差は全周波数帯域 におよそ均一に分布することがわかりました。 シミュレーションスクリプトを整理する こから先シミュレーションを進めていくにあたり、シミュレーションスクリプトを整理しま さて、 ひとつの *. sce ファイルにすべての処理を す。前節では、量子化誤差のシミュレーションを行うために 含めて記述していましたが、これを 1. 信号べクトル生成 2. 信号処理 ( △芝変調や、フィルタ処理など ) 3. 信号の可視化 (THD 十 N 計算、 FFT 表示など ) に分割します。 これにより、 2. の信号処理の部分を様々な方法に変えることが容易になり、 シミュレーションを行い やすくなります。 この後使用するスクリプトを記述します。 以下に、 53

5. マーマレード第3号

第 2 章 SciIab と FPGA で学んでみる△ DAC 第 1 回 これを、シミュレーションでも確認してみましよう。リスト 2.12 に を示します。 リスト 2.12 : qtize_dsm2. sce ( 二次△芝変調スクリプト ) 二次△芝変調を行うスクリプト 1 : 2 : 3 : 6 : 7 : 8 : 9 : 10 : 11 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : 21 : 22 : 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : U 、 / / for i 1 accl = zeros(len) ; acc2 = zeros(len) ; 4 : accl(l) in(l); 5 : acc2(I) in(l); if (res 1 ) then out(l) = sign(in(l)); else out ( 1 ) = round(2A(res end ; 12 : / / for i = 2 accI(2) accl(l) + in(2); = acc2(1) + acc1(2) acc2(2) if (res 1 ) then sign(acc2(2)) ; out ( 2 ) else out ( 2 ) = round(2A(res end ; 20 : err(2) in(2) out(2) ; 1 ) * in(l)) / 2A(res 2 * out(l); 1 ) * acc2(2)) / 2A(res for i = 3 : len do accl(i) = accl(i acc2(i) = acc2(i if (res 1 ) then 1 ) + in(i) 1 ) + accl(i) out (i 2 * out(i out(i) sign(acc2(i)); round()A (res in(i) out(i) ; end ; else out(i) end ; err(i) 1 ) * acc2(i)) / 2A(res このスクリプトも MODI の時と同じく、ほとんど伝達関数の式通りに記述しています。ⅲが式中の 0 厩が式中のレ、“ c が式中の P 、そして“ c2 が式中の Q に対応します。 72 exec("calc—thdn. scel' , 2 ) ; exec("lowpass . exec("plot—fft—log. sce" , 2 ) ; exec("plot-fft . sce" exec("qtize—dsm2. sce" , 2 ) ; exec("gen—signal ・ sce" , 2 ) ; f—max = 24000 ; 1023 ; filt—taps fc ー 24000 ; len = 32768 * 8 ; fs = 48000 * 64 ; //res = 4 ; res = clear; それぞれ実行します。 それでは、これを実行してみます。先ほどと同じように、 DAC が lbit の場合、 4bit の場合に対して

6. マーマレード第3号

2.4 △変調のシミュレー ション リスト 2.11 : qtize dsml. sce ( 一次△変調スクリプト ) 1 : / / for i 1 2 : zeros(len) ; acc 3 : ac c ( 1 ) in(l); 4 : if(res 1 ) then out(l) = si ( 洫 ( 1 ) ) ; 5 : 6 : else = round(2A(res 7 : 0 Ⅱ t ( 1 ) 8 : end ; 9 : 10 : for i 11 : 12 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : 20 : end ; 1 ) * in(l)) / r(res 2 : len do acc(i) if (res 1 ) then out(i) = sign(acc(i)); else out(i) round(2Ä(res end ; err(i) 1 ) + in(i) out ( i 1 ) * acc(i)) / 2A(res out(i) ; in(i) このスクリプトは、ほぼ MOD 1 の伝達関数の式通りに記述しています。かが式中の U 、。が式中 のレ、 acc が式中の P に対応します。 acc に関しては、べクトルとして持つ必要はありませんが、後 から MODI の動作を検証できるようにべクトルとしています。 それでは、これを実行してみます。なお、 こから先のシミュレーションを行うのにあたり、 DAC の 量子化ビット数としては、最も実現しやすい lbit と、自作でギリギリ性能を出せそうな 4bit の 2 通りで シミュレーションをしていきます。また、グラフ表示に関しては、今回のオーディオ用 DAC の設計を前 提とし、可聴帯域を中心にスペクトルを確認するため、周波数軸の表示範囲を 24kHz までに搾り、対数 軸で表示します。 CIear; res //res = 4 ; f_max = 24000 ; exec("gen-signal. sce" , 2 ) ; exec("qtize—dsml . , 2 ) ; exec("calc—thdn. sce" exec("plot—fft. sce" exec("plot—fft—log. sce" 65

7. マーマレード第3号

2.3 シミュレーションの第一歩 続いてこれをシミュレーションしてみましよう。元々のサンプリングレート 48kHz における信号帯域 はナイキスト周波数の 24kHz までなので、サンプリングレート 96kHz 、 192kHz 時にも同じ 24kHz の帯 域となるようにローパスフィルタをかけます * 8 。 SciIab でローパスフィルタをかけるスクリプトは、リスト 2.10 のように記述することができます。 リスト 2.10 : lowpass. sce ( ローパスフィルタスクリプト ) 1 : 2 : 3 : 4 : 5 : 6 : 7 : ifCisdef("fc")) then fc 24000 ; end ; if Cisdef ("filt—taps")) then filt—taps 511 ; [h, hm, fr] = wfir('lp', filt—taps, [fc/fs 0 ] , [ 洫 zf] filter(), 1 , (n) ; [out zf] filter(), 1 , out); [err zf] = filter(), 1 , err) ; end; ' hn ' / / cutoff frequency / / filter taps / / low-pass, hanning 4 行目で FIR フィルタ * 9 で使用する、ローパスフィルタの係数を求めています。カットオフ周波数は、 サンプリングレート 48kHz の場合のナイキスト周波数と合わせ、 24kHz としています。また、フィルタ のタップ数は、大きいほど急峻な特性のフィルタを生成することができますが、フィルタ処理にかかる時 これを使って、サンプリングレートが 96kHz のときの THD 十 N と FFT 出力を求めるコマンドと、実 5 ~ 7 行目で、実際にそれぞれの信号にローパスフィルタを適用しています。 間も長くなるため、今回は 511 タップとしました。 行結果は以下のようになります。 thdn err_rms ー 101. 14092 0 .0000062 0 .7071318 lll_rms exec("plot—fft . sce" , 2 ) ; exec("calc—thdn. sce" , 2 ) ; exec("lowpass . sce" , 2 ) ・ exec("quantize. sce" , 2 ) ; exec("gen—signal. fc = 24000 ; fs = 96000 ; clear ; 59 の。詳細は司を御覧ください * 9 有限インパルス応答 (Finite lmpulse Response) フィルタ。デジタルフィルタの一種で、 感的に時間軸でローパスフィルタをかけてから実効値の計算を行う方法を採っています * 8 コラムに書いたとおり、 FFT 結果から 24kHz までの Bin の値を使用して実効値を求めることも可能ですが、今回はより直 フォードバックの無い構成のも

8. マーマレード第3号

目次 ワ 1 冖ー -8 一っ 4 ワ 4 「ー 0 -8 ) 9 7 7 8 つっっ -4 -4 - りをりー「ー 8 8 8 7 一般的な DAC の構成 DAC の諸特性 シミュレーションの第一歩 . SciIab の準備 . 量子化ビット数と THD 十 N のシミュレーション 何故 997HZ を使うのか シミュレーションスクリプトを整理する . サンプリングレートと THD 十 N のシミュレーション . △変調のシミュレーション 一次△変調器 . オーバーサンプリング 二次△変調器 . 今回のまとめ 付録 A FFT をちょっと真面目に考える 参考文献 第 1 章 . 第 2 章 . 本誌の制作に使用したツール等 著者紹介 2.3 2.4 2.5 89 4

9. マーマレード第3号

第 2 章 SciIab と FPGA で学んでみる△ DAC 第 1 回 MODI NTF 0 五 p 〕 epm!ldwv ー 40 ー 50 ー 60 10 Frequency [Hz] 図 2.21 MODI における NTF の周波数特性 図 2.21 より、周波数帯域全体で一定の値を持っホワイトノイズのような量子化誤差は、低域側ほど少 なくなり、代わりに高域側で増加することがわかります。これがノイズシェーピングと呼ばれる効果で、 MODI の場合は 20dB/decade で増加することが分かります。 なお、文献によっては図 2.20 ではなく、図 2.22 のように MODI を表現しているものもありますが、 こちらで伝達関数を計算した場合には、 レ = 2 ー lU 十 ( 1 ー 2 ー 1 ) Ⅳ となります。 この場合、入力信号と直列に 2 ー 1 が挿入されているため、入力信号である U にも 2 ー 1 がかかってし まっていますが、 2 ー 1 は単なる遅延要素のため、信号成分は 1 サンプル分出力が遅れるだけで、周波数 特性の変化はありません。 十 ↓ U 十 十 図 2.22 MODI の別表現 一次△変調を行うスクリプト これを、シミュレーションでも確認してみましよう。リスト 2.11 に を示します。 64

10. マーマレード第3号

付録 A 本誌の制作に使用したツール等 図表作成 - lnkscape 0.48 / 0.91 https://inkscape ・ org/ja/ といった機能を提供する。 W ⅲ dows 上では Git クライアントとして SourceTree を使用すると便利。 ・ネット環境があればどこでも原稿修正可 ・原稿のバージョン管理 ・複数人での同時執筆におけるデータ管理 GitLab は Web プラウザからアクセスできる Git 環境を構築することができるソフトウェアで、 原稿管理を行った。 そこで原稿を 2 人の著者で共有するため、さくらの VPS を用いてサーバーを立て、 GitLab を設置して Re : VIEW の原稿はテキストファイルのため、バージョン管理システムによる差分管理が容易である。 ・ SourceTree https : //www. sourcetreeapp. com/ ・ GitLab https://about ・ gitlab . com/ さくらの VPS http://vps ・ sakura. ad ・ jp/ データ管理 - さくらの VPS 、 GitLab 、 SourceTree 2.1.2.5 マットで出力するツールとしても使用している。 PDF を読み込んで編集もできるので、回路図、基板 CAD の出力データを読み込んで整形、別フォー 簡単操作でそこそこ綺麗な図ができる。動作が重めなのが玉に瑕。 いわゆるⅢ ustlator のフリー版的なオープンソースのべクター描画ソフト。 さらにサーバーには Re : VIEW 環境も導入し、原稿を修正したら 1. ローカルの SourceTree からサーバーの GitLab にブッシュ 2. サーバーに SSH ログインしてコンパイル、 GitLab にブッシュ ( スクリプトで一発 ! ) 3. Source ee でコンパイル済原稿をローカルにプル と言った流れでコンパイルを行えるようにした。こうすることで、著者間の環境の差異による、 イル結果の差異を回避することが可能。 印刷 - みかんの樹 http : //www.mikan-no-ki . com/ でこぼんセット A を使用。 90 コンノヾ