python画信号频谱(fft)

直接上函数

def plotsig(sig,strname):
    #fig=plt.figure(figsize=(8, 6))
    plt.cla()
    plt.grid(linestyle="--")  # 设置背景网格线为虚线
    ax = plt.gca()
    plt.subplot(211)
    plt.cla()
    plt.title("distance:"+strname, fontsize=12, fontweight='bold')
    plt.plot(np.arange(0,1024), sig)  
    fft_size = 1024  # FFT处理的取样长度
    #y = y1 + y2 * 1j
    fs = fft_size 
    sampling_rate = fs
    xs = sig[:fft_size]  # 从波形数据中取样fft_size个点进行运算
    xf = np.fft.rfft(xs) / fft_size  # 利用np.fft.rfft()进行FFT计算,rfft()是为了更方便对实数信号进行变换,由公式可知/fft_size为了正确显示波形能量
    freqs = np.linspace(0, int(sampling_rate / 2), int(fft_size / 2 + 1))
    #xfp = 20 * np.log10(np.clip(np.abs(xf), 1e-20, 1e100))
    xfp = np.abs(xf)
    plt.subplot(212)
    plt.cla()
    plt.plot(freqs[:int(fft_size / 2)]*500/1024, xfp[:int(fft_size / 2)])
    plt.xlim(0, 50)
    plt.xticks(np.arange(0,50,5), np.arange(0,50,5), fontsize=10)  # 默认字体大小为10
    plt.xlabel("Hz", fontsize=13, fontweight='bold')
    plt.savefig(strname+'fft.png',format='png',bbox_inches='tight')

频率分辨率计算: 采样率(Fs)/点数(N)
这里的分辨率就是500 Hz / 1024=0.4882 Hz

同一个信号:

一、功率谱

fft使用

xfp = np.abs(xf) 

复数取模求得功率谱,如下图
python画信号频谱(fft)_第1张图片

二、功率增益

10 Log代表能量功率增益的换算
20 Log代表电压增益的换算

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

python画信号频谱(fft)_第2张图片

你可能感兴趣的:(信号处理,信号处理,numpy)