What is the proper way to use a Viterbi Decoder in continuous mode?

1 view (last 30 days)
I'm trying to replicate the viterbi decoding operation in this example:
openExample('comm/DigitalVideoBroadcastingTerrestrialExample','supportingFile','commdvbt.slx')
It's doing okay, but I noticed that the Inner Decoder (Conv Encode) seems to be performing poorly compared to other blocks.
Example (comparing bits of input to output ):
OFDM Error rate: 1.000000
Mapping Error rate: 0.107143
Inner Int Error rate: 0.019761
Inner Dec Error rate: 0.029412
Iteration: 1
...
OFDM Error rate: 1.000000
Mapping Error rate: 0.074625
Inner Int Error rate: 0.003676
Inner Dec Error rate: 0.371936
Iteration: 28288
...
OFDM Error rate: 1.000000 (makes sense because no two input and output symbols will be exactly the same after noise)
Mapping Error rate: 0.058128
Inner Int Error rate: 0.012408
Inner Dec Error rate: 0.035539
Iteration: [last]
Resultant Error rate [all iterations]: 0.98776
If I use 'trunc' and 'hard' I get better results, but the viterbi decoder still sees consistent error rates between 0.01 - 0.50.
I believe the reason is because I'm somehow not achieving continuity between my iterations. What can I do?
trellis = poly2trellis(7,[171 133]); %Trellis for 3/4 encoder
puncpat = [1 0 1 0 1 1]'; %Puncturing Pattern
for i = 1: packets*ofdm_symbols + (2244/204)
[ Some operations]
....
....
%% Inner Coder (Conv Encode)
msg_encoded(startidx_out:endidx_out) = convenc(bin_interleaved(startidx_in:endidx_in), trellis,puncpat);
...
...
[ Some operations]
...
...
%% Inner Decoder (Vit Dec)
msg_decoded(startidx3_out:endidx3_out) = vitdec(Deinterleaved_packet(end-2175:end)', ...
trellis,length(msg),'cont','unquant',puncpat);
...
...
end
  1 Comment
Dylan Ditta
Dylan Ditta on 26 Sep 2024
Oh yeah and my noise is based on:
ofdm_mod = awgn(ofdm_mod, 22,'measured')
22 dB of Signal/noise shouldn't screw up the signal this badly

Sign in to comment.

Answers (1)

Sivsankar
Sivsankar on 7 Oct 2024
Edited: Sivsankar on 7 Oct 2024
In the example model, the Viterbi decoder has a traceback depth of 136. So, make sure that you employ that in your code. Changing to the correct traceback depth may reduce the error rates. As a general estimate, the Traceback depth value is approximately two to three times (k – 1)/(1 – r), where k is the constraint length of the code and r is the code rate
In the model, the output from the Viterbi decoder is carried forward to a delay block and that is considered as the decoded output message in the model. So maybe you could try to implement that in your code before comparing the input and output bits.
You can leverage the following documentation on how you can implement the vitdec function to decode punctured signals:
Try to see if the above implementation decreases the error rates.
Thanks

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!