音乐分类

傅里叶变换

傅里叶原理:任何连续测量的时序信号,都可以表示为不同频率的正弦波信号的无限叠加。
时域分析:对一个信号来说,信号强度随时间的变化的规律就是时域特性,例如一个信号的时域波形可以表达信号随着时间的变化。
频域分析:对一个信号来说,在对其进行分析时,分析信号和频率有关的部分,而不是和时间相关的部分,和时域相对。也就是信号是由哪些单一频率的的信号合成的就是频域特性。频域中有一个重要的规则是正弦波是频域中唯一存在的波。即正弦波是对频域的描述,因为时域中的任何波形都可用正弦波合成。
一般来说,时域的表示较为形象直观,频域分析则简练。傅里叶变换是贯穿时域和频域的方法之一,傅里叶变换就是将难以处理的时域信号转换成了易于分析的频域信号。

在这里插入图片描述

对音频文件傅里叶变化

对wav文件进行傅里叶变化

from scipy import fft
from scipy.io import wavfile
from matplotlib.pyplot import specgram
import matplotlib.pyplot as plt


# 对单首音乐进行傅里叶变换
# 画框设置figsize=(9, 6)宽度和高度的英寸,dpi=80是分辨率
plt.figure(figsize=(9, 6), dpi=80)
# sample_rate代表每秒样本的采样率,X代表读取文件的所有信息 音轨信息,这里全是单音轨数据  是个数组【双音轨是个二维数组,左声道和右声道】
# 采样率:每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示
sample_rate, X = wavfile.read("D:/music/jazz/converted/jazz.00001.au.wav")
print(sample_rate, X, type(X), len(X))
plt.subplot(211)
# 画wav文件时频分析的函数
specgram(X, Fs=sample_rate)
plt.xlabel("time")
plt.ylabel("frequency")

plt.subplot(212)
# fft 快速傅里叶变换  fft(X)得到振幅 即当前采样下频率的振幅
fft_X = abs(fft(X))
print("fft_x", fft_X, len(fft_X), type(fft_X))
# 画频域分析图  Fs是采样率
specgram(fft_X, Fs=sample_rate)
plt.xlabel("frequency")
plt.ylabel("amplitude")
plt.savefig("D:/music/jazz.00000.au.wav.fft.png")
plt.show()

在这里插入图片描述

对所有的音乐进行傅里叶变化,可以获取一组数组。然后根据其原来所对应的分类,进行逻辑回归训练,


from sklearn.linear_model import LogisticRegression

X =  .... # 是所有数据的值
Y = ...   # 是所有数据的label

model = LogisticRegression()
model.fit(X, Y)


# 如果对一个新的wav文件进行分类,先进行傅里叶变换,然后使用模型进行预测
sample_rate, test = wavfile.read("./test.wav")
print(sample_rate, test, len(test))
testdata_fft_features = abs(fft(test))[:1000]
# model.predict(testdata_fft_features) 预测为一个数组,array([类别])
type_index = model.predict([testdata_fft_features])
// 根据type_index找出对应的类别

发布了45 篇原创文章 · 获赞 1 · 访问量 5130

猜你喜欢

转载自blog.csdn.net/weixin_41634974/article/details/104094679