LPC分析和语音合成

此示例示出了如何实现编码使用可用的DSP系统工具箱™功能在MATLAB®命令行被称为线性预测语音压缩技术(LPC)。

介绍

在本例中实现的语音信号的LPC分析和合成(LPC编码)。该过程包括两个步骤:分析和合成。在分析部分中,您从信号中提取的反射系数,并用它来计算残差信号。在合成部分中,您重建使用残留信号和反射系数的信号。残差信号和反射系数需要的比特以比代码原始语音信号数目较少。

下面给出了框图,您将实施该系统。

在该模拟中,语音信号被划分成大小3200个样本的帧,具有1600个采样的重叠。每个帧是使用汉明窗加窗。第十二阶自相关系数被发现,然后将反射系数从使用Levinson-Durbin算法的自相关系数进行计算。原始语音信号是通过分析滤波器,这是一个全零滤波器具有系数如上获得的反射系数通过。该滤波器的输出是剩余信号。该残留信号通过合成滤波器,其是分析滤波器的逆传递。合成滤波器的输出是原始信号。

初始化

在这里,您初始化一些像帧大小的变量,并实例化系统对象在加工中使用。这些对象还预先计算得到高效的处理呼叫后,一个循环内的任何必需的变量或表。

初始化变量。

框架尺寸= 1600;fftLen = 2048;

在这里,你创建一个系统对象从音频文件读取,并确定该文件的音频采样率。

audioReader = dsp.AudioFileReader('SamplesPerFrame',框架尺寸,...'OutputDataType''双');的fileInfo =信息(audioReader);FS = fileInfo.SampleRate;

创建用于预加重的FIR数字滤波器系统的对象。

preEmphasisFilter = dsp.FIRFilter(...'分子'[1 -0.95]);

创建一个缓冲系统对象,并设置其属性,这样你得到了框架尺寸的长度的两倍的输出和框架尺寸的重叠长度。

signalBuffer = dsp.AsyncBuffer(2 *框架尺寸);

创建一个窗口系统对象。在这里,您将使用默认的窗口,它是海明。

hammingWindow = dsp.Window;

创建自相关器系统对象并设置其属性来计算在由输入的长度缩放的范围[0:12]的滞后。

自相关器= dsp.Autocorrelator(...'MaximumLagSource''属性'...'MaximumLag'12,...“缩放”“偏”);

创建从使用莱文森 - 德宾递归自相关函数计算反射系数的系统对象。您将其配置为输出两个多项式系数和反射系数。多项式系数被用于计算并绘制LPC频谱。

levSolver = dsp.LevinsonSolver(...'AOutputPort',真实,...'KOutputPort',真正的);

创建用于分析的FIR数字滤波器系统的对象。同时创建两个全极点数字滤波器系统对象用于合成和去加重。

analysisFilter = dsp.FIRFilter(...'结构体'“格子MA”...'ReflectionCoefficientsSource'“输入端口”);synthesisFilter = dsp.AllpoleFilter('结构体'“格子AR”);deEmphasisFilter = dsp.AllpoleFilter(“分母”[1 -0.95]);

创建系统对象来播放所产生的声音。

audioWriter = audioDeviceWriter('采样率',FS);%设置为地块的可视化。范围= dsp.SpectrumAnalyzer('采样率',FS,...'PlotAsTwoSidedSpectrum',假的,'YLimits'[-140,0],...'FrequencyResolutionMethod'“窗口长度”“窗口长度”,fftLen,...'FFTLengthSource''属性''FFTLength',fftLen,...'标题'“演讲的线性预测”...'ShowLegend',真实,'ChannelNames'{'信号''LPC'});

流处理循环

在这里,你打电话给你的处理循环,你做使用系统对象已实例化的输入音频信号的LPC分析和综合。

当你到达输入文件,这是由检测结束循环停止AudioFileReader系统对象。

〜isDone(audioReader)%读取音频输入SIG = audioReader();分析%%注意,滤波器系数传递作为参数传递给%analysisFilter系统对象。sigpreem = preEmphasisFilter(SIG);写(signalBuffer,sigpreem);sigbuf =读(signalBuffer,2 *框架尺寸,框架尺寸);sigwin = hammingWindow(sigbuf);sigacf =自相关器(sigwin);[SIGA,sigK] = levSolver(sigacf);莱文森% - 德宾siglpc = analysisFilter(sigpreem,sigK);%合成synthesisFilter.ReflectionCoefficients = sigK'。sigsyn = synthesisFilter(siglpc);SIGOUT = deEmphasisFilter(sigsyn);%播放音频输出audioWriter(SIGOUT);%更新地块sigA_padded =零(大小(sigwin),'喜欢',SIGA);%零填充到情节sigA_padded(1:尺寸(SIGA,1),:) = SIGA;范围([sigwin,sigA_padded]);结束

释放

在这里,您拨打的系统释放方法反对关闭所有打开的文件和设备。

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

结论

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