はじめに
初投稿になります。無名と言います。
カバネをすべて倒した後、生駒の手によって人間に戻り暇になったのでプログラミングを勉強しています。(中の人は大学三年でPythonを勉強しており、理解を深めるためにqiitaを始めました)
これから信号関連に関する記事を投稿していこうと思います。
まだまだ勉強中なのでわかりにくい部分があると思いますが、よろしくお願いします。
フーリエ変換とは
フーリエ変換は時間領域で表されている信号を周波数成分に分解することが出来ます。
フーリエ変換の式は以下の通りです。
$$ X(ω)=\int_{-∞}^∞
x(t)e ^{−iωt}
dt $$
時間領域で表されている信号x(t)が周波数領域で表された信号X(ω)に変換されます。
高速フーリエ変換(FFT)
高速フーリエ変換はデジタル信号を高速で離散フーリエ変換してくれるアルゴリズムです。
サンプル数をNとしたとき、通常の離散フーリエ変換をすると時間が$$𝑂(N^2) $$かかるが、高速フーリエ変換をすると時間が$$O(NlogN) $$となりNが大きい場合大幅に時間が短縮できます。
Pythonのnumpyを使えば高速フーリエ変換が簡単にできるので今回はランダムな波を生成して高速フーリエ変換をし、周波数スペクトルを見ていこうと思います。
Pythonで実装
Pythonでコードを書いていきます。
今回は5つの周波数がランダムな正弦波を生成してその波の合成波をFFTしていこうと思います。
必要なライブラリをインポートします
import numpy as np
import matplotlib.pyplot as plt
import math
mathは無くても問題ないです。
初期設定
パラメータの設定をします
pi = math.pi
f_s = 44100 #サンプリングレート
t_fin = 1 #終了時間(秒)
dt = 1/ f_s #サンプリング周期
N = int(f_s * t_fin) #サンプル数
t = np.arange(0, t_fin, dt)
※サンプリングレートは1秒間あたりどのくらいサンプリングするかのこと
今回は時間を1秒にしています。
波の生成
正弦波を数式で表すと以下の通りになります
$$ y = Asin(2πft)$$
A : 振幅(amplitude)
f : 周波数(frequency)
t : 時間になります。
ランダムな波を5つ生成し、それらの合成波をPythonで作っていきます。
まず、合成波を入れる配列を初期化し、numpyを使い、周波数がランダムな正弦波を作ります。
その後for文を使い正弦波を配列の中に足して格納していきます。
#波の初期化
num_waves = 5 #5つの波を生成(任意の数)
makewave = np.zeros_like(t)
#ランダムな周波数の波の生成
for i in range(num_waves):
frequency = np.random.uniform(100 , 500) #周波数が100Hzから500Hzの範囲(任意)
amplitude = np.random.uniform(2 , 30) #振幅の範囲が2から30(任意)
wave = amplitude * np.sin(2 * pi * frequency * t)
makewave += wave #合成波の生成
#グラフの描画
plt.plot(t, makewave) #時間領域のグラフ
plt.xlim(0,10**-2) #横軸の範囲
plt.show()
作成した波を描画するとこんな感じになります。
これを高速フーリエ変換してどんな周波数の波からできているのか見ていきます。
numpyでフーリエ変換するには
y_fft = np.fft.fft(makewave) #離散フーリエ変換
freq = np.fft.fftfreq(N, d=dt) #周波数を割り当て
Amp = abs(y_fft/(N/2)) #振幅
このコードでできます。
変換後の波をグラフに描画すると
plt.plot(freq[1:int(N/2)], Amp[1:int(N/2)]) #A-f グラフのプロット
plt.xlim(50 , 550) # 横軸
plt.show()
大体100Hz,170Hz,210Hzあたりの周波数の波でできていることがわかりました。
おわり
初めて記事を書いてのでまだまだですがこれから気が向いたらいろいろな分野の記事を書いていきたいと思います。最後めっちゃ駆け足気味になってしまいました...
これからもよろしくです
スロット関係
最近家の近くのパチ屋にカバネリが増台されており、今日バイト帰りに寄ったら、かなりいい台が落ちてました。(正直ここまでいい台落ちてたの初めて)250ゾーンまで回しましたが、一度も当たらず帰宅しました泣