位置: IT常识 - 正文

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

编辑:rootadmin
语谱图(一) Spectrogram 的定义与机理

推荐整理分享语谱图(一) Spectrogram 的定义与机理(语谱图生成),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:语谱图怎么形成的,语谱图是什么,语谱图软件,语谱图的定义,语谱图是什么,语谱图的定义,语谱图是什么,语谱图的定义,内容如对您有帮助,希望把文章链接给更多的朋友!

1. 语谱图 spectrogram

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

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

2. 语谱图形成过程信号预加重对信号进行分帧加窗,进行STFT, 得到每帧信号的频谱图;对频谱图进行旋转 加映射;将变换后的多帧频谱进行拼接, 形成语谱图;3. 语谱图的具体实现步骤3.1 预加重

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

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

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

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

3.2 分帧与加窗

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

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

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

下图是分帧加窗的示例 , 这段语音被分为很多帧;

3.3 语谱图的形成原理3.3.1 频谱spectrum 的产生

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

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

频谱图:

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

线性振幅谱、

对数振幅谱:(对数振幅谱中各谱线的振幅都作了对数计算,所以其纵坐标的单位是dB分贝)。

自功率谱

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

上图反应了,每帧信号对其做FFT 变换(更具体点,是通过短时FFT计算)。

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

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

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

3.3.2 单帧语音的频谱处理

我们取出其中一帧语音的频谱,做如下处理:

原始一帧语音的频谱,换一种表达方式,使用坐标表示出来, 横轴代表频率, 纵轴代表幅度值;

将该坐标轴旋转 90 度,横轴代表幅度值,纵轴代表频率;

对幅度值进行映射,通过量化的方式,0表示白,255表示黑色。幅度值越大,相应的区域越黑, 从而去除了幅度值,这个维度, 多出一个维度用作表达其他信息;

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

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

对多帧频谱, 重复上述单帧频谱的操作;

将变换后的多帧频谱, 在时间维度上,进行拼接, 从而形成了多帧信号的语谱图; 这样就可以显示一段语音而不是一帧语音的功率谱,而且可以直观的看到静态和动态的信息。

3.4 STFT的运行流程

概念——STFT短时傅里叶变换:STFT短时傅里叶变换,实际上是对一系列加窗数据做FFT。有的地方也会提到DCT(离散傅里叶变换),而DCT跟FFT的关系就是:FFT是实现DCT的一种快速算法。

概念——声谱图:对原始信号进行分帧加窗后,可以得到很多帧,对每一帧做FFT(快速傅里叶变换),傅里叶变换的作用是把时域信号转为频域信号,把每一帧FFT后的频域信号(频谱图)在时间上堆叠起来就可以得到声谱图。

FFT有个参数N_fft, 简写为N,表示对一帧内多少个点做FFT,如果一帧里面的点的个数小于N就会zero-padding到N的长度。每个点对应一个频率区间, 频率区间是等间隔,即频率分辨率:  freqbin=FsNfftfreq_{bin} = \frac{F_s}{N_{fft}}freqbin​=Nfft​Fs​​

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

某一点n(n从1开始)表示的频率为Fn=(n−1)∗Fs/NF_n=(n−1)∗Fs/NFn​=(n−1)∗Fs/N,第一个点(n=1,Fn等于0)表示直流信号,纵坐标的中间点, 代表该频率bin 所对应的频率;最后一个点为 1+Nfft2\frac{N_{fft}}{2}2Nfft​​, 代表的是采样频率的一半,即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及其特性进行直观研究

隐马尔科夫模型隐含了语音到文本系统的语谱图模型 有助于评估文本到语音系统——一个高质量的文本到语音系统应该产生合成语音,其频谱图应该与自然句子几乎一致

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

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

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

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

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

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

6. 语谱图的coding:

代码实现:

import matplotlib.pyplot as pltimport librosaimport numpy as npimport soundfile as sfimport python_speech_features as psfimport librosaimport librosa.display# Spectrogram步骤,# Step 1: 预加重# Step 2: 分帧# Step 3: 加窗# Step 4: FFT# Step 5: 幅值平方# Step 6: 对数功率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: # np.ceil(), 向上取整 num_frames = 1 + int(np.ceil((slen - frame_len) / frame_step)) padlen = int( (num_frames - 1) * frame_step + frame_len) # 将信号补长,使得(slen - frame_len) /frame_step整除 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 * winy, 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)# FFT及幅值平方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()
本文链接地址:https://www.jiuchutong.com/zhishi/297699.html 转载请保留说明!

上一篇:let、const和var的区别(涉及块级作用域)(let,const,var区别)

下一篇:07. vue3+vite+qiankun搭建微应用前端框架,并接入vue3微应用

  • 用键盘进行选择文本只要按什么键(用键盘进行选择快捷键)

    用键盘进行选择文本只要按什么键(用键盘进行选择快捷键)

  • 手机给手机充电怎么弄(苹果手机可以手机给手机充电)

    手机给手机充电怎么弄(苹果手机可以手机给手机充电)

  • 支付宝加好友安全吗(支付宝上加好友)

    支付宝加好友安全吗(支付宝上加好友)

  • iphone 11听完语音黑屏(苹果11为什么听语音总是一半)

    iphone 11听完语音黑屏(苹果11为什么听语音总是一半)

  • 魅蓝手机自动静音怎么办(魅蓝手机自动静音怎么关)

    魅蓝手机自动静音怎么办(魅蓝手机自动静音怎么关)

  • 抖音卸载后是什么状态(抖音卸载后是什么感受)

    抖音卸载后是什么状态(抖音卸载后是什么感受)

  • 设置文档纸张为letter(设置文档纸张为横向)

    设置文档纸张为letter(设置文档纸张为横向)

  • vivox30对比华为nova6(vivox30对比华为p40拍照)

    vivox30对比华为nova6(vivox30对比华为p40拍照)

  • 传输中断是什么意思(传输文件中断会不会损坏文件)

    传输中断是什么意思(传输文件中断会不会损坏文件)

  • 钉钉可以看到学生手机浏览记录么(钉钉可以看到学生切屏吗)

    钉钉可以看到学生手机浏览记录么(钉钉可以看到学生切屏吗)

  • 抖音上直播音浪显示的是一天的还是总的?(抖音直播音浪有什么用)

    抖音上直播音浪显示的是一天的还是总的?(抖音直播音浪有什么用)

  • 华为bklal00是哪个型号(华为bklal00是什么型号)

    华为bklal00是哪个型号(华为bklal00是什么型号)

  • 天猫精灵要一直充电吗(天猫精灵要一直连着电源吗)

    天猫精灵要一直充电吗(天猫精灵要一直连着电源吗)

  • 怎么解锁微信频率过快(怎么解锁微信频道功能)

    怎么解锁微信频率过快(怎么解锁微信频道功能)

  • 拼多多商家提现有手续费吗(拼多多商家提现手续费)

    拼多多商家提现有手续费吗(拼多多商家提现手续费)

  • 苹果x摄像头黑屏原因(苹果x摄像头黑屏原因无法拍照怎么回事)

    苹果x摄像头黑屏原因(苹果x摄像头黑屏原因无法拍照怎么回事)

  • word文本框竖排变横排(word文本框竖排居中)

    word文本框竖排变横排(word文本框竖排居中)

  • word文档删除修改痕迹(word文档删除修改痕迹之后为什么右边有空白的)

    word文档删除修改痕迹(word文档删除修改痕迹之后为什么右边有空白的)

  • 华为tp保护膜要撕吗(华为自带tp保护膜还用再贴膜么)

    华为tp保护膜要撕吗(华为自带tp保护膜还用再贴膜么)

  • 微信怎样设置自动登入(微信怎样设置自己的位置)

    微信怎样设置自动登入(微信怎样设置自己的位置)

  • 学籍证明怎么打印(学籍证明怎么打出来)

    学籍证明怎么打印(学籍证明怎么打出来)

  • 微信如何转载别人的动态(微信如何转载别人的文章)

    微信如何转载别人的动态(微信如何转载别人的文章)

  • 电视家怎么看回放(电视家怎么看回放节目)

    电视家怎么看回放(电视家怎么看回放节目)

  • 焕彩桌面怎样关闭(怎么关掉焕彩桌面)

    焕彩桌面怎样关闭(怎么关掉焕彩桌面)

  • 微信突然被封怎么回事(微信突然封了怎么办)

    微信突然被封怎么回事(微信突然封了怎么办)

  • 如何加快Windows关机速度(如何加快身体的新陈代谢)

    如何加快Windows关机速度(如何加快身体的新陈代谢)

  • Linux系统中怎么安装和使用ImageMagick软件?(Linux系统中怎么定位到java代码的方法级)

    Linux系统中怎么安装和使用ImageMagick软件?(Linux系统中怎么定位到java代码的方法级)

  • Linux下的命令行串口工具minicom安装和使用教程(总结linux命令行的主要用法)

    Linux下的命令行串口工具minicom安装和使用教程(总结linux命令行的主要用法)

  • celery的介绍和使用(celery eventlet)

    celery的介绍和使用(celery eventlet)

  • 摊薄净资产收益率是什么意思
  • 加计抵扣10%的进项税 会计处理
  • 邮票可以抵个税吗
  • 垫付生育津贴的钱怎么算
  • 防暑降温用品计算方法
  • 计提和缴纳企业所得税分录
  • 常见的税收优惠
  • 增值税普通发票查询真伪
  • 并购产生的商誉怎么冲减
  • 实收资本印花税税率多少
  • 营改增后企业要交哪些税
  • 物业公司收到一年物业费开具发票后如何确认收入
  • 公益捐赠税前扣除凭证
  • 查税是按基本账户吗
  • 需不需要计提增值税发票
  • 残保基金属税金怎么算
  • 固定资产领用材料进项税处理
  • 补发工资如何申请
  • 集团企业涉税需求网络
  • 递延年金现值计算公式解释
  • 法人往公户转账需要备注吗
  • 差额发票开具的步骤
  • 股权转让能否低于股价
  • 水资源税计入会计科目
  • 短期借款的明细科目是什么
  • 付给企业的律师费用
  • 小规模建筑公司可以开劳务发票吗
  • 资本的不同形态
  • 商品损耗怎么做会计分录
  • 水土保持补偿费收费依据
  • 美元汇款怎么汇
  • 收到上级工会下拨的工会经费
  • 在电脑桌面上添加快捷程序
  • php编程入门教程
  • 无偿调入固定资产
  • thinkphp批量修改
  • php addslashes函数
  • 缴费单位未按规定缴纳社会保险费的按日加收
  • 实现产供销一体化
  • uniapp官方教程
  • 使用uni-app开发网站
  • php页面刷新
  • 外贸进出口企业注册资金
  • 增值税普通发票税率
  • dedecms安装步骤
  • 简述SQL server管理器的功能
  • mongodb exception: $concat only supports strings, not NumberInt32解决办法
  • python如何运用
  • 契税计税依据是否包含耕地占用税
  • 公司没有车加油票怎么做账
  • 认证一般纳税人之后,之前开的发票作废重新填开的税率
  • 抄税前要做什么
  • 固定业户应当向其机构
  • 延期付款利息收入要交增值税吗
  • db2with
  • 数据库用户名称
  • 加班餐费和误餐费的区别
  • 总结哪些纳税人可以采用简易计税方法
  • 增值税为什么要结转
  • 发行债券支付的发行费用计入哪里
  • 企业所得税弥补亏损可以弥补几年
  • 购买农产品进行销售要交税吗
  • 购买电脑增值税税率是多少
  • 没有外币账户可以收外币吗
  • linux文件压缩和备份实验
  • win10系统代理在哪
  • windows7打不了字怎么办
  • perl怎么读取文件
  • 深入浅出javascript
  • 如何修改安卓app的程序
  • javascript的对象主要包括
  • jquery .html的用法
  • 如何修改新建的内容
  • 安卓手机管家推荐
  • 用if函数计算个人应交所得税
  • 国家税务局通用机打发票属于增值税发票吗
  • 领导对税收分析肯定性批示
  • 企业之间无偿借款是否交税
  • 深圳市地方税务局历任局长
  • 发票开票系统可以查询上一年发票吗?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设