声信号特征提取是运用神经网络识别的前提步骤,为了提取目标的特征值,将时域信号转化成频域,不同目标在不同的频率中的能量分布不一致,因此,将宽频传感器的输入信号利用多段滤波器分解成多频段信号,进行特征提取、建模,并采用BP模型训练和学习,从而优化声探测系统的识别能力。本项目提取声音信号频域特征。话不多说,直接上代码。代码保证可直接运行无bug,需要数据集私信我。
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft
data_1=[]
caiyang=open('D:\PycharmProjects\data\\pa5.txt', 'r', encoding='utf-8')
a=caiyang.read().split(' ')
data_1 = [c.rstrip() for c in a]
data1_1=[]
for i in data_1:
i = int(hex(int(i, 16)), 16)
data1_1.append(i)
data1 = data1_1[0::4]
data3_1 = data1_1[1::4]
data4_1 = data1_1[2::4]
data5_1 = data1_1[3::4]
x = np.linspace(1, len(data1),24000)
y = data1
plt.scatter(list(x), y, s=0.2)
plt.title('time result')
plt.show()
import numpy as np
from numpy.fft import fft
def fft_calc(x, f_s, x_size, nfft):
w = np.hanning(nfft)
cnt = x_size // nfft
if cnt == 0:
x_pad = np.pad(x, (0, nfft - x_size))
else:
x_pad = np.pad(x, (0, x_size - cnt * nfft))
cnt = len(x_pad) // nfft
tmp = []
for i in range(cnt):
p = fft(w * x_pad[i * nfft:(i+1) * nfft])
tmp.append(p)
fft_result = np.mean(tmp, axis=0)
amp = abs(fft_result)*2 / (nfft / 2)
amp[0] /= 2
amp_half = amp[:int(len(amp) / 2)+1]
freq = np.arange(int(len(amp) / 2)+1) * f_s/nfft
return amp_half, freq
pi = np.pi # 圆周率
N=24000
fs=12000#采样频率
T = 1/12000#周期
tn = np.arange(0,T*N,T)
nfft = fs
(amp,freq)=fft_calc(data1,fs,N,nfft)
print(len(freq))
amp[0]=0
amp[1]=0
amp[2]=0
amp[3]=0
amp[4]=0
amp[5]=0
amp[6]=0
amp[7]=0
amp[8]=0
amp[9]=0
amp[10]=0
amp[50]=0
plt.bar(freq, amp/2,width=20)
plt.subplot(111) #频谱
plt.plot(freq, amp, color="blue")
plt.title('FFT result')
plt.xlabel('Freq /Hz')
plt.ylabel('urad/Hz')
plt.grid(which='both', axis='both')
plt.show()