- 观察信号的频谱
数据通过FFT转换成频域信号,对频域信号进行分析,再通过IFFT转换成时域信号。
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import numpy as np
import pylab as pl
import matplotlib as mpl
mpl.rcParams[ 'font.sans-serif' ] = [ 'KaiTi' ]
mpl.rcParams[ 'font.serif' ] = [ 'KaiTi' ]
mpl.rcParams[ 'axes.unicode_minus' ] = False
sampling_rate = 8000 #取样频率
fft_size = 512 #fft长度
t = np.arange( 0 , 1.0 , 1.0 / sampling_rate)
#假设取样频率为fs, 取波形中的N个数据进行FFT变换。那么这N点数据包含整数个周期的波形时,FFT所计算的结果是精确的。于是能精确计算的波形的周期是: n*fs/N。
#对于8kHz取样,512点FFT来说,8000/512.0 = 15.625Hz,前面的156.25Hz和234.375Hz正好是其10倍和15倍。
#选取整数倍的数据,查看当fft后的数据在频谱中形成整数周期时的情况。
x = np.sin( 2 * np.pi * 156.25 * t) + 2 * np.sin( 2 * np.pi * 234.375 * t)
#选取非整数倍的数据,查看当fft后的数据在频谱中没有形成非整数周期时的情况。
x = np.sin( 2 * np.pi * 200 * t) + 2 * np.sin( 2 * np.pi * 300 * t)
xs = x[:fft_size] #取数据
xf = np.fft.rfft(xs) / fft_size #rfft:对实数信号进行FFT变换。/fft_size是为了正确显示波形能量
freqs = np.linspace( 0 , sampling_rate / 2 , fft_size / 2 + 1 ) #fft_size/2+1个点,后面的是与前面的共轭
#计算每个频率分量的幅值,并通过 20*np.log10() 将其转换为以db(分贝)为单位的值
xfp = 20 * np.log10(np.clip(np. abs (xf), 1e - 20 , 1e100 )) #clip将数据限制在最小值和最大值之间
pl.figure(figsize = ( 8 , 4 )) #新建一个8*4英寸的图纸
pl.subplot( 211 ) #绘制2行1列的图纸,这个图形占据第一行
pl.plot(t[:fft_size], xs)
|