Сначала теория: предполагая числа со знаком, умножение Q15.16 на другое Q15.16 даст вам Q (15 + 15 + 1). (16 + 16) = число Q31.32. Таким образом, вам нужна 64-битная целочисленная переменная для хранения результата.
Если ваш компилятор имеет 64-битный целочисленный тип, просто используйте его и дайте компилятору понять, как выполнить 32-битное x 32-битное умножение на 16-битном процессоре (для этого и нужны компиляторы): 1003 *
int32_t a_15q16, b_15q16;
int64_t res_31q32 = (int64_t)a_15q16 * (int64_t)b_15q16;
Что вы будете делать с результатом Q31.32, действительно зависит от вашего приложения.
Вам может быть интересно, почему результат требует 31 целое число вместо 30. Фактически, дополнительный бит необходим только для случая, когда вы умножаете -2 ^ 15 на -2 ^ 15. Если гарантируется, что ваши операнды никогда не будут равны -2 ^ 15 одновременно, вы можете принять результат Q30.32.
Чтобы узнать, поддерживает ли ваш компилятор 64-битные целые числа, вам, возможно, придется взглянуть на руководство по компилятору. Если это компилятор C99, посмотрите, есть ли тип int64_t в вашем заголовке stdint.h.