如何将声学的spectrogram(声谱图)重新反变换成时域语音信号
最近在研究一些信号分析的事情,感兴趣如何将频谱信号反变换成时域信号。fft 与ifft可以顺畅的转变,但是这个是一帧信号,当时间较长的信号再一起是,通过反变换变成一帧一帧的时域信号,如何把他们拼接起来非常感兴趣,以后会做一些尝试,这里先留个档案。
1.将声音转化为声谱图(Spectrogram)
通过短时傅里叶变换。
2.将声谱图转换为声音
1. 通过ifft将一帧一帧的FFT信号(即1维的FFT信号数组X(F)(i)[ i=0 to length( X(f) ) ])变换成一小段一小段的时域信号,再将他们拼接起来。(加窗和overlap是否带来影响及相位是否丢失?)
下面打算通过labview或matlab去实现。(本来想查阅了相关资料借鉴一下,没有找到相关的资料,所以打算自己去尝试下下面的处理,如果有知道的还请告诉我相关的资料或方法,借鉴一下,谢谢)
第一步是找一个语音信号,将其转换为STFT的Spectrogram,
第二步是将他还原回去一帧一帧的声学信号,并拼接成语音信号,看语音信号是否能1. 语音是否能还原,2平滑过渡,3相位是否会丢失。(2019-12-15,完成后再来更新)
2019-12-05 当天使用Labview 尝试了一下。今天公司圣诞放假,有空更新一下 (2019-12-25)
1.找了windows里一段语音 alarm.wav 时域信号如下
图1. 音频时域图
通过labview 中的STFT 函数进行频谱分析。
图2. STFT 函数图
其中关于STFT函数
Labview 中STFT分几个步骤
1. K points 由 frquency bins 决定。即每次截取K个点,此例中8192个点。决定了FFT后的截止频率为1/2* frequency bins;
2. 加窗函数,类型 Type 这里使用汉宁窗,length 决定了数据点在长度范围外为0值
3. time step 决定了数据块往前进的速度,他与加窗length,共同决定了数据块中overlap的值
得到图3 STFT 声谱图,实际是一个2维数组。
图3. STFT 声谱图
尝试将这个2D数组还原成时域音频信号,看是否能够高保真还原。
将这个2D数组(i*j大小)的FFT数据依次取出,进行i-fft(FFT 逆变换),得到FFT前的时域信号(此时是时域信号加过窗的数据。)。将这些数据再依次拼接出来,回放声音,发现不对。原来是这些数据1. 加过窗了,2,有重复冗余(OVERLAP的原因),
应该每次从逆变换的时域信号中只取time step个数的数据点,怎么取?假设i-fft后的数据长度为N,则从第( 1/2*N取整 - 1/2* ( time step length)) 开始,取time step个数。
将j个时域信号的segment依次拼接起来,得到从光谱图转化到的时域信号。从实验的结果来看,这个转化来的时域信号与原始信号相比,还是能听出来的,只是有一些失真,我的分析是由于加窗带来的,因为i-fft后得到的是原始信号*窗函数的信号,这里我并没有将原始信号还原出来,主要是我尝试了下,除以窗函数,并没有效,所以还有待研究。
图4. 声谱图通过i-fft还原的声信号(能听出来原始信号的内容,但略失真,失真程度受频谱图分析的 window length, time step ,frequency bins影响 )。
图4. 将i-fft还原的声信号再次做STFT得到的声谱图。
下面会继续研究,去除加窗函数的影响。
2020-01-01 更新
弄明白了一件事,就是短时傅里叶时, 生成的spectrogram 是X^2的信号,也就是说是复数的平方,丢失了相位信息,所以在上面做STFT逆变换时会有些失真(相位信息不对)。
如果使用STFT时,生成的colormap 是coef 矩阵(复实数)时,可以反变换成时域信号而不失真。
感觉利用这个性质,可以做一些阈值滤波与信号增强。后续进行研究。
如何将声学的spectrogram(声谱图)重新反变换成时域语音信号的更多相关文章
- 论文笔记:语音情感识别(二)声谱图+CRNN
一:An Attention Pooling based Representation Learning Method for Speech Emotion Recognition(2018 Inte ...
- 论文笔记:语音情感识别(四)语音特征之声谱图,log梅尔谱,MFCC,deltas
一:原始信号 从音频文件中读取出来的原始语音信号通常称为raw waveform,是一个一维数组,长度是由音频长度和采样率决定,比如采样率Fs为16KHz,表示一秒钟内采样16000个点,这个时候如果 ...
- MATLAB中绘制质点轨迹动图并保存成GIF
工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...
- PaintCode 教程:矢量图轻松转换成CoreGraphics代码
本文译自Ranwenderlich的这篇:http://www.raywenderlich.com/100281/paintcode-for-designers-getting-started Pai ...
- 语音频谱语音信号处理之(四)梅尔频率倒谱系数(MFCC)
今天一直在查找语音频谱之类的问题,今天正好有机会和大家共享一下. 语音信号处置之(四)梅尔频率倒谱系数(MFCC) zouxy09@qq.com http://blog.csdn.net/zouxy0 ...
- 音频自动增益 与 静音检测 算法 附完整C代码
前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...
- 音频自动增益 与 静音检测 算法 附完整C代码【转】
转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...
- 梅尔频率倒谱系数(MFCC) 学习笔记
最近学习音乐自动标注的过程中,看到了有关使用MFCC提取音频特征的内容,特地在网上找到资料,学习了一下相关内容.此笔记大部分内容摘自博文 http://blog.csdn.net/zouxy09/ar ...
- 【VS开发】【智能语音处理】语音信号处理之(四)梅尔频率倒谱系数(MFCC)
语音信号处理之(四)梅尔频率倒谱系数(MFCC) zouxy09@qq.com http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门课,快考试了,所以也要 ...
随机推荐
- dede编辑文章不更新时间的方法
在修改文章的时候,发现织梦DEDECMS5.7这个版本存在一个问题,修改文章的同时也修改了文章的发布时间,这个 功能可能有些人比较需要,但同时也有些站长朋友又不需要,因为我们编辑某个文章的时候,发现编 ...
- Jmeter系列(21)- Jmeter录制手机App请求
前置知识点 Jmeter HTTP代理服务器每次点击启动录制,会往Jmeter的bin目录下生成相关证书,证书有效期是7天 录制前需要先看下证书过期没有,过期了,删除bin目录下的证书,即Apache ...
- django 自定义auth中user登陆认证以及自写认证
第一种: 重写自定义auth中user登陆认证模块, 引入MobelBackend from django.contrib.auth.backends import ModelBackend 重写验证 ...
- Viterbi 算法 Python实现 [NLP学习一]
最近思考了一下未来,结合老师的意见,还是决定挑一个方向开始研究了,虽然个人更喜欢鼓捣.深思熟虑后,结合自己的兴趣点,选择了NLP方向,感觉比纯粹的人工智能.大数据之类的方向有趣多了,个人还是不适合纯粹 ...
- HTML 网页开发、CSS 基础语法——四. HTML基本语法
1. HTML规范和HTML标签 W3C:world wide web consortium,万维网联盟.专门发布和维护互联网的规范和标准. 2. HTML标签 HTML 标记通常被称为 HTML 标 ...
- 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04
百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...
- Redis三种集群模式介绍
三种集群模式 redis有三种集群模式,其中主从是最常见的模式. Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的.哨兵顾名思义,就是用来监控的,主要作用就是 ...
- 如何使用云效Flow做质量检测,保障高质量的交付速度
使用云效Flow做质量检测,保障高质量的交付速度,云效「Flow」 提供代码扫描. 安全扫描和各种自动化测试能力,支持人工测试卡点.自动化验证卡点等多种质量红线,确保业务质量.云效流水线 Flow 流 ...
- Firewalls命令行配置
1.指定端口开放查询.开放.关闭端口 # 查询端口是否开放 firewall-cmd --query-port=8080/tcp # 开放80端口 firewall-cmd --permanent - ...
- go 连接MSSQLServer数据库【遇到的坑】
前言:项目测试需要用到mssqlserver数据库连接,遇到坑,自己爬直接上代码: package main import ( "database/sql" " ...