Python科学计算——复杂信号FFT

Python014

Python科学计算——复杂信号FFT,第1张

FFT (Fast Fourier Transform, 快速傅里叶变换) 是离散傅里叶变换的快速算法,也是数字信号处理技术中经常会提到的一个概念。用快速傅里叶变换能将时域的数字信号转换为频域信号,转换为频域信号后我们可以很方便地分析出信号的频率成分。

当我们把双频信号FFT示例中的 fft_size 的值改为 2**12 时,这时,基频为 16Hz,不能被 1kHz整除,所以 1kHz 处发生了频谱泄露,而它能被 4kHz 整除,所以 4kHz 可以很好地被采样。

由于波形的前后不是连续的,出现波形跳变,而跳变处有着非常广泛的频谱,因此FFT的结果中出现了频谱泄漏。

为了减小FFT所截取的数据段前后的跳变,可以对数据先乘以一个窗函数,使得其前后数据能平滑过渡。常用的hanning窗函数的定义如下:

50Hz 正弦波与hann窗函数乘积之后的重复波形如下:

我们对频谱泄漏示例中的1kHz 和 4kHz 信号进行了 hann 窗函数处理,可以看出能量更加集中在 1kHz 和 4kHz,在一定程度上抑制了频谱泄漏。

以 1kHz 三角波为例,我们知道三角波信号中含有丰富的频率信息,它的傅里叶级数展开为:

当数字信号的频率随时间变化时,我们称之为扫频信号。以频率随时间线性变化的扫频信号为例,其数学形式如下:

其频率随时间线性变化,当我们在 [0,1] 的时间窗口对其进行采样时,其频率范围为 0~5kHz。当时间是连续时,扫频信号的频率也是连续的。但是在实际的处理中,是离散的点采样,因此时间是不连续的,这就使扫频信号的快速傅里叶变换问题退化为多点频信号快速傅里叶变换问题。其快速傅里叶变换得到的频谱图如下所示:

以 50Hz 正弦信号相位调制到 1kHz 的信号为例,其信号形式如下:

它的时域波形,频率响应和相位响应如下图所示:

以扫频信号为例,当我们要探究FFT中的能量守恒时,我们要回归到信号最初的形式:

import pandas as pd

方法一:

先利用to_datetime转换为时间格式,tm列的数据形式为'yyyy-MM-dd HH:mm:ss'

df['tm_1'] = pd.to_datetime(df['tm_1'])

df['tm_2'] = pd.to_datetime(df['tm_2'])

利用".dt.seconds"转换为秒,除以相对于的间隔数得到分钟、小时等

df['diff_time'] = (df['tm_1'] - df['tm_2']).dt.seconds/3600

利用round函数可进行四舍五入

df['diff_time'] = round(df['diff_time'])

方法二,日期相减变为小时;变为天的话将h替换为D即可:

df['diff_time'] = (df['tm_1'] - df['tm_2']).values/np.timedelta64(1, 'h')

方法1:import datetimestarttime = datetime.datetime.now()#long running#do something otherendtime = datetime.datetime.now()print (endtime - starttime).secondsdatetime.datetime.now()获取的是当前日期,在程序执行结束之后,这个方式获得的时间值为程序执行的时间。方法2:start = time.time()#long running#do something otherend = time.time()print end-starttime.time()获取自纪元以来的当前时间(以秒为单位)。如果系统时钟提供它们,则可能存在秒的分数。所以这个地方返回的是一个浮点型类型。这里获取的也是程序的执行时间。