function [decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = ConvDecoderHard(data, coderate, ConvDecInitMetric,ConvDecInitStates,ConvDecInitInputs)
trel = poly2trellis(7, [171 133]); % Trellis with contraint length 7 and generator polynomials o'133' o'171'
if ConvDecInitStates == 0
if strcmp(coderate, '1/2') == 1
%s=3-rem(size(data,1),3);
data=[data' zeros(200,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard'); % Decode.
decoded=decoded(41:end,1);
elseif strcmp(coderate, '2/3') == 1
s=3-rem(size(data,1),3);
data=[data' zeros(17*2*3+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard',[1 1 0 1]);
decoded=decoded(41:end,1);
elseif strcmp(coderate, '3/4') == 1
s=4-rem(size(data,1),4);
data=[data' zeros(13*2*4+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', [1 1 0 1 1 0]);
decoded=decoded(41:end,1);
elseif strcmp(coderate, '5/6') == 1
s=6-rem(size(data,1),6);
data=[data' zeros(10*2*6+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard',[1 1 0 1 1 0 0 1 1 0]);
decoded=decoded(41:end,1);
elseif strcmp(coderate, '7/8') == 1
s=8-rem(size(data,1),8);
data=[data' zeros(7*2*8+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', [1 1 0 1 0 1 0 1 1 0 0 1 1 0]);
decoded=decoded(41:end,1);
end
else
if strcmp(coderate, '1/2') == 1
data=[data' zeros(200,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', ConvDecInitMetric,ConvDecInitStates,ConvDecInitInputs); % Decode.
decoded=decoded(41:end,1);
elseif strcmp(coderate, '2/3') == 1
s=3-rem(size(data,1),3);
data=[data' zeros(17*2*3+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', [1 1 0 1], ConvDecInitMetric,ConvDecInitStates,ConvDecInitInputs);
decoded=decoded(41:end,1);
elseif strcmp(coderate, '3/4') == 1
s=4-rem(size(data,1),4);
data=[data' zeros(13*2*4+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', [1 1 0 1 1 0], ConvDecInitMetric,ConvDecInitStates,ConvDecInitInputs);
decoded=decoded(41:end,1);
elseif strcmp(coderate, '5/6') == 1
s=6-rem(size(data,1),6);
data=[data' zeros(10*2*6+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', [1 1 0 1 1 0 0 1 1 0], ConvDecInitMetric,ConvDecInitStates,ConvDecInitInputs);
decoded=decoded(41:end,1);
elseif strcmp(coderate, '7/8') == 1
s=8-rem(size(data,1),8);
data=[data' zeros(2*7*8+s,1)']';
[decoded ConvDecNewMetric,ConvDecnewStates,ConvDecNewInputs] = vitdec(data,trel,40,'cont','hard', [1 1 0 1 0 1 0 1 1 0 0 1 1 0], ConvDecInitMetric,ConvDecInitStates,ConvDecInitInputs);
decoded=decoded(41:end,1);
end
end