主要内容

语音的LPC分析与合成

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

介绍

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

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

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

初始化

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

初始化变量。

frameSize = 1600;fftLen = 2048;

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

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

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

preEmphasisFilter = dsp。FIRFilter (...“分子”-0.95 [1]);

创建一个buffer System对象,并设置它的属性,以便获得长度为frameSize的两倍且重叠长度为frameSize的输出。

signalBuffer = dsp.AsyncBuffer (2 * frameSize);

创建一个window System对象。这里您将使用默认的窗口,即汉明窗口。

hammingWindow = dsp.Window;

创建一个autocorrelation System对象,并设置其属性以计算按输入长度比例调整的范围[0:12]的滞后。

自相关器= dsp。自相关器(...“MaximumLagSource”“属性”...“MaximumLag”12...“缩放”“有偏见的”);

创建一个System对象,该对象使用Levinson-Durbin递归从自相关函数计算反射系数。配置它以输出多项式系数和反射系数。多项式系数被用来计算和绘制LPC谱。

levSolver = dsp。LevinsonSolver (...“AOutputPort”,真的,...“KOutputPort”,真正的);

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

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

创建一个System对象来播放产生的音频。

audioWriter = audioDeviceWriter (“SampleRate”Fs);用于可视化的安装图。= dsp范围。简介(“SampleRate”Fs,...“PlotAsTwoSidedSpectrum”假的,“YLimits”(-140,0),...“FrequencyResolutionMethod”“WindowLength”“WindowLength”fftLen,...“FFTLengthSource”“属性”“FFTLength”fftLen,...“标题”“语言的线性预测”...“ShowLegend”,真的,“ChannelNames”,{“信号”“表示”});

流处理循环

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

当您到达输入文件的末尾时,循环将停止,这将由AudioFileReader系统对象。

~结束(audioReader)读取音频输入sig = audioReader ();%的分析要注意的是,过滤器系数是作为参数传入的% analysisFilter系统对象。sigpreem = preEmphasisFilter(团体);写(signalBuffer sigpreem);sigbuf = read(signalBuffer,2*frameSize, frameSize);sigwin = hammingWindow (sigbuf);sigacf =自相关器(sigwin);[sigA, sigK] = levSolver(sigacf);% Levinson-Durbinsiglpc = analysisFilter(sigpreem, sigK);%的合成synthesisFilter。ReflectionCoefficients = sigK。”;sigsyn = synthesisFilter (siglpc);sigout = deEmphasisFilter (sigsyn);播放输出音频audioWriter (sigout);%更新图sigA_padded = 0(大小(sigwin),“喜欢”, sigA);%填充到绘图siga_padding (1:size(sigA,1),:) = sigA;范围([sigwin sigA_padded]);结束

释放

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

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

结论

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