Как вы заметили, 16-битное умножение может привести к 32-битному результату.Продолжая, я предполагаю, что ваша запись с фиксированной запятой равна 16.16.
Чтобы выполнить ваше второе умножение, вы должны сначала сдвинуть результат исходного мул обратно на 16 бит.Поскольку результат теперь возвращается в желаемый формат 16.16, вы можете продолжить со вторым множителем («... если я хочу умножить это на другой 16-битный коэффициент с фиксированной точкой ...»).После этого второго умножения сдвиньте результат вниз на 16 бит, чтобы восстановить нотацию 16.16.
Перед отправкой значения из ЦАП, я ожидаю, что вам нужно оставить нотацию с фиксированной точкой и вернуться к целочисленной форме.Для этого просто сдвиньте значение на 16 бит.Прежде чем оставить запись с фиксированной запятой, вы можете рассмотреть округление результата.Предполагая положительное число с фиксированной запятой, это можно сделать, прибавив 0,5f к результату до последнего сдвига вправо.(В 16.16 0.5f равно 2 ^ 15.)
Как всегда, следует тщательно изучать последовательные арифметические операции с фиксированной точкой, чтобы избежать переполнения левой части.Операции могут быть переупорядочены или учтены во избежание переполнения.В Интернете есть несколько хороших учебных пособий, которые могут помочь учебное пособие .
Что касается выполнения математики с фиксированной запятой в matlab, функции побитового сдвига достаточно просты в использовании: reference.Конечно, набор инструментов с фиксированной точкой делает это еще проще.