ブログ

割とコンピュータよりの情報をお届けします。

Python

Python numpyでFFTを実行する.周波数軸はどうしたら

numpyでFFTを実行する場合,周波数軸はnumpy.linspaceで設定するのが便利である.
よーく見るとずれてしまって困った話.

まず周波数解析の例を示す.周波数軸を作る部分は
np.linspace(0, サンプリング周波数, データ長さ)
で大体あっているのだが,微妙にずれる.
このずれの分が気になったのでよーく考えると以下の例の場合には
freq = np.linspace(0, fsmp - 1/(t_len + t[1] - t[0]), num=len(t));
ということになる.

ピったしの周波数軸が作れる.

import numpy as np
import matplotlib.pyplot as plt

# 例の信号を作成
t = np.linspace(0.001, 4, 4000);
z = 0.1 + 0.2 * np.sin(t * 10 * 2 * np.pi) + 0.2 * np.sin(t * 33 * 2 * np.pi);

# サンプリング周波数
fsmp = 1 / (t[1] - t[0]);
# 解析時間
t_len = t.max() - t.min();

Fz = np.fft.fft(z) / z.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);

freq = np.linspace(0, fsmp, num=len(t));

fname = 'text.csv';
np.savetxt(fname, np.array([freq, np.real(Fz), np.imag(Fz)]).transpose(), fmt='%.18g', delimiter=',');

plt.figure(1)
plt.subplot(311)
plt.plot(t, z)

plt.subplot(312)
plt.plot(freq, Fz_abs)
plt.xlim([0, fsmp/2]);

#136/4
plt.subplot(313)
plt.plot(range(len(t)), Fz_abs)
#plt.xlim([0, 500]); # 後半(高周波側)は前半の折り返し

plt.show();

≫ 続きを読む

2019/01/23 コンピュータ   TakeMe
タグ:Python

Pythonでは複素数の演算が行えることを知った

最近の言語は複素数が使えることが多いが,Pythonも複素数演算が扱える.

例えば以下のような演算ができる.
以下の例では虚部と実部を分けて指定する方法と極座標表示から得る方法の例.

import cmath

# 虚部と実部を分けて指定
a1 = complex(1, 0);
a2 = complex(2, 0);

# 偏角を使った指定
mag1 = 1.0;
arg1 = 0.0;
a1 = complex(mag1 * cmath.cos(arg1), mag1 * cmath.sin(arg1))

mag2 = 2.0;
arg2 = 0.0;
a2 = complex(mag2 * cmath.cos(arg2), mag2 * cmath.sin(arg2))


trial = complex(100, 0);

a21 = a2 - a1;
b = a21 / trial

print(b)

いったん複素数になってしまえば掛け算,割り算は可能.
(例の偏角はラジアンなので注意)

≫ 続きを読む

2019/01/23 コンピュータ   TakeMe
タグ:Python

Python のプログラムはIDLEでもデバッグできる

PythonのGUIとしてWinPythonにはIDLEが添付している.
このIDLEはブレイクポイントなどの設定をどのように行うのか不明でデバッグには使えないと思っていたが,どうもShellの側のメニューバーにDebugという項目があり,Debuggerを選択すればブレイクポイントも設定できるようになるらしい.

IDLEを起動するとPython ShellというWindowが現れる.このとき,ファイルを開く方法は何ら難しいことはないと思う.
ファイルを開くとエディタの中にファイルが開く.
よくIDEを使った開発になれている方であればF5キーでプログラムが実行されるもの推測しやすいと思う.

ただ,ブレイクポイントはどのように設定するのか?

じつは,エディタの側ではなくPython Shellの側のメニューバーのDebug->Debuggerを選択してデバッグをオンにしておかなければならない.

これをオンにしておくとエディタで行を右クリックした時に,Set Breakpoint / Clear Breakpointという選択ができるようになっている.
毎回Visual Studio Codeをインストールしていた.もっと早く教えてよ.

参考
PythonのIDLEでデバッグを行う方法(GAMMSOFT: https://gammasoft.jp/python/debugging-python-idle/)

≫ 続きを読む

2019/01/18 コンピュータ   TakeMe
タグ:Python

Pythonで複数の画像をまとめる例

Pillowで複数の画像をまとめて一つにする例を作成していた。

今回は一つの画像imから2つの画像を作成したが,im1, im2は別の画像とする。

Image.newで出力の画像を作成しておいて,Image.paste()で貼り付けるImageと貼り付け先を指定してやるだけで画像が一つにまとまる。

from PIL import Image, ImageDraw, ImageFilter

im = Image.open('DSC_0001.JPG')
im1 = im.resize((200, 150))
im2 = im1.filter(ImageFilter.EDGE_ENHANCE)


dst = Image.new('RGB', (im1.width + im2.width, im1.height))
dst.paste(im1, (0, 0))
dst.paste(im2, (im1.width, 0))

dst.show()
dst.save('im.png')
#dst.save('im.jpg', 'JPEG', quality=30, optimize=True)

ある処理で,たくさんの画像をまとめたサムネイル化を図っていた。
調べてみたら,ImageDrawのimportはいらない。また,ImageFilterも画像がすでに用意されている場合にはいらない(今回の例だけ)。

≫ 続きを読む

2018/09/22 コンピュータ   TakeMe
タグ:Python

WinPython 2.7は更新が停止?

WinPythonの2.7は2.7.13.1で更新が停止してしまった。
2018年中には,いよいよ,おわりか?
現在CPython自体はバージョンが2.7.15へ進んでいる。

まだまだ,node.jsの一部モジュールがPython 2.7に依存している状況なのだが,なんとかならないのか。
今のところWinPythonの更新が途切れてから1年程度なのでまだ差は大きくないのでnodevars.batは以下のようにしてPATHにWinPythonのフォルダを追加して使っている。

@echo off

rem Ensure this Node.js and npm are first in the PATH
set "PATH=%APPDATA%\npm;%~dp0;%PATH%"

setlocal enabledelayedexpansion
pushd "%~dp0"

rem Figure out the Node.js version.
set print_version=.\node.exe -p -e "process.versions.node + ' (' + process.arch + ')'"
for /F "usebackq delims=" %%v in (`%print_version%`) do set version=%%v

rem Print message.
if exist npm.cmd (
  echo Your environment has been set up for using Node.js !version! and npm.
) else (
  echo Your environment has been set up for using Node.js !version!.
)

popd
endlocal

set "PATH=C:\WinPython-64bit-2.7.13.1Zero\python-2.7.13.amd64;C:\cmake-3.12.0-win32-x86\cmake-3.12.0-win32-x86\bin;%PATH%"
"C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\VC\Auxiliary\Build\vcvars32.bat"

rem If we're in the Node.js directory, change to the user's home dir.
if "%CD%\"=="%~dp0" cd /d "%HOMEDRIVE%%HOMEPATH%"

今更Python 2.7をインストールするのは気が引ける。
伝統的にPython 2.7はドライブのルートにインストールするようにインストーラが作られている。

≫ 続きを読む

2018/09/20 コンピュータ   TakeMe
タグ:Python

WinPython 3.7.0 virtualenvは時間がかかる

pyv8のインストールに失敗,virtualenvを使えばよいのでは,などと考えて今度は,virtualenvをインストールして実行するも,失敗したように見える。が,実際には成功していたという話。
そしてpyv8はインストール失敗。

まず,普通にvirtualenvをインストールする。
pip install virtualenv
でインストールできる。

それから
仮想環境を作るディレクトリ名を指定して
python -m virtualenv take3
などと実行する。

すると,DeprecationWarning: the imp module ....など表示が出てきて止まっているように見えるため,失敗したのかと思っていた。何度試しても同じ表示で止まってしまう(ように見える)

数分後 
Installing setuptools, pip, wheel...done.
まで進んでいてビックリ。
virtualenvの処理に時間がかかるだけの場合があるのでじっくり待ってみてください。

≫ 続きを読む

2018/09/19 コンピュータ   TakeMe
タグ:Python

Python embeddable用に追加モジュールのzipファイルを追加

Python embeddableではモジュールが不足していることがある。使いたいモジュールを追加してzipファイルとして同梱する際に参考になるページはある。

いろいろ確認しているが,numpyのインポートはうまくいっていない。
うまくいきそうなものもあるのだが…

zipimportという仕組みを使用しているだけなので,もしかすると,重いフォルダをzip圧縮しておいてまるでフォルダをパスに追加するかのように
sys.path.insert()でファイルを追加していくということで重いファイルを軽くして配布して,配布先で使用できるようになるというもの。

zipimportの仕組みはかなり凝っている。
自分でよういした簡単なpyスクリプトなら普通に実行することができるだろう。
例えば,以下のような。

# -*- coding: utf-8 -*-

def example1(a):
    return a * 1;



≫ 続きを読む

2018/09/17 コンピュータ   TakeMe
タグ:Python

Pythonで一定間隔で実行5

Pythonで一定間隔で処理を実行する例を作成していたが,今回はQt5を使用した場合の例に踏み込んだ。(最初の記事からだいぶん時間がたって忘れていたがJavaScriptのsetIntervalみたいな処理がしたかったのだ。今回は形が違うが,setIntervalなる関数も出てきて気分はsetIntervalの処理のようになる)

WinPythonではQt5が同梱されたバージョンが用意されている。
今回はそれを利用した。

今回のサンプルコードは以下のようになる。

import sys
from PyQt5.QtWidgets import  *
from PyQt5.QtCore import QTimer
from datetime import datetime

def main():
    app = QApplication(sys.argv)
    t1 = QTimer()
    t1.setInterval(1000)
    t1.timeout.connect(TimerTest)
    t1.start()
    sys.exit(app.exec_())

def TimerTest():
    print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))

if __name__ == '__main__':
    main()

このコードの実行にはPyQt5が必要でWinPythonなら同梱されているが,他の環境ではインストールが必要である。
このタイマーの使い勝手は悪くないし,マニュアルも豊富であるがQt5のライセンス関係には注意が必要。

≫ 続きを読む

2018/09/16 コンピュータ   TakeMe
タグ:Python

Pythonで一定間隔で実行4

Pythonで一定間隔で処理を実行する例をもう一つ見つけた。
ただし,.NETが使用できる場合には.NETのTimerの方がよいと思う。
今度はwxWidgetが使用できる場合の例

まず,pip install wxpythonをインストールする。

そしてサンプルコード

import wx
from datetime import datetime
from time import sleep

class TestApp(wx.App):
    def TimerStart(self):
        self.t1 = wx.Timer(self)
        self.t1.Start(1000)

    def TimerStop(self):
        self.t1.Stop()
        print('end')
        del self.t1

    def TimerTest(self, event):
        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
        
    def OnInit(self):
        self.Bind(wx.EVT_TIMER, self.TimerTest)
        self.TimerStart()
        return True

app = TestApp()
app.MainLoop()

ただし,タイマーの止め方はわからない。IDLEなどを使用していると,タイマーが止まらず回りっぱなしになってしまう。

≫ 続きを読む

2018/09/16 コンピュータ   TakeMe
タグ:Python

C言語からPythonの関数呼び出し3

前の記事ではPYTHONHOMEを設定とか言っているがかなり面倒なので,WinAPIのSetEnvironmentVariable()を使って少し改変を図ったという記事である。

改変というのは,SetEnvironmentVariable()を使用すること。windows.hをインクルードして,Py_Initialize();の手前でこの関数を入れてやると前の記事のサンプルを実行する前にPYTHONHOMEを設定する必要が省ける。

SetEnvironmentVariable(
_T("PYTHONHOME"),  // 環境変数の名前
_T("<WinPythonのインストールディレクトリ>\\python-3.7.0.amd64")  // 環境変数の新しい値
);

さらに調べていると,今のバージョンのWinPythonだと実行環境を同じバージョンのPython embeddableに挿げ替えることが可能なようだ。
Python embeddableと同じフォルダに突っ込んで実行すると普通に実行できる。この時PYTHONHOMEの設定はいらない。

≫ 続きを読む

2018/09/15 コンピュータ   TakeMe
タグ:Python