読者です 読者をやめる 読者になる 読者になる

Hope is a Dream. Dream is a Hope.

非公開ふぃふぃ工房ブログ

↓LINE登録はこちら↓

定期的につぶやいてます. 記事に興味を持って頂いたかたや、Line Botを使ってみたいかたは試しに登録どうぞ

友だち追加

PyQtGraphでリアルタイムプロット

pyqt

PyQtGraphでリアルタイムプロット

python + PyQtを使ってグラフ描画するネイティブアプリを作ってる。グラフの表示にはMatplotlibを使っているんだけど、プロッティングがどうしても遅くて困っていた。

そこで「PyQt + FFT」と調べると、リアルタイムプロットに関する記事を見つける事ができた。どうやらPyQtGraphというライブラリがあるみたい。

PyQtGraph

本家: http://www.pyqtgraph.org/

Examples

PyQtGraph includes an extensive set of examples that can be accessed by running:
import pyqtgraph.examples
pyqtgraph.examples.run()
This will start a launcher with a list of available examples. Select an item from the list to view its source code and double-click an item to run the example. スクリーンショット 2015-04-10 21.31.23 スクリーンショット 2015-04-10 21.32.04

PyQtGraphでリアルタイムFFT

http://yukara-13.hatenablog.com/entry/2013/12/05/025655

pyqt, pysideは一度書籍を読んでおくべき

俺の彼女と幼なじみが修羅場すぎる12 (GA文庫)

俺の彼女と幼なじみが修羅場すぎる12 (GA文庫)

Qtプログラミング入門―使いやすいフレームワークを基礎から解説 (I・O BOOKS)

Qtプログラミング入門―使いやすいフレームワークを基礎から解説 (I・O BOOKS)

入門 Qt 4 プログラミング

入門 Qt 4 プログラミング

実践 Qt 4プログラミング

実践 Qt 4プログラミング

初心者のためのウェーブレット変換

Gabor Wavelet(ガボールウェーブレット)の実装

さて、ウェーブレット変換をしてみる。

ウェーブレット変換には色々種類があり良くわからん。

Haar, メキシカンハット, DOG...等

まぁどれも似たり寄ったりなのだが、今回はある解析プログラム(ブラックボックス)の吐き出す結果に似た解析がしたい。

色々試した結果、恐らく`Gabor Wavelet'だろうということに行き着いてきた。

ここでGaborWaveletとは...

 

wavelet

イメージはこんな感じ。

GaborWaveletとは

images

ざっくり書くと。短時間フーリエ変換の窓関数にガウス関数(正規分布)を使うんだ。

 

まずは絵で理解する ->  http://www.yobology.info/text/wavelet/wavelet.htm

次に理論を理解する -> 信号処理 ~第 3 部 非定常信号解析,ケプストラム解析~ 横田 康成

 

さて実装した

実装したコードはこちら

実装したのはいいが、アルゴリズムの挙動が分からないので、調べてみる。それが今回の狙い。

 

σ(シグマ)の影響

SnapCrab_NoName_2015-4-21_16-34-58_No-00

Gabor関数(正規分布)のパラメータに、σが入っている。σを変えるとどうなるのかパラメータを振ってみた。

 

SnapCrab_NoName_2015-4-21_16-47-25_No-00

周波数スケールに従って、非線形で小さくなっているのが分かる。

というか、σによって、正規分布の窓幅は同じだけど、なかみの周波数が変わっている。

(それでいいのか?)

 

次回へ続く

 

実装の参考になるHP

ガボールウェーブレット変換

http://www.softist.com/programming/gabor-wavelet/gabor-wavelet.htm

SnapCrab_NoName_2015-4-21_16-7-38_No-00

C/C++言語でガボールウェーブレット変換により時間周波数解析を行うサンプルプログラム

http://hp.vector.co.jp/authors/VA046927/gabor_wavelet/gabor_wavelet.html

SnapCrab_NoName_2015-4-21_16-8-4_No-00

 

これなら分かる応用数学教室―最小二乗法からウェーブレットまで

これなら分かる応用数学教室―最小二乗法からウェーブレットまで

俺の彼女と幼なじみが修羅場すぎる12 (GA文庫)

俺の彼女と幼なじみが修羅場すぎる12 (GA文庫)

OpenGL初心者が3時間で基礎を学ぶ | その3

PyOpenGL

OpenGL初心者が3時間で基礎を学ぶ | その3

話している暇はありません。おそらくこのページを見に来た方はOpenGLを学ぶモチベーションがあることと思います。環境はPyOpenGL = Python + OpenGLです。前編はこちら->OpenGL初心者が3時間で基礎を学ぶ | その2

※ このページは「Python Programming in OpenGL」(PDF,英語)を日本語で解説してくのが目的です。

その3:関数(方程式)からグラフを描く

前回までは、点や線の基本的な使い方を学びました。しかし、ただ点を打ったり、線を引いたりしても面白くありません。その3では、方程式を使って自動で(?)描かせます。

# # -*- coding: utf-8 -*-
##################################################################
# 
# PyFunc.py
# 
# Chapter 5.2 Plotting 2D Functions
# < http://www.math.uiuc.edu/~gfrancis/illimath/StanBlank/PyOpenGL.pdf >
# 
##################################################################

""" OpenGLパッケージをインポート """
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
""" 数値演算用パッケージのインポート """
# from Numeric import * # 参考書
import numpy as np # 今回はNumericの代わりにNumpyを使う事にします。


def init():
 """ 描画エリアの初期化関数 """
 glClearColor(1.0, 1.0, 1.0, 1.0)
 gluOrtho2D(-5.0, 5.0, -5.0, 5.0)


def plotfunc():
 glClear(GL_COLOR_BUFFER_BIT)

 """ 点の描画 """
 glColor3f(0.0, 0.0, 0.0)
 glPointSize(3.0)

 glBegin(GL_POINTS)
 """ ここが今日の本題 """
 # 方程式を描かすために、定義域内部でループを回します。
 for x in np.arange(-5.0, 5.0, 0.1):
   """ 描かす方程式 """
   y = x*x
   glVertex2f(x,y)
 glEnd()

 """ 座標軸の表示 """
 glBegin(GL_LINES)
 glVertex2f(-5.0, 0.0)
 glVertex2f(5.0, 0.0)
 glVertex2f(0.0, 5.0)
 glVertex2f(0.0, -5.0)
 glEnd()


 """ フラッシュ! """
 glFlush()

def main():
 """ おまじない """
 glutInit(sys.argv)
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
 glutInitWindowSize(500,500)
 glutInitWindowPosition(10,10)
 glutCreateWindow("PyFunc.py | Function Plotter")
 glutDisplayFunc(plotfunc)

 init()
 glutMainLoop()
# main関数の実行
main()

描画結果

スクリーンショット 2015-04-22 21.24.44

 

見事に三次曲線を描かせる事ができました。(グラフ描画の光が見えてきました)

解説

プログラムの大部分は前回までで説明したおまじないばかりですので、特に説明は少ないです。

点を打つ関数

glBegin(GL_POINTS)
for x in np.arange(-5.0, 5.0, 0.05):
    y = x*x
    glVertex2f(x,y)
glEnd()

さて、ポイントを打つには、3つの手順をとるんでした。

  1. glBegin(GL_POINTS): 頂点を打つことを宣言する。

  2. glVertex2f(x,y): 頂点の座標を宣言する。

  3. glEnd(): 描画の終わりを宣言する。

簡単です。

これにy = 2*x**2 - 3*x**2という三次方程式を描かせているだけです。簡単ですね。

for文にあるnp.arangePython標準ライブラリにあるrange関数の浮動小数点まで扱えるように拡張されたものです。(Numpyを使っている方ならわかると思いますので、申し訳ないですが説明は割愛します)

 

さてさて

次へ行きましょう

 

チュートリアル形式で始めるOpenGL[2D編]

チュートリアル形式で始めるOpenGL[2D編]

実例で学ぶゲーム3D数学

実例で学ぶゲーム3D数学

ドラマCD 俺の彼女と幼なじみが修羅場すぎる

ドラマCD 俺の彼女と幼なじみが修羅場すぎる

ゾンビ彼女†グロカワ育成ダークシミュレーション

ゾンビ彼女†グロカワ育成ダークシミュレーション