ブログ

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

2018/9/8

PythonにはPython embeddableなるzipファイルも配布されている

PythonにはPython embeddableという配布もあるらしい。容量はかなり小さいディストリビューションとしても使用できるし,アプリに組み込んで処理を依頼することもできる。

参考ページには「pythonNN.dll、pythonNN.zip、vcruntime140.dllがあれば」ということになっているが,少なくとも3.7.0については,実際に使う場合にはどのような依存関係が残っているか分かったものではないので,一緒に配布されているファイルを消さない方がよい。
あくまで最小構成で使う場合ということである。書かれている内容を手順通り実行していくとやっぱり183 MB程度になった。

相当大きな容量のファイルになってしまう。
今回使ったファイルをいかに表示する。前の記事のままだとMatplotlibでwxWidgetsを使う場合には修正を加える必要がある(前の記事のまま実行してしまうとTkinterモジュールがないとか)。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib
#matplotlib.interactive( True )
matplotlib.use('WXAgg')

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure

import matplotlib.pyplot as plt

import wx

N = 1000           # Number of Samples
dt = 0.01          # Sampling Interval
f1, f2 = 23, 36    # Frequency
t = np.arange(0, N * dt, dt) # Time range
freq = np.linspace(0, 1.0 / dt, N) # Frequecny range

# Signal (Sinusoidal waves, frequencies of f1 and f2 + noise)
f = np.sin(2 * np.pi * f1 * t) \
    + np.sin(2 * np.pi * f2 * t) \
    + 0.8 * np.random.randn(N)

F = np.fft.fft(f) / len(f) * 2
F[0] = F[0] / 2.0

# 振幅スペクトルを計算
Amp = np.abs(F)

# plot
plt.figure()
plt.subplots_adjust(wspace=0.4, \
                    hspace=0.0)
plt.subplot(121)
plt.plot(t, f, label='Raw signal')
plt.xlabel("time")
plt.ylabel("signal")
plt.grid()
plt.ylim([-7, 7])
leg = plt.legend(loc=1)

plt.subplot(122)
plt.plot(freq[0:int(len(F)/2)], \
         Amp[0:int(len(F)/2)], \
         label='Amplitude')
plt.xlabel('frequency')
plt.ylabel('amplitude')
plt.grid()
plt.ylim([0, 2])
leg = plt.legend(loc=1)
plt.show()

 

≫ Read More

2018/09/08 コンピュータ   TakeMe

PythonでFFTの例を作成

Python FFTを実施する例を作成してみた。

そのコードは以下のようになった。

フーリエ変換については,係数の部分が定義によって異なるので,この例のnp.fft.fft()の使用方法ではMATLABやGNU Octaveのように配列要素数分係数がかかるので物理的な意味を持つ振幅に直す場合にはlen(f)で割る必要がある。さらに,下の例では,折り返す分を半分しか表示していないので振幅としては半分になってしまう。そこで2をかけて調整している。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt


N = 1000           # Number of Samples
dt = 0.01          # Sampling Interval
f1, f2 = 23, 36    # Frequency
t = np.arange(0, N * dt, dt) # Time range
freq = np.linspace(0, 1.0 / dt, N) # Frequecny range

# Signal (Sinusoidal waves, frequencies of f1 and f2 + noise)
f = np.sin(2 * np.pi * f1 * t) \
    + np.sin(2 * np.pi * f2 * t) \
    + 0.8 * np.random.randn(N)

F = np.fft.fft(f) / len(f) * 2
F[0] = F[0] / 2.0

# 振幅スペクトルを計算
Amp = np.abs(F)

# plot
plt.figure()
plt.subplots_adjust(wspace=0.4, \
                    hspace=0.0)
plt.subplot(121)
plt.plot(t, f, label='Raw signal')
plt.xlabel("time")
plt.ylabel("signal")
plt.grid()
plt.ylim([-7, 7])
leg = plt.legend(loc=1)

plt.subplot(122)
plt.plot(freq[0:int(len(F)/2)], \
         Amp[0:int(len(F)/2)], \
         label='Amplitude')
plt.xlabel('frequency')
plt.ylabel('amplitude')
plt.grid()
plt.ylim([0, 2])
leg = plt.legend(loc=1)
plt.show()

≫ Read More

2018/09/08 コンピュータ   TakeMe