语谱图(一) Spectrogram 的定义与机理

语谱图(一) Spectrogram 的定义与机理

; 1. 语谱图 spectrogram

在音频、语音信号处理领域,我们需要将信号转换成对应的语谱图(spectrogram),将语谱图上的数据作为信号的特征。

语谱图的横坐标是时间,纵坐标是频率,坐标点值为语音数据能量。由于是采用二维平面表达三维信息,所以能量值的大小是通过颜色来表示的,颜色深,表示该点的语音能量越强。

语谱图(一) Spectrogram 的定义与机理

2. 语谱图形成过程

  1. 信号预加重
  2. 对信号进行分帧加窗,进行STFT, 得到每帧信号的频谱图;
  3. 对频谱图进行旋转 加映射;
  4. 将变换后的多帧频谱进行拼接, 形成语谱图;

3. 语谱图的具体实现步骤

3.1 预加重

因为语音信号的功率谱随频率的增加而减小,

导致语音的大部分能量都集中在低频部分

从而导致高频部分的信噪比很低。
因此一般使用一阶高通滤波器去提升信号在高频部分的信噪比。

对语音进行完预加重后,然后就是分帧加窗操作;

3.2 分帧与加窗

对于一段语音,以10ms~30ms 为一帧,为了保证帧与帧之间平滑过渡保持连续性,帧与帧之间会有重叠。

一段语音信号 x(t) , 通过分帧之后, 数据由一维信号变为二维信号;

分帧之后,变为x(m,n)
m为帧长, 代表每一帧的长度;
n 为帧的个数, n 列代 n个帧;

语谱图(一) Spectrogram 的定义与机理

3.3 语谱图的形成原理

3.3.1 频谱spectrum 的产生

将每一帧的数据都进行FFT变换(严格来讲, 每帧数据加窗后做FFT , 称之为STFT),由x(m,n) 得到X(m,n)。

X(m,n) 称作频谱, 反应了频率与能量之间的关系。

频谱图:

语谱图(一) Spectrogram 的定义与机理

在实际使用中,频谱图有三种,即

  1. 线性振幅谱、
  2. 对数振幅谱: (对数振幅谱中各谱线的振幅都作了对数计算,所以其纵坐标的单位是dB分贝)
  3. 自功率谱

这个变换的目的是使那些振幅较低的成分相对高振幅成分得以拉高,以便观察掩盖在低幅噪声中的周期信号

语谱图(一) Spectrogram 的定义与机理
上图反应了,每帧信号对其做FFT 变换(更具体点,是通过短时FFT计算)。

每帧语音都对应于一个频谱spectrum, 如图中spectrum 所示。

注意:短时傅立叶变换(STFT),返回一个复数矩阵使得D(f,t)
复数的实部:np.abs(D(f,t))频率的振幅
复数的虚部:np.angle(D(f,t))频率的相位

; 3.3.2 单帧语音的频谱处理

语谱图(一) Spectrogram 的定义与机理
我们取出其中一帧语音的频谱,做如下处理:
  1. 原始一帧语音的频谱,换一种表达方式,使用坐标表示出来, 横轴代表频率, 纵轴代表幅度值;
  2. 将该坐标轴旋转 90 度,横轴代表幅度值,纵轴代表频率;
  3. 对幅度值进行映射,通过量化的方式,0表示白,255表示黑色。幅度值越大,相应的区域越黑, 从而去除了幅度值,这个维度, 多出一个维度用作表达其他信息;

至此,我们应该明白,对频谱图进行上述操作,
是为了去除了幅度值这个维度, 多出一个维度用作表达 时间这个维度信息

3.3.3 对多帧语音的频谱进行拼接

  1. 对多帧频谱, 重复上述单帧频谱的操作;
  2. 将变换后的多帧频谱, 在时间维度上,进行拼接, 从而形成了多帧信号的语谱图;
    语谱图(一) Spectrogram 的定义与机理
    这样就可以显示一段语音而不是一帧语音的功率谱,而且可以直观的看到静态和动态的信息。

; 3.4 STFT的运行流程

  1. 概念——STFT短时傅里叶变换:STFT短时傅里叶变换,实际上是对一系列加窗数据做FFT。有的地方也会提到DCT(离散傅里叶变换),而DCT跟FFT的关系就是:FFT是实现DCT的一种快速算法。
  2. 概念——声谱图:对原始信号进行分帧加窗后,可以得到很多帧,对每一帧做FFT(快速傅里叶变换),傅里叶变换的作用是把时域信号转为频域信号,把每一帧FFT后的频域信号(频谱图)在时间上堆叠起来就可以得到声谱图。
  3. FFT有个参数N_fft, 简写为N,表示对一帧内多少个点做FFT,如果一帧里面的点的个数小于N就会zero-padding到N的长度。每个点对应一个频率区间, 频率区间是等间隔,即频率分辨率:
    f r e q b i n = F s N f f t freq_{bin} = \frac{F_s}{N_{fft}}f re q bin ​=N ff t ​F s ​​

已知,stft 出来的矩阵是[ 1+N f f t 2 \frac{N_{fft}}{2}2 N ff t ​​, n_frames], 则纵轴,频率轴的划分为这么多份,小n 属于[1, 1+N f f t 2 \frac{N_{fft}}{2}2 N ff t ​​ ]

  • 某一点n(n从1开始)表示的频率为F n = ( n − 1 ) ∗ F s / N F_n=(n−1)∗Fs/N F n ​=(n −1 )∗F s /N,
  • 第一个点(n=1,Fn等于0)表示直流信号,
  • 纵坐标的中间点, 代表该频率bin 所对应的频率;
  • 最后一个点为 1+N f f t 2 \frac{N_{fft}}{2}2 N ff t ​​, 代表的是采样频率的一半,即Fs/2。

  • FFT后我们可以得到N个频点,比如,采样频率为16000,N为1600,那么FFT后就会得到1600个点,FFT得到的1600个值的模可以表示1600个频点对应的振幅。因为FFT具有对称性,当N为偶数时取N/2+1个点,当N为奇数时,取(N+1)/2个点,比如N为512时最后会得到257个值。

4. 为什么需要语谱图?

因为声谱图中有很多重要的特征, 比如音素特征;
共振峰特征(formants 即频谱图中的峰值)
以及观察他们的转变趋势, 可以更好的识别音频;

  • 语音信号的时间-频率表示方法:
  • 语谱图是研究语音(音素Phone)的工具
  • 语音学家对音素Phone及其特性进行直观研究
  • 隐马尔科夫模型隐含了语音到文本系统的语谱图模型
    有助于评估文本到语音系统——一个高质量的文本到语音系统应该产生合成语音,其频谱图应该与自然句子几乎一致

语谱图(一) Spectrogram 的定义与机理
语谱图(一) Spectrogram 的定义与机理

; 5. 频谱与语谱图之间的关系

从上述分析, 单帧的信号的频谱可以看出,

语谱图这个概念的出现, 是为了弥补频谱图,丢失了时间这个维度的信息, 故而增加了时间这个维度。

具体的方式, 就是将频谱中的幅度值 这个维度替换掉(使用颜色的深度来表示),从多出了一个维度;

而这个多出的维度, 便是留作扩展出,时间这个维度的信息;

所以, 语谱图使用二维的表现形式, 涵盖了三个维度的信息
(纵轴:频率, 横轴: 时间; 颜色深度: 幅度值大小)

6. 语谱图的coding:

代码实现:

import matplotlib.pyplot as plt
import librosa
import numpy as np
import soundfile as sf
import python_speech_features as psf
import librosa
import librosa.display

def preemphasis(signal, coeff=0.95):
    return np.append(signal[1], signal[1:] - coeff * signal[:-1])

def pow_spec(frames, NFFT):
    complex_spec = np.fft.rfft(frames, NFFT)
    return 1 / NFFT * np.square(np.abs(complex_spec))
def frame_sig(sig, frame_len, frame_step, win_func):
    '''
    :param sig: 输入的语音信号
    :param frame_len: 帧长
    :param frame_step: 帧移
    :param win_func: 窗函数
    :return: array of frames, num_frame * frame_len
    '''
    slen = len(sig)

    if slen  frame_len:
        num_frames = 1
    else:

        num_frames = 1 + int(np.ceil((slen - frame_len) / frame_step))

    padlen = int( (num_frames - 1) * frame_step + frame_len)

    zeros = np.zeros((padlen - slen,))
    padSig = np.concatenate((sig, zeros))

    indices = np.tile(np.arange(0, frame_len), (num_frames, 1)) + np.tile(np.arange(0, num_frames*frame_step, frame_step), (frame_len, 1)).T
    indices = np.array(indices, dtype=np.int32)
    frames = padSig[indices]
    win = np.tile(win_func(frame_len), (num_frames, 1))
    return frames * win

y, sr = sf.read('q1.wav')

y = preemphasis(y, coeff=0.98)

frames = frame_sig(y, frame_len=2048, frame_step=512, win_func=np.hanning)

feature = pow_spec(frames, NFFT=2048)

librosa.display.specshow(librosa.power_to_db(feature.T),sr=sr, x_axis='time', y_axis='linear')
plt.title('Spectrogram')
plt.colorbar(format='%+2.0f dB')
plt.tight_layout()
plt.show()

Original: https://blog.csdn.net/chumingqian/article/details/123019808
Author: mingqian_chu
Title: 语谱图(一) Spectrogram 的定义与机理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/795774/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python递归和迭代

    python递归和迭代 1、递归和迭代都是循环的一种。 简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,迭代和递归过程都可以无限进行 2、递归与迭代都是基于…

    Python 2023年6月12日
    059
  • 场景之多数据源查询及数据下载问题

    前言:本文将介绍常用后台功能中的数据获取以及下载的一些注意事项和实现。 承接上文数据分页查询当通过分页查询到数据之后,接着还会遇到其他需求: 继续其他数据源查询:分页查询到的数据并…

    Python 2023年6月16日
    096
  • Pandas常用累计、同比、环比等统计方法实践案例

    统计表中常常以本年累计、上年同期(累计)、当期(例如当月)完成、上月完成为统计数据,并进行同比、环比分析。如下月报统计表所示样例,本文将使用Python Pandas工具进行统计。…

    Python 2023年8月21日
    086
  • 折腾一晚上的事情,明白了一个道理

    感悟:有时候很简单的笨办法,比那些高大上的技术要实用的多。 有一个数据同步,大约4亿条记录,没有分区。现在要按照天,小时分区写入到iceberg的分区表中。源数据中本身就是很多几十…

    Python 2023年10月23日
    031
  • 总看一个主播多没意思,用python给女主播做一个颜值排名,只看颜值高的!

    众所周知,能上线的女主播一般还可以,但两三个人肉眼就能看出谁长得好看,但几百个人是看不见的。 [En] As we all know, female anchors who can…

    Python 2023年5月24日
    093
  • 给我爬!3天掌握Scrapy(一)

    大家好,欢迎来到二哥的爬虫频道,本次二哥准备爆更三天给大家带来Scrapy教程,记得三连呦~ 一、认识Scrapy Scrapy是一个为了爬取网站数据,提供结构性数据而编写的应用框…

    Python 2023年10月2日
    060
  • Python-Django-模型

    一、ORM 模型介绍 对象关系映射(英语:(Object Relational Mapping,简称ORM,或ORM,或OR mapping),是一种程序技术,用于实现面向对象编程…

    Python 2023年8月5日
    079
  • 【iVX 开发 – 入门】UI 组件介绍及实操详解

    本文导读 * – 写在前面 – iVX 各 UI 组件及属性面板详解 – + 1. 图片组件 + 2. 图片序列组件 + 3. 文本组件 + 4…

    Python 2023年11月5日
    067
  • python 装饰器

    常用@classmethod、@staticmethod这个装饰器,装饰器的作用简单来讲就是我们在很多地方可能都会用到一下相同的功能,这时我们会有两种想法。 这两种方式各有好处,我…

    Python 2023年11月9日
    031
  • 利用Python进行数据分析 PDF完整版

    【名人推荐】 “科学计算和数据分析社区已经等待这本书很多年了:大量具体的实践建议,以及大量综合应用方法。本书在未来几年里肯定会成为Python领域中技术计算的权威指南。…

    Python 2023年11月3日
    055
  • python-pygame实现飞机大战-4-获取补给、发射强化子弹以及放大招清屏

    承接上两步:1. python-pygame实现飞机大战-添加背景以及飞机运动2. python-pygame实现飞机大战-2-添加敌机以及碰撞爆炸3. python-pygame…

    Python 2023年9月22日
    056
  • .stl 转ply

    import open3d as o3d mesh = o3d.io.read_triangle_mesh("80390865_shell_occlusion_l.stl…

    Python 2023年6月6日
    074
  • Qt

    1、Qt简介 Qt是一个跨平台的应用程序C++开发类库,支持Windows、Linux、macOS等各种桌面平台,也支持iOS、Android等移动平台,还支持各种嵌入式系统,是应…

    Python 2023年6月11日
    068
  • python函数之内置函数 模块

    abs 绝对值函数 round 四舍五入 奇进偶不进 n.5的情况特定发生 sum 计算一个序列得和 max 获取一个序列里边的最大值 min 获取一个序列里边的最小值 max /…

    Python 2023年11月9日
    040
  • 小戴媒体播放器4 1.37

    小戴媒体播放器4 用Python3编写,需要安装TK和Pygame,能显示目录树,并播放mp3文件,在Ubuntu 20.04(22.04)/Linux Mint 20(Pytho…

    Python 2023年9月18日
    047
  • pytest+allure生成自动化测试报告

    pytest和allure组合生成展示漂亮测试结果 pytest:收集测试用例,执行测试用例,生成allure可以解析的测试结果文件allure:对pytest生成的测试结果文件进…

    Python 2023年9月13日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球