语音的常用处理就是分帧,分帧,fft变换,做一些处理,然后反变换回到时域。

这里面常用到的就是enframe 和 overlapadd

enframe分帧,我想大家都很熟悉了,这里不再介绍,overlapadd具体含义可以看这篇文章

STFT使用overlap-add重建信号_u010592995的专栏-CSDN博客_overlap

上面这篇文章介绍的很清楚。

一、问题的引入

Description of v_overlapadd

voicebox 中给出了一个example

其实这里面就是一个简单的分解和合成,按此我们可以补充一些代码完成信号的分帧处理

这里面核心部分就是enframe和overlapadd,比较奇怪的就是W做的归一化,这个归一化有些奇怪,是平方归一化,另外是hamming用的periodic,

二、hamming的 'periodic' 选项,其实这个是针对 ‘symmetric‘

matlab给的解释:大致含义就是 在做 FIR滤波器设计时候,需要共轭对称,那么使用 symmetric 选项,在做DFT/FFT的时候,用periodic

我们看下他们的不同:

同样的长度下,symmetric  完全共轭对称(这里是实数,没有虚数,或者虚部为零),头尾一样

periodic更符合DFT的频谱特性

上面比较接近一个实序列的FFT的幅度谱的排列方式,即第一个数,DC分量(直流)单独为一块(没人和它对称),完了其余的头尾对称,中间单独(自己和自己对称,奇数N的FFT不存在)

且窗函数hamming,不一定只用于时域,在频域上也会使用的,那么这个这个periodic更适合频域上的窗,当然用于fft的时候

二、 W的归一化方式

归一化方式是平方和,是因为 信号经过了两次 窗函数,一次是在分解的时候(enframe),一次是在重构的时候(overalapadd),W具有平方特性下的归一:

且刚好是头半个窗乘完之后还要乘一遍,尾部也是同样,本文 三 中代码部分已经描述

OV=2;                               % overlap factor of 2 (4 is also often used)
INC=512;                            % set frame increment in samples
NW=INC*OV;                          % DFT window length

W=sqrt(hamming(NW,'periodic'));     % omit sqrt if OV=4
W=W/sqrt(sum(W(1:INC:NW).^2));      % normalize window

W1 = zeros(1024*10,1);
W2 = zeros(1024*10,1);
W3 = zeros(1024*10,1);
W4 = zeros(1024*10,1);
W1([1:1024]) = W;
W2([1+512:1024+512]) = W;
W3([1+512*2:1024+512*2]) = W;
W4([1+512*3:1024+512*3]) = W;
W_total = W1+W2+W3+W4;
plot(W_total);

W_total = W1.^2+W2.^2+W3.^2+W4.^2;
plot(W_total);

W=W/sqrt(sum(W(1:INC:NW).^2));  后面 W(1) W(1+INC)这两个点的和(交叠,每一个横轴点,用了头和两尾两个点,可以参考下图,如果用了OV=4,那就是四个点相加),恰好都是固定值,每个点都要除以这个倍数,

其他点值都一样,这归根到底是hanning或者hamming窗都是sin 系列的窗,推迟pi/2相位变成cos

sinx*sinx + cosx*cosx ==1,平方能量和总是固定值,其他窗(三角,矩形)应该不满足这个特性

stft的时候,这个数据会用两遍(因为overlap分属不同的帧)

[1 2 3 4 5 6...] *  win( cos)  ,[1 2 3 4 5 6...] *  win( sin)

在istft的时候,也会再计算两遍,然后做和

[1 2 3 4 5 6...] *  win( cos)  ,[1 2 3 4 5 6...] *  win( sin)

刚好就是 [12 3 4 56] * (cos^2 + sin^2)

三,整理出来的代码:

整理一下代码吧,如果对模块不熟悉,还是调用enframe和overlapadd函数,现在既然已经知道了这俩函数的根本含义,直接就自己写好了

如果是对静态的文件做处理,那么直接enframe和overlapadd就可以了,现在如果是需要实时的每一帧都要输出结果,那么得考虑下面的写法了:

重构信号 = 信号前半部分*窗的前半部分 + 遗留的上一帧的后半部分*窗的后半部分

S =double(S);
output =[];

for i = 1:nframe-1
    % 步进长度,inc
    loc_data = S([1+(i-1)*INC:1024+(i-1)*INC]).* W;
    
    loc_fft = fft(loc_data);

% 这里写你要干的操作
    loc_data = ifft(loc_fft);
    
    half_data1 = last_frame_data([513:1024]) .*  half_right_W;
    half_data2 = loc_data([1:512]) .*  half_left_W;
    half_result = half_data1 + half_data2;
    
    last_frame_data = loc_data;
    output = [output;half_result];
end

四、用一个wav信号进行测试:

左边:原始:

右边:重构

其实除了第一帧和最后一帧以外,信号完美重构回去了

语音的合成和分解 enframe和overlapadd 用法相关推荐

  1. 矢量合成和分解的法则_高考复习整理力的合成和分解

    一.合力与分力 如果一个力产生的效果和其他几个力产生的效果相同,这个力就叫那几个力的合力,那几个力就叫这个力的分力. 二.力的合成:求几个力的合力叫做力的合成. 1. 平行四边形定则:力的合成的本质就 ...

  2. 矢量合成和分解的法则_重点解析丨抛体运动 之 运动的合成与分解

    真正优秀的学生是善于方法和知识的总结.归类.完善!多做题多思考多总结.一题多解找巧法,多题一解找通法今天包sir为大家盘点的是运动的合成与分解~希望大家能够从中有所收获!业精于勤荒于嬉希望大家考上理想 ...

  3. 直播预告 | AAAI 2022论文解读:基于生成模型的语音/歌声合成与歌声美化

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  4. 基于matlab的信号合成与分解,基于matlab的信号合成与分解

    基于matlab的信号合成与分解 - I - 摘 要 为了便于进行周期信号的分析与处理,常要把复杂的周期信号进行分解,即将周期 信号分解为正余弦等此类基本信号的线性组合,通过对这些基本信号单元在时域和 ...

  5. 矢量合成和分解的法则_专题14 运动的合成与分解

    运动的合成与分解 [基础回顾] 考点内容:运动的合成与分解 考纲解读: 1.掌握曲线运动的概念.特点及条件. 2.掌握运动的合成与分解法则. 考点一 物体做曲线运动的条件及轨迹分析 1.条件  (1) ...

  6. 矢量合成和分解的法则_矢量合成和分解的方法--平行四边形法则.ppt

    矢量合成和分解的方法--平行四边形法则 * * * * * * * * * * * * * * * * 实验:蜡块的运动 问题?(1)什么叫合运动.分运动 (2)什么叫合速度.合位移 什么叫分速度.分 ...

  7. pytorch根据开放场景语音文字合成新语音(VoiceLoop)

    pytorch根据开放场景语音文字合成新语音(VoiceLoop) Song • 2119 次浏览 • 0 个回复 • 2018年01月12日 VoiceLoop PyTorch实现了VoiceLoo ...

  8. 数字信号处理①之信号的合成、分解、相关性及傅里叶系数的计算

    数字信号处理系列博客: 数字信号处理之信号的合成.分解.相关性及傅里叶系数的计算 数字信号处理之从傅里叶系数到DFT 文章目录 一.信号的合成和分解 (一)傅里叶级数 (二)将正弦波合成方波 二.信号 ...

  9. 语音跟踪:信号分解、锁相、鸡尾酒会效应、基于PR的信号分离

    NLP中关于语音的部分,其中重要的一点是语音信号从背景噪音中分离.比如在一个办公室场景中,有白天的底噪-类似于白噪音的噪音.空调的声音.键盘的啪啪声.左手边45度7米元的地方同事讨论的声音.右手边1. ...

最新文章

  1. python paramiko包 ssh报错No existing session 解决方法
  2. 记录一次【模仿真实环境】的内网漫游
  3. STL源码分析-bitset
  4. spring cloud构建互联网分布式微服务云平台-docker部署spring cloud项目
  5. oracle apply handler,做什么BaseHandler.apply_response_修复在django吗?
  6. java rsa内容超长_RSA 非对称加密解密,超长字符串分块处理
  7. python知识点汇总_Python知识点总结大全(一)
  8. VC调用C#写的DLL
  9. node php环境变量配置,关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍...
  10. ARMs3c2440开发板挂接NFS服务
  11. java 短路判断_细数Java最坑爹的10大功能点
  12. 多伦多大学计算机专音乐专业,多伦多大学音乐专业有哪些申请要求?
  13. 网络系统设计的一般步骤
  14. solr为什么比MySQL快_Solr原理?为什么要用Solr?Solr为什么比较快?
  15. 工作,到底意味着什么
  16. 十大思想实验(思维风暴)
  17. 增长或下降的百分比计算以及同比环比概念
  18. NE5532DR IC OPAMP GP 2 CIRCUIT 8SOIC
  19. python数据可视化之Matplotlib
  20. idea generated-requests.http 表单请求示例

热门文章

  1. 嵌入式Linux--menuconfig详解
  2. 【181008】VC++ 妙手连珠五子棋源码
  3. 机器人二弟_“可佳二代”机器人好性感
  4. 大话设计模式-23中设计模式分类
  5. 大数据分析案例:应用系统负载分析与磁盘容量预测
  6. IT 网络产品厂商聚焦(路由、交换、网络安全、负载均衡、防火墙、行为管理、邮件网关、计费等)...
  7. 迈普交换机添加用户、授权用户级别及删除用户
  8. 一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora
  9. macd的python代码同花顺_同花顺顶级MACD指标公式源码-同花顺公式 -程序化交易(CXH99.COM)...
  10. 清理本地maven仓库