频域特征提取的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()

频域特征提取的Python实现(频谱、功率谱、倒频谱)_第1张图片

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()

频域特征提取的Python实现(频谱、功率谱、倒频谱)_第2张图片

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()

频域特征提取的Python实现(频谱、功率谱、倒频谱)_第3张图片

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

频域特征提取的Python实现(频谱、功率谱、倒频谱)_第4张图片

你可能感兴趣的:(音频处理)