在研究FFT的时候发现给不同的采样点数,FFT的结果不同,遂有研究此现象的想法(实际结果是相同的,只不过我当时不懂,没设置正确的频率显示范围)
————————————————————————————
首先先搞出来一个波来研究,波的参数如下:
from math import *
import numpy as np
from matplotlib import pyplot as plt
from scipy.fftpack import fft, fftshift
Fs = 1000 # 采样频率
N = 2 # 采样总时间
T = np.linspace(0, N, Fs * N) # 一系列采样点对应的时间
f1 = 100 # 第一个正弦波的频率
f2 = 40 # 第二个正弦波的频率
Wav = [200 * sin(2 * pi * f1 * t) + 100 * sin(2 * pi * f2 * t) for t in T] # 合成波,幅值为200和100
看一下波的形状:
plt.figure(figsize=(10, 6), dpi=150)
plt.plot(np.arange(0, 1000), Wav[0:1000])
先设置采样点数为2000,进行FFT,并输出结果图像:
N_ = 2000 # 采样数
FFT = fft(Wav[0:N_])
FFT = abs(FFT) / len(FFT)
plt.figure(figsize=(10, 6), dpi=150)
plt.plot(np.linspace(0, 400 * Fs / N_, 400), FFT[0:400])
这段代码里最重要的就是np.linspace(0, 400 * Fs / N_, 400)
他把我们不同采样数对应的FFT的结果频率转化为我们设置的Fs频率范围下,这样我们才能看到正确的结果
参考:离散傅里叶变换(DFT)
之所以有一个400是因为原长度太长了,不太好看结果频率在哪,我才设置成只取前400个FFT结果(正常这个位置是len(FFT),即采样数N_)
下面我们来看一下2000采样数的结果:
把采样数N_改成1500,再看看
1000:
500:
100:
可以说都较为准确检测出了内含的两个波段,当采样频率比较低时(100),也基本可以看出来结果,所以更改采样点数对结果基本没有影响(只要不是太低)