Why does the flat part of the BER curve appear after the Viterbi decoder (MatLab)?
while numErrsSoft &lt; 100 &amp;&amp; numBits &lt; 1e7


Nope, you can't stop after 10⁷ bits if you're after error rates &lt; 10⁻⁶. That means you expect to see less than 10 bit errors. That's not a sufficient statistic!

So, this is where I know your curve becomes unreliable, anyway.

You might still be running into some error flow due to the implementation, but I can't look inside Matlab's implementation of neither the QAM decision nor its Viterbi, so these are "meh" at best for scientific considerations about the nature of Viterbi.