Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python:信号長に近い2の累乗(2**n)のFFTフレームサイズを求める

f:id:Kurene:20210704112630p:plain

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,)