WAVE音频文件数字信号处理——实现变声功能

  1. WAVE音频文件

       WAVE文件作为最早的数字音频文件格式之一,是应用于windows平台的波形音频文件。它是一种无损的音频文件,具有较好音质,缺点是占用大量存储空间。之后WAVE文件从无压缩编码形式PCM(脉冲编码调制)发展到压缩形式的编码解决其弊端,其中压缩格式有微软的自适应差分脉冲编码调制,国际电报联盟制定的语音压缩标准ITU G.711 a-alaw、GSM 6.10、ITU G7.721 ADPCM等。该文件遵循RIFF(Resource InterChange File Format)文件格式存放信息,它把WAVE文件划分为文件头和数据两个部分,并以小端方式存储数据,其中文件头包含音频信号的信息,存储及编码格式信息,如采样频率、数据存放大小、声道数目等信息。文件的扩展名标识文件数据类型。RIFF文件是以块作为基本单位,以树类型作为存储结构去存储文件数据。每个块包含文件表示符ID,当前块区间的大小和块数据内容,其中块大小为去除标识符字节占用空间和存储块长度占用空间后大小。RIFF格式结构的树根结点部是以“RIFF”为标识,叶子结点部分有“data”(数据块)标识,“fmt”(格式块)标识,若WAVE文件被压缩,还包括“fact”标识,该标识块记录了非PCM编码即压缩格式编码下文件的相关信息[2]。具体WAVE文件格式说明如表所示。


       常见的音频压缩方法有帧间压缩和帧内压缩,在此基础上编码有对称编码和非对称编码两种方式。由于帧间压缩考虑了两帧数据间的重复量,所以可以达到帧内压缩达不到的压缩比,常用算法有幅差值算法等。对称编码数据处理速度快相比非对称编码更适用于实时音频信号传输处理的场合。

如还是不懂请看:点击打开链接

2. 音频处理

1.重采样原理及其分析

上采样:上采样就是通过插值的方法实现,下采样是通过抽取离散的音频信号实现。如下进行P倍的上采样分析,其中y为上采样                后的结果,x为未处理前的离散信号。在x的每个离散信号间插入P-1个零点。


故重采样信号的基音周期会变为原来信号P倍,重采样频谱缩小1/P。即基音频率与语速均变成原来的1/P。

       下采样:先取原始信号中的一个点,从该点开始省略Q-1个点,后取出下一个点的信号,依次循环组成新的离散信号序列。公式推导如下。

 

由上推导得,下采样使得基频和语速均变为原来的Q倍。

扫描二维码关注公众号,回复: 1642439 查看本文章

       时域信号再抽取等同原始采样频率按一定倍率下降,使得信号不满足香农定理,会产生混叠现象。但上采样在频谱图上的反应是镜像的分布特征,故在P倍上采样后进行低通滤波处理以消除镜像,在Q倍下采样前进行低通滤波处理将会消除混叠情况的产生,保证信号能不失真的恢复放到原信号。

       重采样不仅能改变音调。在采样频率过低场合,因要求模拟低通滤波器的频带为0来抗混叠,使模拟滤波器设计困难。若使用高采样频率,则大量采样置又会对数据的处理,存储带来问题,使用重采样中的下采样可以解决此类问题。它使数据处理量减少,且数字低通滤波易于实现。在信号丢失严重场合里,滤除频率镜像的前提下采用重采样的上采样插值能有效恢复部分原信号。

如不懂请看: 点击打开链接

2.SOLA算法

因音频重采样导致音频音调升高使播放时间缩短,音调降低会使播放时间加长,所以需要做音频时长规整保证在不改变音调的前提条件下对音频长度进行改变。

SOLA算法是在OLA算法的基础上发展而来,其算法简单效果更优。这种算法能解决简单重叠叠加中的信号断裂,基频失真问题,保证做到精确的时长规整。首先对信号进行分帧,假设一帧信号的长度为S,以重采样的信号为原始信号,原始信号每帧的帧间距为A, 时长规整后每帧信号的长度仍为S,新的帧间距变为B,重叠叠加区大小O=S-B,假设共有N帧,则原始信号长度L1= A×(N-1) +S,规整后的信号L2= B×(N-1)+S。规整的信号长度本质是重采样前信号的长度。所以二者L2×P∕Q=L1,故A∕B亦可近似为P∕Q。令U=P∕Q做时长规整因子,当U>1时语音压缩,U<1时语音拉伸[11]。先将原始信号的第一帧数据放入欲规整序列中,根据原始信号帧间距取出下一帧(2×A位置)信号,在该帧开始位置在0到Pmax的范围内寻找与输出序列末尾重叠叠加法部分最匹配的位置p,找到最相似的这帧数据的位置后,将它重叠部分与输出序列重叠部分进行加权叠加,最后把原序列之后的信号以输出序列帧间距大小追加到输出序列的末尾。下一轮语音处理,匹配开始的位置从原始信号3×A的位置开始查找,并重复上述操作[12]。某次规整具体操做图解如下所示。


当相关性系数有多个相同最大值时,则p为0到Pmax内计算获得的第一个最大相关性系数对应的位置。令Rxy表示匹配程度,对信号规整前后第n段的匹配程度计算用下方公式计算。

流程图:


体分析请看点击打开链接

点击打开链接

点击打开链接

3.倒谱基音频率分析

       语音基音作为浊音的代称,现实生活中因浊音的不同而能够区分不同人语音,因此声音的基频参数可以作为判别语音者的标志。基音频率具体指气体由声带发出,声带打开到闭合的频率。基音的产生可形象的看作是一系列冲击序列的组合,冲击信号的周期便是基音周期。因为语音可看作是基音与声道系统响应,所以本文使用倒谱法分析基音。先对语音信号进行Z变换并求对数频谱,之后去掉相位信息后,对对数幅值部分逆Z变换后便是倒谱,由于已经丢失相位信息,故信号无法被还原。其原理是将卷积的信号通过取对数的方法变成两个相加的信号,而后的逆Z变换到时域两信号人仍保持了相加的关系,由于时域保持了冲击信号的周期性,故在倒谱序列在定义查找的基音周期范围内的第一个峰值到原点的距离便是基音周期。详细计算和分析请看:

点击打开链接

4.FFT原理分析讲解

     快速傅里叶变换(FFT)是基于离散傅里叶变换(DFT)的基础,具体可分基于时间抽取和基于频率抽取,两种方法FFT,主要运用旋转因子周期性,对称性,实现公式的简化,从而在程序算法上达到对时间复杂度,空间复杂度降低的目的。以下重点分析基于时间抽取的FFT。

一个分析比较好的文章:点击打开链接

C代码实现http://www.elecfans.com/engineer/blog/20161008440131.html

FFT图形推导详细分析:https://wenku.baidu.com/view/5cacb2b8bd64783e09122b9a.html

3. MATLAB程序实现

SOLA变声:

function main
[Y,Fs] = audioread('f:\Work\test.wav');
b=0.6;                %新旧序列帧间距之比
OriginalSign=Y(:,1)';       
u=b*1000;
ResampleSign=resample(OriginalSign,u,1000); %重采样信号
S=400;                       %一帧的长度
Overlap=200;                 %重叠叠加区间长度
Pmax=170;                    %允许寻找相关性最大移动位数
B=S-Overlap;                 %输出序列间距
OriginalLen= length(OriginalSign);  %原始信号的序列长度
NewSign= zeros(1, OriginalLen);      %为新序列开辟原始信号的长度
ratio = (1:Overlap)/(Overlap+1); %加权叠加系数
i = 1:Overlap;          
app=1:B;                        %信号追加移动变量
%以重采样信号为模板新建序列用以计算
CalSeries = [ResampleSign, zeros(1,400)]; 
%取原始信号第一帧给(将要规整的)新信号
NewSign(1:S) = ResampleSign(1:S);             
for newpos = B:B:(OriginalLen-S)    
        Originalpos = round(b * newpos);              
        y = NewSign(newpos + i);           
        rxy = zeros(1, Pmax+1);         
        rxx = zeros(1, Pmax+1);         
        Pmin=0;  
        %相关性计算
        for p =Pmin:Pmax        
            x = CalSeries(Originalpos + p + i);
            rxx(p+1) = norm(x);             
            rxy(p+1) = (y*x');          
        end
        Rxy = (rxx ~= 0).*rxy./(rxx+(rxx==0));    
        pm = min(find(Rxy == max(Rxy))-1);       
        bestpos = Originalpos+pm;              %当前最佳匹配位置  
        %加权叠加
        NewSign(newpos+i)
=((1-ratio).*NewSign(newpos+i))+(ratio.*CalSeries(bestpos+i)); 
        %去除重叠部分信号追加在新信号输出序列
        NewSign(newpos+Overlap+app) = CalSeries(bestpos+Overlap+app);   
end
        sound(NewSign,Fs);
        audiowrite(‘F:/regulate.wav’, NewSign,Fs);
end

频谱获取

function [Yf, f] = Spectrum_Calc(yt, Fs)
L = length(yt);
 
NFFT = 2^nextpow2(L);
Yf = fft(yt,NFFT)/L;
 
Yf = 2*abs(Yf(1:NFFT/2+1));
f = Fs/2*linspace(0,1,NFFT/2+1);
end

MATLAB在使用汉明窗卷积时,两个信号维度必须相同,且要卷积的信号不能全为0

MATLAB单个&是同时判断两个条件并适用于矩阵,而&&进判断第一个

MATLAB求倒谱函数rceps(framedata);

resample()重采样函数

audioread()音频读取

详细请看matlab的doc



猜你喜欢

转载自blog.csdn.net/fz19950924/article/details/80649139