Python频域信号处理

FFT

FFT(快速傅立叶变换),是数字信号处理中一种很重要的方法。傅立叶原理表明:任何连续测量的时域或信号,都可以表示为不同频率的正弦信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。

和傅立叶变换算法对应的是IFFT(反傅立叶变换算法)。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用反傅立叶变换将这些频域信号转换成时域信号。

假设FFT之后某点n用复数 a + b i a+bi a+bi表示,那么这个复数的模就是 A n = s q r t ( a 2 + b 2 ) A_{n} = sqrt(a^{2} + b^{2}) An=sqrt(a2+b2)。(某点处的幅度值 A n = A ( N / 2 ) A_{n} = A(N/2) An=A(N/2)

观察信号频谱

将时域信号通过FFT转换为频域信号之后,将其各个频率分量的幅值绘制成图,可以很直观的观察信号的频谱。

import numpy as np
import pylab as pl

sampling_rate = 8000
fft_size = 512
t = np.arange(0, 1.0, 1.0/sampling_rate)
x = np.sin(2*np.pi*156.25*t) + 2*np.sin(2*np.pi*234.375*t)
xs = x[:fft_size]
xf = np.fft.rfft(xs) / fft_size

下面逐行对这个程序进行解释:
首先定义两个常数:sampling_rate, fft_size,分别表示数字信号的取样频率和FFT长度。
然后调用np.arange产生1秒钟的取样时间,t中的每个数值直接表示取样点的时间,因此其间隔为取样周期1/sampline_rate:

t = np.arange(0, 1.0, 1.0/sampling_rate)

用取样时间数组t可以很方便地调用函数计算出波形数据,这里计算的是两个正弦波的叠加,一个频率是156.25Hz,一个是234.375Hz:

x = np.sin(2*np.pi*156.25*t)  + 2*np.sin(2*np.pi*234.375*t)

为什么选择这两个奇怪的频率呢?因为这两个频率的正弦波在512个取样点中正好有整数个周期。满足这个条件波形的FFT结果能够精确的反映其频谱。
假设取样频率为fs,取波形中的N个数据进行FFT变换。那么这N点数据包含整数个周期的波形时,FFT所计算的结果是精确的。于是能精确计算的波形的周期是: n ∗ f s / N n*fs/N nfs/N。对于8kHz取样,512点FFT来说,8000/512.0 = 15.625Hz,前面的156.25Hz和234.375Hz正好是其10倍和15倍。


下面就从波形数据x中截取fft_size个点进行fft计算。np.fft库提供了一个rfft函数,它方便我们对实数信号进行FFT计算。根据FFT计算公式,为了正确显示波形能量,还需要将rfft函数的结果除以fft_size:

xs = x[:fft_size]
xf = np.fft.rfft(xs)/fft_size

rfft函数的返回值是N/2+1个复数,分别表示从0(Hz)到sampling_rate/2(Hz)的N/2+1点频率的成分。于是可以通过下面的np.linspace计算出返回值中每个下标对应的真正的频率:


N个采样点经过FFT变换后得到N个点的以复数形式记录的FFT结果。


freqs = np.linspace(0, sampling_rate/2, fft_size/2+1)

最后我们计算每个频率分量的幅值,并通过 20*np.log10() 将其转换为以db单位的值。为了防止0幅值的成分造成log10无法计算,我们调用np.clip对xf的幅值进行上下限处理:

xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e100))

剩下的程序就是将时域波形和频域波形绘制出来,这里就不再详细叙述了。此程序的输出为:
Python频域信号处理_第1张图片

Reference:
http://bigsec.net/b52/scipydoc/frequency_process.html
https://www.jb51.net/article/163189.htm
https://www.jianshu.com/p/d5c011776ac0
http://blog.sina.com.cn/s/blog_40793e970102w3lo.html
https://blog.csdn.net/jum_summer/article/details/89472324
http://www.elecfans.com/d/601620.html
https://www.cnblogs.com/jingsupo/p/9989587.html

你可能感兴趣的:(Signal,Processing)