我需要为我的学期项目使用 matlab 实现一个自适应增量调制编码器和解码器。如何编写良好的自适应增量调制?如何更改delta
(或sigma
)以更好地跟随语音信号?之后如何解码以恢复原始信号?我正在使用具有该主要思想的算法:如果三个连续的样本相等,我将 delta 增加一个常数k
。它很有用,但还不够。
这是用于自适应增量调制的代码:
function [ cn ] = adm_enc( signal )
delta_min = 0.6250/5; % minimum step size
k=1.5;
m = 0.85
% scaling constant
L = length(signal); % length of input signal
Mq = zeros(1,L); %aproximated or quintized signal
dq = zeros(1,L); %quantized error or difference between original signal and aproximated signal
cn = zeros(1,L); %encoded output as a binary signal
delta=ones(1,L);
for n=2:L
d = signal(n) - Mq(n-1); % error or difference between input (original) signal and approximation
if d>0 % if error is greater than 0
dq(n)=delta_min; % equate output to delta_min
else
dq(n)=-1.*delta_min; % equate output to -delta_min
end
if dq(n)==dq(n-1) && dq(n-1) == dq(n-2) % if two previous outputs are equal
delta(n)=k.*delta(n-1); % scale step size
else
delta(n)=delta_min; % otherwise equate output to min step size
end
Mq(n) = Mq(n-1) + delta(n).*dq(n); % calculate approximation signal
end
for i=1:length(cn) % encode the output as a binary signal
if dq(i)==delta_min
cn(i)=1;
else
cn(i)=0;
end
end
end
用于自适应增量解调(解码过程)的代码:
function [ signal ] = adm_dec( cn )
delta_min = 0.6250/5; % minimum step size
L = length(cn); % length of input signal
k=1.5; % scaling constant
signal = zeros(1,L); % initializations
delta=ones(1,L);
for i=1:length(cn) % decode binary input as output of adm
if cn(i)==1
Mq(i)=delta_min;
else
Mq(i)=-1.*delta_min;
end
end
for n=2:L
if Mq(n)==Mq(n-1) % if two sequential input values are equal
delta(n)=k.*delta(n-1); % scale step size
else
delta(n)=delta_min; % otherwise equate step size to min step size
end
signal(n) = signal(n-1) + delta(n).*Mq(n); % calculate output of adm
end
end
在解码过程之后,我使用 alowpass filter
来去除不需要的高频谐波。