波形データだけではわかりにくい
音声はマイクを振動は加速度センサを使えば取得できてそれぞれのセンサもかなり安価に入手することができます。そうするとIoTなどでもいろいろとデータが集められるようになりますが集めたデータから有用な情報を得るためには、得られたデータを分析しなければなりません。音声などのような波形データを分析する際に用いられることが多いスペクトル分析(周波数の分布を求める)をPythonを使って求めてみます。
ライブラリ
- Numpy
必要な情報
波形データを取得するときに設定するサンプリング周波数(1秒間にどれだけの頻度で値を取得するか)とサンプリング時間(取得している時間)を控えておきましょう。
コード
とりあえずテスト用の波形データをつくってみる
ここでは30[Hz]と20[Hz]の波形の合成波をつくっています。
wave.py
import numpy as np
import math
import matplotlib.pyplot as plt
#データ生成
x=np.arange(0,sampling_time,1/sampling_rate)
y=np.sin(2*30*np.pi*x)+np.sin(2*20*np.pi*x)
plt.figure(figsize=(28,6))
plt.plot(x,y)
plt.show()
これをサンプリング周波数を1000[Hz]、サンプル時間を2[s]として分析してみます。
analyze.py
sampling_rate=1000
sampling_time=2.0
#FFT関連計算
#sampling rateとsampling timeがわかっていれば波形データからスペクトル分析をできる
fft_result=np.fft.fft(y)
n=int(sampling_rate*sampling_time)#データ数
freq=np.fft.fftfreq(n, d=1/sampling_rate)#周波数
Amp = np.abs(fft_result/(n/2)) # 振幅
plt.figure(figsize=(28,6))
plt.plot(freq[1:int(n/2)],Amp[1:int(n/2)])
plt.xlim(0,100)
plt.show()
このように分析結果も20[Hz]と30[Hz]となっており生成したデータで設定した周波数として取得できました。
このような感じでとりあえず簡単に周波数分布を調べられます。