Basic DSP - регулировка уровня - PullRequest
0 голосов
/ 13 ноября 2009

Я новичок в программировании DSP, и мне интересно, как лучше всего выполнить, казалось бы, базовую операцию регулировки уровня. Скажем, у меня есть 8-битное число, которое представляет амплитуду, которую я хочу, чтобы сигнал был в 256 шагах. У меня есть набор 16-битных чисел, представляющих данные сигнала. Каков наилучший способ масштабирования данных сигнала на основе параметра «громкость», чтобы 0 означало полное затухание, а 255 оставило данные без изменений?

Ответы [ 2 ]

6 голосов
/ 13 ноября 2009

То, что раскручивается, говорит:

out_sample = in_sample * volume / 255;

Если вы работаете с настоящим DSP-чипом или оборудованием без быстрых делителей, вы можете использовать этот трюк для получения тех же значений без деления:

int product = in_sample * volume;
out_sample = (product + (product>>8) + 1)>>8;

На современном DSP, таком как C64x +, этот код работает примерно в 10 раз быстрее ...

Также:

Вы говорите о громкости, и в настоящее время вы применяете 8-битную громкость в качестве коэффициента линейного усиления. Тем не менее, наши уши интерпретируют объем как логарифмический эффект. Вы можете сделать преобразование из дБ (ваши 8 бит) в линейное усиление до умножения. Просчитайте их и положите в стол. Пока вы делаете это, вы можете также повысить масштаб значения до 2 ^ 15 для большей точности.

Это даст вам гораздо более приятный отклик, и гораздо меньше кликов, чем вы, делает затухание громкости.

2 голосов
/ 13 ноября 2009

Как насчет

out_sample = in_sample * volume / 255;

Прямое линейное масштабирование. Это предполагает, что вычисление может быть выполнено с использованием более высокой точности, чтобы захватить результат умножения без усечения.

...