次のように:
def signal_xHz(A, fi, time_s, sample):
return A * np.sin(np.linspace(0, fi * time_s * 2 * np.pi , sample* time_s))
A:は信号振幅です
fi:は信号周波数です
time_s:時間の長さ(s)
sample:は信号のサンプリング周波数です
補足拡張:PythonFFT合成波形の例
Python numpyモジュールのFFT関数を使用して、矩形波と方形波を合成し、離散フーリエ変換の理解を深めます。
モジュールのインポート
import numpy as np
import matplotlib.pyplot as plt
それぞれ、周期的な方形波と三角波のプログラムを生成します
# サイズポイントでサンプリングされた、周期1の三角波を生成します
def triangle_wave(size):
x = np.arange(0,1,1.0/size)
y = np.where(x<0.5, x,0)
y = np.where(x =0.5,1-x, y)return x, y
def square_wave(size):
x = np.arange(0,1,1.0/size)
y = np.where(x<0.5,1.0,0)return x, y
np.where関数の2番目の値はifで、3番目の値はelseです。
次のプログラムは、対応する周波数スペクトルを計算できます。FFT計算を容易にするために、サンプリングポイントの数は2の累乗になります。
fft_size =256
# 三角波とそのFFTを計算する
x, y =triangle_wave(fft_size)
fy = np.fft.fft(y)/ fft_size
以下は、計算された周波数スペクトルを視覚化することであり、周波数に対応する強度は、エンジニアリングで一般的に使用されるデシベルdpで表されます。
# 三角波のFFTの最初の20項目の振幅を描画します。添え字のない偶数のない値はすべて0なので、
# ログ後の極小、描画できない、npを使用.クリップ機能は、配列値の上限と下限を設定して、正しい描画を保証します
plt.figure()
plt.plot(np.clip(20*np.log10(np.abs(fy[:20])),-120,120),"o")
plt.xlabel("frequency bin")
plt.ylabel("power(dB)")
plt.title("FFT result of triangle wave")
次に、正弦関数と余弦関数を使用して信号を合成します
# FFT計算結果の周波数の最初のn項目を取得して合成し、合成結果を返し、ループサイクルの波形を計算します。
def fft_combine(freqs, n, loops=1):
length =len(freqs)* loops
data = np.zeros(length)
index = loops * np.arange(0, length,1.0)/ length *(2* np.pi)for k, p inenumerate(freqs[:n]):if k !=0: p *=2 #DC成分を除いて、他の係数は*2
data += np.real(p)* np.cos(k*index) #コサイン成分の係数は実数部です
data -= np.imag(p)* np.sin(k*index) #正弦成分の係数は負の虚数部です
return index, data
ここで、indexはスペクトル空間のサンプリングポイントを表します
複合信号を描画し、x座標にデフォルトの整数表現を使用します
# サンプリングポイントをx軸座標として使用して、元の三角形の波と正弦波を使用した段階的な合成の結果を描画します
plt.figure()
plt.plot(y, label="original triangle", linewidth=2)for i in[0,1,3,5,7,9]:
index, data =fft_combine(fy, i+1,2) #2サイクルの合成波形を計算します
plt.plot(data, label ="N=%s"% i)
plt.legend()
plt.title("partial Fourier series of triangle wave")
plt.show()
上記の任意の周波数の正弦波を生成するpythonメソッドは、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。