OLA音频变速算法的仿真与剖析

前段时间,在尝试音乐节拍数的提取时,终于有了突破性的进展,效果基本上比市面上的许多商业软件还要好,在作节拍数检测时,高频信息作用不大,

通过重采样减小运算量。重采样让我想起了在学校里面做的变速变调算法,在这里顺便回顾一下。

OLA(Overlap-and-Add, OLA)重叠叠加算法是音频变速算法中最简单的时域方法,它是后续时域算法(SOLA, SOLA-FS, TD-PSOLA, WSOLA)的基础。

OLA分为分解与合成两个部分,公式看起来很复杂,所以不贴出了,基本思路从图中更能清晰的表现出来。

分解阶段:语音首先分帧,帧长为N,假设帧移为Sa。

合成阶段:分解出来的语音帧,以帧移为Ss的间隔重新合成起来,得到变速之后的音频。

Rate = Ss/ Sa,如果Sa=Ss,则原速;Ss<Sa时,加速;Ss>Sa时,减速。

功能性代码:

function [ RSound ] = OLA(Speech, Fs, Rate)
%OLA Summary of this function goes here
%   Detailed explanation goes here
    frame_ms = 25;
    frame_len = frame_ms * Fs /1000;
    window = hanning(frame_len);
    Sa = 1/2 * frame_len;
    AnalysisSplice = enframe(Speech, window, Sa);
    AnalysisSplice = AnalysisSplice‘;%each column corresponding to each frame data
    Ss = Rate*Sa;
    RSound = Synthesis(AnalysisSplice, Ss);
end

function  RSound = Synthesis(AnalysisSplice, Ss)
    [frame_len, nframes] = size(AnalysisSplice);
    N = Ss*(nframes - 1) + frame_len;
    RSound = zeros(1, N);
    for q = 1:nframes
       RSound(1 + (q-1)* Ss : frame_len + (q-1)*Ss) = RSound(1 + (q-1)* Ss   :  frame_len + (q-1)*Ss) +  AnalysisSplice(:,q)‘;
    end
end

Script执行代码:

clc;
clear;
close all;
Path = ‘D:\Experiment\OLA\‘;
file = [Path, ‘test.wav‘];
faster = [Path, ‘faster.wav‘];
[Speech, Fs] = wavread(file);
Rate = 0.7;
%wavread wavwrite enframe function comes from voicebox tools
RSound = OLA(Speech,Fs,Rate);
wavwrite(RSound,Fs,faster);
figure;
subplot(2,1,1);
plot(Speech);
title(‘original‘);
axis([1 length(Speech) -0.5 0.5]);
subplot(2,1,2);
plot(RSound);
title(‘0.7 faster‘);
axis([1 length(Speech) -0.5 0.5]);

变速前后的时域波形对比图

OLA算法在重叠部分会造成基频断裂,甚至语音失真。所以后期许多算法基于此缺点进行了相关的改进。

测试文件:

http://pan.baidu.com/s/1hq4540G

来自:http://www.cnblogs.com/welen

http://blog.csdn.net/weiqiwu1986

OLA音频变速算法的仿真与剖析

时间: 2024-10-06 13:07:45

OLA音频变速算法的仿真与剖析的相关文章

音频降噪算法 附完整C代码

降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据为主,矩形数据分布. 音频更偏向 时间 处理,例如语音中的某短时长. 音频一般是一维数据为主,单声道波长. 处理方式也是差不多,要不单通道处理,然后合并,或者直接多通道处理. 只是处理时候数据参考系维度不一而已. 一般而言, 图像偏向于多通道处理,音频偏向于单通道处理. 而从数字信号的角度来看,也可

基于傅里叶变换的音频重采样算法 (附完整c代码)

前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲,我精力有限,但一般都会抽空回复一下. 大多数情况,阅读一下代码就能解决的问题, 也是要尝试一下的. 没准,你就解决了呢? WebRtc的采样算法本身就考虑到它的自身应用场景, 所以它会有一些局限性,例如不支持任意采样率等等. 而简洁插值的这个算法, 我个人也一直在使用,因为简洁明了,简单粗暴. 我自

一种简单高效的音频降噪算法示例(附完整C代码)

近期比较忙, 抽空出来5.1开源献礼. 但凡学习音频降噪算法的朋友,肯定看过一个算法. <<语音增强-理论与实践>> 中提及到基于对数的最小均方误差的降噪算法,也就是LogMMSE. 资料见: <<Speech enhancement using a minimum  mean-square error log-spectral amplitude estimator.>> -----Ephraim, Y. and Malah, D. (1985) 之前也是

java使用Sonic 算法对音频变速不变声、变调、调整音量

依赖库:https://github.com/waywardgeek/sonic 基础库:Sonic.java /* Sonic library Copyright 2010, 2011 Bill Cox This file is part of the Sonic Library. This file is licensed under the Apache 2.0 license. */ public class Sonic { private static final int SONIC_

SoundTouch实现音频变速变调

介绍 SoundTouch 是一个用C++编写的开源的音频处理库,可以改变音频文件或实时音频流的节拍(Tempo).音调(Pitch).回放率(Playback Rates),还支持估算音轨的稳定节拍率(BPM rate).ST的3个效果互相独立,也可以一起使用.这些效果通过采样率转换.时间拉伸结合实现. Tempo节拍 :通过拉伸时间,改变声音的播放速率而不影响音调. Playback Rate回放率 : 以不同的转率播放唱片(DJ打碟?),通过采样率转换实现. Pitch音调 :在保持节拍不

数字音频Mixer算法

1.1      问题提出 Mix的意思是混音,无论在自然界,还是在音频处理领域这都是非常普遍的现象.自然界里你能同时听到鸟鸣和水声,这是因为鸟鸣和水声的波形在空气中形成了叠加,耳朵听到后能区分鸟鸣和水声这两种波形. 在数字音频领域也是一样,比如你也可以一边打CS一边听歌,这是因为计算机把两个声音波形做了叠加.但是不同的是,计算机中的叠加,很容易造成越界. 比如 int plus1(int num0, int num1){ return num0+num1; } 如果赋值int num0=0x7

【BZOJ2618】【Cqoi2006】凸多边形 半平面交 、算法的深度细节剖析。

题解:虽然这道题数据范围太小,O(n*n)的算法都能过,但是我为了练手仍写了半平面交.. 半平面交: 我们规定:一个基准点+一个向量(本质是有向直线,)就算一个半平面,现在要求出半平面交,然后做一些事情.. 那么可以过每个半平面的基准点做一条平行于x轴的向右的射线,此射线与向量代表直线的夹角为其"极角".. 我们可以把所有半平面(Line,或者说叫有向直线)以其极角为键值排序, 然后扫一圈,围出来一个图形,即要求的半平面交.. 实现过程不妨看代码,有详细注释. 代码中有几个需要画图的地

STL源码剖析——STL算法stl_algo.h

前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法,本文剖析STL其他的算法,例如排序算法.合并算法.查找算法等等.在剖析的时候,会针对函数给出一些例子说明函数的使用.源码出自SGI STL中的<stl_algo.h>文件.注:本文的源码非常多,可能后续博文会对这些算法进行归类分析. STL算法剖析 #ifndef __SGI_STL_INTERNAL_ALGO_H #define __SGI_STL_INTERNAL_ALGO_H #include <stl_heap

soundtouch变速wsola算法之改进

soundtouch变速算法很类似sola算法,细看才知道是wsola算法. 上个星期有个需求,将该变速应用到直播的包处理,有点类似于webrtc的netEQ处理机制. 直接使用soundtouch,会存在一些问题: 1.一段正常,一段变速,中间会出现不连续,有冲击.或者不同速率的切换. 越频繁,现象更明显,有de,de的声响. 2.soundtouch每次处理,会有残余,如果用flush,音质会受到影响,一般到结尾采用该函数. 也就是说输入样本有残余. 3.soundtouch变速的长度不能精