Самый эффективный способ обернуть 32-битное целое число в 16-битное значение?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Самый эффективный способ обернуть 32-битное целое число в 16-битное значение?

Сообщение Anonymous »

Я пишу код DSP, который выполняет волновое искажение входного сигнала. Этот код применяет усиление амплитуды (умножает входные данные на значение усиления), затем wave складывает входные данные таким образом, чтобы конечный диапазон амплитуды составлял от -32768 до 32767 (от -1 до ~1 в 16-битном аудиоформате с фиксированной запятой). Значения выше 32767 переносятся в -32768 и наоборот.
Каков наиболее эффективный способ выполнения этой операции переноса? Я обнаружил это случайно на оборудовании STM32, где 16-битные значения автоматически переворачивались при применении больших значений усиления, но эта версия предназначена для работы на другом оборудовании (NXP), и я хотел бы намеренно контролировать то, что я использую. Я делаю, а не полагаюсь на плохо документированный побочный эффект. Мне также хотелось бы, чтобы это было максимально эффективно, сохраняя при этом код на C, поскольку это процесс DSP в реальном времени и, следовательно, критический для времени выполнения.
Пожалуйста, дайте мне знать, какой подход вы бы предложили TIA !
Прилагается фрагмент кода, который демонстрирует начальный подход и то, что должно быть достигнуто. Я не думаю, что использование цикла while будет очень эффективным, хотелось бы улучшить его, чтобы использовать лучший метод:
void wavefolding_distortion::update(void)
{
audio_block_t *block = receiveWritable(0);

if(block){
for (int i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
int32_t in = block->data;

in *= gain;

while(in > 32767){
in -= 65536;
}

while(in < -32768){
in += 65536;
}

block->data = in;
}
transmit(block);
release(block);
}

}


Подробнее здесь: https://stackoverflow.com/questions/793 ... -bit-value
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»