主要内容

LPC语音分析与合成

这个例子展示了如何使用MATLAB®命令行中提供的DSP系统工具箱™功能来实现被称为线性预测编码(LPC)的语音压缩技术。

简介

在本例中,您实现了语音信号的LPC分析和合成(LPC编码)。这个过程包括两个步骤:分析和综合。在分析部分,您将从信号中提取反射系数,并使用它来计算剩余信号。在合成部分,您将使用剩余信号和反射系数重建信号。与原始语音信号相比,剩余信号和反射系数编码所需的比特数更少。

下面的框图显示了您将要实现的系统。

在这个模拟中,语音信号被分成3200个样本大小的帧,其中1600个样本重叠。每一帧都使用一个汉明窗口。首先求出十二阶自相关系数,然后利用Levinson-Durbin算法计算反射系数。原始语音信号经过一个分析滤波器,该滤波器是一个全零滤波器,其系数为上面得到的反射系数。滤波器的输出是残差信号。这个残余信号通过一个合成滤波器,它是分析滤波器的逆。合成滤波器的输出是原始信号。

初始化

这里初始化一些变量,如帧大小,并实例化处理中使用的System对象。这些对象还预先计算任何必要的变量或表,从而在后面的循环中进行有效的处理调用。

初始化变量。

frameSize = 1600;fftLen = 2048;

在这里,您将创建一个System对象™来读取音频文件并确定文件的音频采样率。

audioReader = dsp。AudioFileReader (“SamplesPerFrame”frameSize,...“OutputDataType”“双”);fileInfo = info(audioReader);Fs = fileInfo.SampleRate;

创建一个用于预强调的FIR数字滤波器系统对象。

pre强调过滤器= dsp。FIRFilter (...“分子”, [1 -0.95]);

创建一个buffer System对象并设置其属性,以便获得长度为frameSize重叠长度为frameSize

signalBuffer = dsp.AsyncBuffer(2*frameSize);

创建一个用于分析的FIR数字滤波器系统对象。还创建两个全极数字滤波系统对象,用于合成和去强调。

analysisFilter = dsp。FIRFilter (...“结构”“格马”...“ReflectionCoefficientsSource”输入端口的);synthesisFilter = dsp。AllpoleFilter (“结构”“晶格AR”);deEmphasisFilter = dsp。AllpoleFilter (“分母”-0.95 [1]);

创建一个System对象来播放结果音频。

audioWriter = audioDeviceWriter(“SampleRate”Fs);为可视化设置图。范围=光谱分析仪(“SampleRate”Fs,...“PlotAsTwoSidedSpectrum”假的,“YLimits”, [-140, 0],...“标题”“语音线性预测”...“ShowLegend”,真的,“ChannelNames”, {“信号”“表示”});

流处理循环

这里调用处理循环,使用实例化的System对象对输入音频信号进行LPC分析和合成。

方法检测到输入文件的末尾时,循环将停止AudioFileReader系统对象。

~结束(audioReader)读取音频输入sig = audioReader();%的分析方法的参数传递过滤器系数% analysisFilter系统对象。sigpreem = preEmphasisFilter(sig);写(signalBuffer sigpreem);sigbuf = read(signalBuffer,2*frameSize, frameSize);hammingwin = hamming(2*frameSize);Sigwin = hammingwin.*sigbuf;%自相关序列[0:13]Sigacf = xcorr(sigwin, 12,“有偏见的”);Sigacf = Sigacf(13:结束);利用自相关函数计算反射系数%使用Levinson-Durbin递归。函数输出%多项式系数和反射系数。的多项式%系数用于计算和绘制LPC谱。[sigA, ~, sigK] = levinson(sigacf);% Levinson-Durbinsiglpc = analysisFilter(sigpreem, sigK);%的合成synthesisFilter。ReflectionCoefficients = sigK.';sigsyn =合成过滤器(siglpc);sigout = deEmphasisFilter(sigsyn);%播放输出音频audioWriter (sigout);%更新图siga_padding = 0 (size(sigwin),“喜欢”, sigA。');%以零填充来绘图siga_padding (1:size(sigA.',1),:) = sigA.';范围([sigwin sigA_padded]);结束

释放

在这里,您可以调用System对象上的release方法来关闭任何打开的文件和设备。

释放(audioReader);暂停(10 * audioReader.SamplesPerFrame / audioReader.SampleRate);等待音频播放结束释放(audioWriter);释放(范围);

结论

您已经在这里看到了使用线性预测编码实现语音压缩技术。该实现使用了DSP系统工具箱中的MATLAB命令行功能。代码只涉及使用适当的输入参数调用连续的System对象。这涉及到不容易出错的手动状态跟踪,这可能是例如Buffer的MATLAB实现的情况。