Я новичок в программировании DSP, и мне интересно, как лучше всего выполнить, казалось бы, основную операцию выравнивания уровня. Скажем, у меня 8-битное число, которое представляет амплитуду, которую я хочу, чтобы сигнал находился на 256 шагах. У меня есть набор из 16 бит чисел, представляющих данные сигнала. Каков наилучший способ масштабирования данных сигнала на основе параметра «volume», так что 0 - полное затухание, а 255 оставляет данные неизменными?Базовый DSP - регулировка уровня
ответ
Как насчет
out_sample = in_sample * volume/255;
прямых линейных изменений размера. Это предполагает, что вычисление может быть выполнено с использованием более высокой точности для захвата результата умножения без усечения.
Что размотки сказал:
out_sample = in_sample * volume/255;
Если вы работаете на чипе реального DSP или аппаратного обеспечения, без быстрых разделителей вы можете использовать этот трюк, чтобы получить те же значения, без разделения:
int product = in_sample * volume;
out_sample = (product + (product>>8) + 1)>>8;
на современном DSP вроде C64x + этот код работает примерно в 10 раз быстрее ...
также:
Вы говорите об объеме, и в настоящее время вы применяете 8-битный том в качестве линейного коэффициента усиления. Однако наши уши интерпретируют объем как логарифмический эффект. Вы можете сделать преобразование из db (ваши 8 бит) в линейное усиление до умножения. Предварительно расчитайте их и положите в стол. Пока вы это делаете, вы также можете повысить масштаб значения до 2^15 для большей точности.
Это даст вам гораздо более приятный ответ и намного меньше щелчков, сделанных вами.