对主流的音频格式进行解析以后,绘制出了声音的波形。一段音频的特征,需要在这段波形中寻找。在这里,会用到一些基础的数学知识,在文中只是简略的用文字进行原理的说明。

在数学中有提到,任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示。这段话如果用不太严谨语言,可以这样来理解,对一段的曲线来说,我们都可以用一组正弦曲线和余弦曲线叠加而成。这样一来,曲线就分解为一个一个正弦曲线和余弦曲线的叠加,只要知道主要的正弦和余弦曲线,就能够来表示这一段曲线的特征。

那正弦和余弦我们这么能够来表示曲线的特征呢?

在正弦和余弦中,每一条正弦和余弦都有自己的振幅和频率,振幅和频率就能代表正弦或者余弦的特征。

还有一个问题是需要有无穷多的正弦和余弦来拟合这条曲线,那特征不也是无效多个,在这里我们只取振幅较大的正余弦,也就是这几条正余弦主要构成了这条曲线,这是问题的主因。

寻找曲线的特征变成了选择构成主要正余弦的频率。

在工程中,有时域和频域的不同表示,现在我们需要频率的东西,需要把时域转换到频域中,转换的方法为傅里叶变换

在实验中,先模拟一条曲线,在通过曲线的数据进行傅里叶变换后,看看能得到什么样的图形。

# -*- coding:utf-8 -*-
# /usr/bin/python2.7import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import seabornfrom matplotlib.font_manager import FontProperties
import pylab as pl
import numpy as npsampling_rate = 8000
fft_size = 512
# 156.25和234.375HZ组成的曲线
t = np.arange(0, 1.0, 1.0/sampling_rate)
x = np.sin(2*np.pi*156.25*t)  + 2*np.sin(2*np.pi*234.375*t)xs = x[:fft_size]
#进行傅里叶变换
xf = np.fft.rfft(xs)/fft_size
freqs = np.linspace(0, sampling_rate/2, fft_size/2+1)
#归一
xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e100))#绘制时域和频域的图片
pl.figure(figsize=(8,4))
pl.subplot(211)
pl.plot(t[:fft_size], xs)
pl.xlabel(u"s")
pl.title(u"156.25Hz 234.375Hz")
pl.subplot(212)
pl.plot(freqs, xfp)
pl.xlabel(u"Hz")
pl.subplots_adjust(hspace=0.4)
pl.show()

图片如下:

在代码中,使用156.25和234.375HZ的正弦组成了一条有周期的曲线,通过傅里叶变换后发现在156.25和234.375HZ的振幅最大,也就是由这两条正弦组成了这条曲线。

还有一个问题是一开始我们是假设这条曲线是周期性的,但有时候而且是更经常的时候波形的频率是变化的。如下图可以看出。

这时候需要采用的是傅里叶的另一种形式,成为短时傅里叶变换。可以把短时傅里叶变换理解为按时间分段的进行傅里叶变换

可以通过如下的模拟,更能体现出短时傅里叶变换 的用法。

# -*- coding:utf-8 -*-
# /usr/bin/python2.7import matplotlib.pyplot as plt
import numpy as np# Fixing random state for reproducibility
np.random.seed(19680801)dt = 0.0005
t = np.arange(0.0, 20.0, dt)
s1 = np.sin(2 * np.pi * 100 * t)
s2 = 2 * np.sin(2 * np.pi * 400 * t)# create a transient "chirp"
mask = np.where(np.logical_and(t > 10, t < 12), 1.0, 0.0)
s2 = s2 * mask# add some noise into the mix
nse = 0.01 * np.random.random(size=len(t))x = s1 + s2 + nse  # the signal
NFFT = 1024  # the length of the windowing segments
Fs = int(1.0 / dt)  # the sampling frequencyfig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.plot(t, x)
Pxx, freqs, bins, im = ax2.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900)
# The `specgram` method returns 4 objects. They are:
# - Pxx: the periodogram
# - freqs: the frequency vector
# - bins: the centers of the time bins
# - im: the matplotlib.image.AxesImage instance representing the data in the plot
plt.show()

代码对s2 信号进行了处理在10 和 12之间存在数据,总的信号如果直接要用傅里叶变换,s2 信号自然会被削弱,看看短时傅里叶变换 的波形:

可以看出100Hz 的频率不管在什么时候都是存在的,而400Hz 的在10 和 12之间才出现,这能更好的拟合现实的情况。

音乐指纹识别(三):波形特征相关推荐

  1. 音乐指纹识别(二):处理mp3音乐波形

    之前已经处理完了wav文件的解析,在网络中经常出现的音频文件并不是wav文件,而是mp3文件.对于mp3文件的解析,直接使用pydub库. 安装 pydub 的方法: pip install pydu ...

  2. 【图像识别-指纹识别】指纹特征提取附matlab代码

    1 内容介绍 ​一 指纹增强 采用Lin Hong等人提出的基于Gabor滤波的方法进行指纹增强,可分为以下步骤: 标准化:标准化是把图像的平均灰度和方差调整到预定的级别上,以减少脊线上的灰度差异,方 ...

  3. 信息收集----CMS指纹识别

    一.什么是指纹识别 通过关键特征,识别出目标的CMS系统,服务器,开发语言,操作系统,CDN,WAF的类别版本等等 1.识别对象 1.CMS信息:比如Discuz,织梦,帝国CMS,PHPCMS,EC ...

  4. java web指纹采集_Web指纹识别的介绍与编写

    一. 前言 Web指纹是Web服务组件在开发时留下的对其类型及版本进行标识的特殊信息,包括Web服务器指纹.Web运用指纹以及前端框架指纹等.在Web安全测试过程中,收集Web指纹信息也是一个比较重要 ...

  5. 信息收集域名、IP、端口服务、指纹识别相关信息

    信息收集域名.IP.端口服务.指纹识别.Googlehacking.目录信息.Githack相关信息 域名相关的信息 域名是什么 域名的分类 国际域名 国别域名 新顶级域名 域名联系人信息 whois ...

  6. 【WAX云钱包】Cloudflare反爬虫突破(SSL指纹识别)

    WAX云钱包 在之前的多篇文章中,我们使用[Python]+[Selenium]来实现WAX链游脚本,主要是因为很多玩家一开始都是用WAX云钱包注册的账号,而WAX云钱包的私钥托管在云端,我们没法拿到 ...

  7. 指纹识别研究(一) 指纹的三级特征

    本文部分内容摘自书籍 Handbook of fingerprint recognition P111-P115 大多数指纹识别和分类算法都采用特征提取阶段来识别显著特征. 从指纹图像中提取的特征通常 ...

  8. 指纹识别 之 电容式、超声波和光学式 三面鼎立

    电容式指纹识别 这种技术利用指纹的电容差异来进行侦测指纹图像并进行算法识别.传感器上的电极会感知指纹的电容变化,通过测量电容值来提取指纹特征.电容式指纹识别器对指纹的要求较高,需要指纹与传感器之间有较 ...

  9. 指纹识别源代码(2)-特征点提取

    源码已经上传到github,https://github.com/charlesLucky/FingerRecognitionFromScratch.git 上图为上一步拿到的图像预处理之后的细化图. ...

最新文章

  1. MyBatis复习笔记6:MyBatis缓存机制
  2. html5 桌面定时提醒,H5界面实现桌面推送通知
  3. Mac 访达之下方显示
  4. sap.ushell.Container.getService(URLParsing) click tile using Ke's user
  5. 三千多天之前我没有编辑完的技术文档
  6. leetcode 703. 数据流中的第 K 大元素(堆)
  7. VMware vCenter 资源池
  8. AGC002E(AtCoder1999) Candy Piles(博弈论)
  9. 2013 Multi-University Training Contest 1
  10. SpringBoot 启动报 Stopping service [Tomcat]
  11. svn删除文件文件夹(遇到的问题解决)
  12. 南大被骂到上热搜!Nature杂志回应南京大学拟花120万发校庆特刊!
  13. VS之sonar插件安装
  14. PDF编辑技巧 PDF怎么修改文字
  15. error C2085: “index(随便一个形参)”: 不在形参表中
  16. 阿里PaaS平台下开发建设
  17. 苹果钱包(AppleWallet)接入操作手册,超详细
  18. 计算机领域SI单位,it领域什么是si
  19. 成功者根本没有告诉你故事的全部 (转文)
  20. 贴片元件的封装中名字后缀的L、N、M的含义

热门文章

  1. QT飞机大战六(敌机血条的添加以及特殊子弹道具)
  2. java 多重继承_Java的继承与“多重继承”
  3. php mysql primary key_简单分析MySQL中的primary key功能_MySQL
  4. 财务工作人员的实在助手,属于你的RPA神器
  5. 电子学会图形化一级编程题解析:希神吓走猫头鹰
  6. 习题9-6 按等级统计学生成绩(20 分)
  7. 更改计算机管理员用户名和密码忘记了怎么办,win10系统重置本地账户密码的方法?win10系统忘记管理员账户administrato密码怎么办?...
  8. 瑞星工程师回答云安全
  9. 计算机的影视后期论文,影视后期制作中计算机多媒体技术论文
  10. 微星970A-G43 主板 PCIE接NVME固态硬盘无法启动Win7,解决方案