FFTを使う時,なるべく高速に計算するためにフレームサイズを2の累乗に設定するのが一般的ですが、入力する信号の長さが2の累乗でない時があります。
そういう時は,フレームサイズが2の累乗になるように、ゼロパディング or カットします。
その際には、信号長 N に近い2の累乗のフレームサイズを求める必要があります。
Pythonでの手っ取り早い方法としては、bin()
で2進数化し、その文字列の長さを利用して信号長に近い2の累乗の指数部を求めることができます。
・ゼロパディングの例
>>> N = 1000 >>> x = np.random.random(N) >>> bin(N) '0b1111101000' >>> n_pad = len(bin(int(N))[2:]) >>> n_pad 10 >>> 2**n_pad 1024 >>> x_new = np.r_[x,np.zeros(2**n_pad-N)] >>> x_new.shape (1024,)