スキップしてメイン コンテンツに移動

gnuplotで曲線を描く

自作デジタルエフェクターではLFOなど可聴域外の周波数を扱う事があります。そういった音声信号はWAVファイルへ出力しても耳で聞いて確認することができません。そのような場合は数値データをそのままファイルに落としてグラフ化ツールなどで可視化して確認します。

 gnuplot 

gnuplotはフリーのグラフツールです。

gnuplot
https://sourceforge.net/projects/gnuplot/files/gnuplot/

gnuplotにはコマンドライン版とウインドウ版の両方が入っています。どちらでも同じように使えますが、ここではウインドウ版を使います。

インストールの際にデスクトップ上にアイコンを作成するにチェックを入れておきます。



インストールが終わったら、デスクトップのショートカットを右クリックしてショートカットのプロパティを表示します。



ショートカットのプロパティで作業フォルダーの中を消して空にします。



 グラフ表示してみる 

作業の流れは、

・wgnuplotショートカットを作業フォルダへコピーする。
・コンソールで標準出力へデータを出力するプログラムを作る。
・リダイレクトでデータファイルを生成する。
・gnuplotで表示する。

ちょっと面倒ですけど、こんなものでしょう。ではちょっとやってみましょう。

まず、初めにデスクトップにあるwgnuplotのショーカットを作業フォルダへドラッグ&ドロップでコピーし、作業フォルダからwgnuplotを起動できるようにしておきます。これを作って置かないと起動の度に作業フォルダを指定しなければなりません。

次にサイン、コサインの数値を出力するプログラムを書いてみます。教科書通りの何の変哲もないコンソールに数値を出力するだけのプログラムです。

sine_cos.cpp

#include  <iostream>
#include  <math.h>

main()
{
  int       fs      = 44100; // サンプリングレート
  int       freq    = 1;       // 周波数  
  int       length  = 5;  // データの長さ

  double  th = (2.0*M_PI) / fs * freq;

  for( int i( 0 ); i < fs * 5; ++i )
  {
    double s = sin( th * i );
    double c = cos( th * i );

    std::cout << s << " " << c << " "<< std::endl;
  }
}


これをコンパイルして実行ファイルを作ります。データの出力先は標準出力なので、リダイレクトしてデータファイルを作ります。リダイレクトすると標準出力をコンソールではなくファイルへ出力するように変更できます。MinGWコンソールで以下の様にするとリダイレクト出来ます。MS-DOS(DOS窓)でもできます。

リダイレクト

$sin_cos > sin_cos.txt


生成されたsin_cos.txtをメモ帳でオープンすると数値データが出力されていることが分かります。

作業フォルダーのwgnuplotショーカットからwgnuplotを起動します。




データファイルにはsinとcosの2つの数値データが入っています。using:で表示するデータを指定します。w l は線種の指定です。title "" あってもなくても構いません

sinデータを表示する

plot "sin_cos.txt" using:1 w l title "sin"


replotで2本目の曲線を描画します。

cosデータを表示する

replot "sin_cos.txt" using:2 w l title "cos"


saveでここまで書いたプロットコマンドをセーブできます。

プロットコマンドのセーブ

save "sin_cos.plt"


loadでプロットファイルをロードして再描画できます。

再表示

load "sin_cos.plt"



プロットファイルはプロットコマンドを保存しているだけなのでメモ帳などで編集できます。

コメント

このブログの人気の投稿

中国製ゲルマニウムトランジスタ

Aliexpressで購入したゲルマニウムトランジスタです。AC128のセカンドソース(らしきものw)です。最近の安い中華ゲルマエフェクターで使われているようです。10個で送料込み¥1000くらいでした。そもそもCANタイプのトランジスタは現行品でも高いので1個¥100ならお買い得でしょうか。 テスターでhfeを測定した結果 20,36,34,37,40,67,149,190,214,216, かなりのバラつき具合です。hfeが高いのも欲しかったので丁度良かったのですが・・・ 20とかは動くんでしょうか?

Blue Pill FX Projects~デジタルディレイ~

■$2の格安マイコンボードBlue Pill STM32を使って、E.ギター用のデジタルディレイを作りました。 モノラル-シングルエフェクトです。ノーマルディレイ、アナログディレイ、リバースディレイのどれか1つをトグルスイッチで切り替えられます。 ・最長ディレイタイム        ・ノーマルモード : 425ms (周波数特性:7kHz)       ・アナログモード : 800ms (周波数特性:1.5kHz)       ・リバースモード : 420ms (周波数特性:7kHz) ・消費電力 DC9V 55mA 音は普通のディレイです。ノーマルモードの周波数特性が7kHz(-6db)なのでBBDやPT2399よりはクリアな音です。S/NはPT2399ディレイと同じくらいです。 このデジタルエフェクターに使用した小型のマイコンボードです。海外のホビーマイコンユーザーの間でBlue Pill(青い錠剤)と呼ばれているものです。大きさ23mm x 55mmの基板でエフェクターケース(1590B/TD6-11-3)に余裕で入ります。Aliexpressなら$2(+送料)で手に入ります。日本国内ではAmazonやaitendoで取り扱いがあります。米国ではebayで見つかります。"STM32F103C8T6"で検索します。  マイコンボード のスペック   ■STMicroelectronics製STM32F103C8T6(Cortex-M3 32ビットARMマイコン) ■動作クロック 72MHz ■プログラムFlash 64k ■SRAM 20k ■ADC 12ビット 2系統 ■DACなし このMCUにはDACが内蔵されていません。そこでDual PWM DACという方法でアナログ信号を出力しています。疑似DACといったところでしょうか。2本の抵抗と1個のコンデンサでデジタル信号をアナログ信号へ変換する面白い回路です。 あと、このマイコンボードの他にプログラムを書き込む為のプログラムライターが必要になりますが、詳しくは別の記事で書いているので参照してください。プログラムライターもAliexpressでなら$2程度で入手できます。

Blue Pillマイコンボードへプログラムを書き込む (1)

 STM32CubeProgremmer  Blue Pillマイコンボードへブログラムを書き込むためには、まず書き込み用のソフトウェアが必要です。今回はSTマイクロ社の純正ソフトウェアSTM32CubeProgremmerを使います。このソフトウェアはSTマイクロ社のサイトからダウンロードできますが、ダウンロードする前にユーザー登録が必要になります。登録は無料です。利用についても全く無料ですが、ユーザー登録するとその後にちょこちょこと広告メールが送られてくるようになります。それが嫌な方は各自で対処してください。本音をいえばこの程度のソフトウェアはユーザー登録なしで公開して欲しいです。ちなみにフリーウェアではstm32flashというソフトウェアがあるのですが、今のところwin64版しかありません。 STM32CubeProgremmerのインストールは指示に従って行えば特に問題はないと思います。  プログラムの書き込む手順  Blue Pillマイコンボードのジャンパー設定をプログラム書き込みモードへ変更します。 USBシリアルモジュールとBlue Pillマイコンボードをケーブルで配線して、USBシリアルモジュールをパソコンと接続します。 STM32CubeProgrammerを起動してUARTとPortを設定します。 ・Prot番号(COM番号)はパソコンが自動で割り振るので上のスクショと同じ番号にはならないと思います。 ・パソコンでCOMポートを複数使用している場合は、ドロップダウンリストでPort番号を変更してください。 ・Portに"No COM...(No COM Detected)"と表示される場合は、USBシリアルモジュールがパソコンから認識されていないので、ドライバをインストールしてください。 ※充電専用のUSBケーブルは使用できません。100均で買ったUSBケーブルを使っている方は要注意です。 次にBlue Pillマイコンボードのリセットボタンを押してから、STM32CubeProgrammerのConnectボタンを押します。UART接続ではConnect(接続)ボタンを押す直前にマイコンボードのリセットするという約束があるので