【发布时间】:2019-01-24 16:51:46
【问题描述】:
我正在尝试优化我给出的一些代码,其中 FFT 取自时间序列上的滑动窗口(作为列表给出),并且每个结果都累积到一个列表中。原代码如下:
def calc_old(raw_data):
FFT_old = list()
for i in range(0, len(raw_data), bf.WINDOW_STRIDE_LEN):
if (i + bf.WINDOW_LEN) >= len(raw_data):
# Skip the windows that would extend beyond the end of the data
continue
data_tmp = raw_data[i:i+bf.WINDOW_LEN]
data_tmp -= np.mean(data_tmp)
data_tmp = np.multiply(data_tmp, np.hanning(len(data_tmp)))
fft_data_tmp = np.fft.fft(data_tmp, n=ZERO_PAD_LEN)
fft_data_tmp = abs(fft_data_tmp[:int(len(fft_data_tmp)/2)])**2
FFT_old.append(fft_data_tmp)
还有新代码:
def calc_new(raw_data):
data = np.array(raw_data) # Required as the data is being handed in as a list
f, t, FFT_new = spectrogram(data,
fs=60.0,
window="hann",
nperseg=bf.WINDOW_LEN,
noverlap=bf.WINDOW_OVERLAP,
nfft=bf.ZERO_PAD_LEN,
scaling='spectrum')
总而言之,旧代码对时间序列进行窗口化,去除均值,应用 Hann 窗口函数,采用 FFT(在零填充时,如 ZERO_PAD_LEN>WINDOW_LEN),然后取实数一半的绝对值和将其平方以产生功率谱(V**2 的单位)。然后它将窗口移动WINDOW_STRIDE_LEN,并重复该过程,直到窗口超出数据的末尾。这与WINDOW_OVERLAP 有重叠。
据我所知,频谱图应该对我给出的论点做同样的事情。然而,每个轴的 FFT 的结果维度相差 1(例如,旧代码是 MxN,新代码是 (M+1)x(N+1)),并且每个频率仓中的值大不相同——几个数量级数量级,在某些情况下。
我在这里错过了什么?
【问题讨论】:
-
一个结果是另一个结果的缩放版本吗?标准化可能存在差异。但这并不重要,重要的是输出的形状。
标签: python numpy scipy fft spectrogram