频域特征提取的Python实现(频谱、功率谱、倒频谱)

频域特征提取的Python实现(频谱、功率谱、倒频谱)

本文只对 频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 做代码翻译,用python重写一遍,以加强对这些特征的理解

1. 频谱

from scipy.fftpack import fft, fftshift, ifft

from scipy.fftpack import fftfreq

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

t_s = 0.01

t_start = 0.5

t_end = 5

t = np.arange(t_start, t_end, t_s)

f0 = 5

f1 = 20

# generate the orignal signal

y = 1.5*np.sin(2*np.pi*f0*t) + 3*np.sin(2*np.pi*20*t) + np.random.randn(t.size)

# fft

Y = fft(y)

# fftshift

shift_Y = fftshift(Y)

# the positive part of fft, get from fft

pos_Y_from_fft = Y[:Y.size//2]

# the positive part of fft, get from shift fft

pos_Y_from_shift = shift_Y[shift_Y.size//2:]

# plot the figures

plt.figure(figsize=(10, 12))

plt.subplot(511)

plt.plot(y)

plt.subplot(512)

plt.plot(np.abs(Y))

plt.subplot(513)

plt.plot(np.abs(shift_Y))

plt.subplot(514)

plt.plot(np.abs(pos_Y_from_fft))

plt.subplot(515)

plt.plot(np.abs(pos_Y_from_shift))

plt.show()


2. 功率谱

fs = 1000
num_fft = 1024;

# generate original signal
t = np.arange(0, 1, 1/fs)
f0 = 100
f1 = 200
x = np.cos(2*np.pi*f0*t) + 3*np.cos(2*np.pi*f1*t) + np.random.randn(t.size)

# FFT
Y = fft(x, num_fft)
Y = np.abs(Y)

# power spectrum
ps = Y**2 / num_fft

# power spectrum using correlate
cor_x = np.correlate(x, x, 'same')
cor_X = fft(cor_x, num_fft)
ps_cor = np.abs(cor_X)
ps_cor = ps_cor / np.max(ps_cor)


plt.figure(figsize=(15, 12))
plt.subplot(511)
plt.plot(x)

plt.subplot(512)
plt.plot(20*np.log10(Y[:num_fft//2]))

plt.subplot(513)
plt.plot(20*np.log10(ps[:num_fft//2]))

plt.subplot(514)
plt.plot(20*np.log10(ps_cor[:num_fft//2]))

plt.show()
 

 

3. 倒频谱

fs = 1000
num_fft = 1024
t = np.arange(0, 5, 1/fs)
y1 = 10*np.cos(2*np.pi*5*t) + 7*np.cos(2*np.pi*10*t) + 5*np.cos(2*np.pi*20*t) + np.random.randn(t.size)
y2 = 20*np.cos(2*np.pi*50*t) + 15*np.cos(2*np.pi*100*t) + 25*np.cos(2*np.pi*200*t) + np.random.randn(t.size)
y = y1*y2

Y1 = fft(y1, num_fft)
Y1 = np.abs(Y1)

Y2 = fft(y2, num_fft)
Y2 = np.abs(Y2)

Y = fft(y, num_fft)
Y = np.abs(Y)

spectrum = np.fft.fft(y, n=num_fft)
ceps = np.fft.ifft(np.log(np.abs(spectrum))).real


plt.figure(figsize=(20, 12))
plt.subplot(331)
plt.plot(y1)

plt.subplot(332)
plt.plot(y2)

plt.subplot(333)
plt.plot(y)

plt.subplot(334)
plt.plot(Y1[:num_fft//2])

plt.subplot(335)
plt.plot(Y2[:num_fft//2])

plt.subplot(336)
plt.plot(Y[:num_fft//2])

plt.show()
 

plt.figure(figsize=(10, 5))
plt.plot(np.abs(ceps)[:num_fft//2])
plt.ylim([0, 0.2])
plt.show()


 

 

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值