がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

Python: Swept-sine信号を作成する

今回はシステム同定入力(主にインパルス応答の測定)として使われる掃引正弦波を生成していきたいと思う。
昔はTSP信号なんて言われていたが場合によってはそぐわない可能性もあるので最近ではSwept-sineに統一されつつあるみたい
Swept-sine signalは信号のことでインパルス応答計測やシステム同定の場合はSwept-sine Methodと呼ばれている。

Hammersteinモデルの同定に関していえばHKISS(Hammerstein Kernels Identification by Sine Sweep)なんてワードも生まれてきているので論文を読む際は
要チェックだ

今回参考にした論文は参考文献欄に貼っておく



Swept-Sine

一般的なSwept-sineはFalinaの論文により示されているもの[1]だが今回はNovakらが提唱した同期型Swept-sineの式[2]を用いて生成してみることにする。
本来はインパルス応答などの測定に使うもので高調波周波数応答の正しい位相を推定する際に必要だからこうしている。
今回は単に信号生成しかしないので特に意味はない。

論文によるとSwept-sine信号は以下の式で与えられる。

\begin{equation}x(t) = \sin \left[ 2\pi f_{1} L \exp \left( \frac{t}{L} \right) \right]\end{equation}


\begin{equation}
L = \displaystyle \frac{T}{\ln \left( \frac{f_2}{f_1} \right)}
\end{equation}

\(f_{1}\):初期周波数
\(f_{2}\):最終周波数
\(T\):Swept-sineの長さ[sec]

ソースコード

初期振幅が0にならないためフェードイン、フェードアウトをかけている

import matplotlib.pylab as plt
import numpy as np
import scipy.signal as signal

f1 = 10        # start frequency
f2 = 12000       # end frequency
fs = 96000      # sampling frequency
T = 10          # time duration of the sweep
fade = [48000, 480]   # samlpes to fade-in and fade-out the input signal


'''generation of the signal'''
L = T/np.log(f2/f1)                    # parametre of exp.swept-sine
t = np.arange(0,np.round(fs*T-1)/fs,1/fs)  # time axis
s = np.sin(2*np.pi*f1*L*np.exp(t/L))       # generated swept-sine signal

# fade-in the input signal
if fade[0]>0:
    s[0:fade[0]] = s[0:fade[0]] * ((-np.cos(np.arange(fade[0])/fade[0]*np.pi)+1) / 2)

# fade-out the input signal
if fade[1]>0:
    s[-fade[1]:] = s[-fade[1]:] *  ((np.cos(np.arange(fade[1])/fade[1]*np.pi)+1) / 2)
    
plt.plot(s[0:96000])

f:id:gsmcustomeffects:20190117184758p:plain
Swept-sine信号

参考文献

  1. A. Farina,"Simultaneous measurement of impulse response and distortion with a swept-sine technique"
  2. Antonin Novak,"Synchronized Swept-Sine: Theory, Application, and Implementation"