Почему стол? Эта очень быстрая функция имеет наихудший пик шума при -90 дБ, когда сигнал при -20 дБ. Это безумно хорошо.
Для передискретизации звука я всегда использую один из интерполяторов из статьи о слонах. Это обсуждалось в предыдущий вопрос SO.
Если у вас процессор, у которого нет fp, вы все равно можете делать эти вещи, но они сложнее. Я был здесь. Я чувствую твою боль. Удачи! Раньше я делал преобразование fp в целое для развлечения, но теперь вам придется заплатить мне за это. :-)
Интересные онлайн-ссылки, которые относятся к вашей проблеме:
http://www.audiomulch.com/~rossb/code/sinusoids/
http://www.dattalo.com/technical/theory/sinewave.html
Изменить: дополнительные мысли на основе ваших комментариев
Поскольку вы работаете над сложным процессором, возможно, вам стоит подумать о том, как сделать так, чтобы ваша таблица синусов имела больше углов для просмотра, но при этом оставалась небольшой.
Предположим, вы разбили квадрант на 90 частей (на самом деле вы, вероятно, использовали бы 256 частей, но оставим 90 для удобства и ясности). Закодируйте их как 16 бит. На данный момент это 180 байт таблицы.
Теперь для каждой из этих степеней у нас будет 9 (на самом деле, вероятно, 8 или 16) промежуточных баллов.
В качестве примера возьмем диапазон от 3 до 4 градусов.
sin(3)=0.052335956 //this will be in your table as a 16-bit number
sin(4)=0.069756474 //this will be in your table as a 16-bit number
Итак, мы собираемся взглянуть на грех (3.1)
sin(3.1)=0.054978813 //we're going to be tricky and store the result
// in 8 bits as a percentage of the distance between
// sin(3) and sin(4)
Что вам нужно сделать, так это выяснить, как грех (3.1) находится между грехом (3) и грехом (4). Если это на полпути между ними, закодируйте это как байт 128. Если это четверть пути, закодируйте это как 64.
Это дополнительные 90 байт, и вы закодировали до десятых долей градуса в 16-битном разрешении всего за 180 + 90 * 9 байт. Вы можете расширять по мере необходимости (возможно, до 32-битных углов и 16-битных углов анимации) и очень быстро линейно интерполировать между ними. Чтобы свести к минимуму место для хранения, вы пользуетесь тем фактом, что последовательные значения близки друг к другу.
Редактировать 2: лучший способ кодировать промежуточные углы в таблице
Я только что вспомнил, что, сделав это, я очень компактно выразил разницу между ожидаемым значением в соответствии с линейной интерполяцией и фактическим значением. Эта ошибка всегда в одном направлении.
Сначала я вычислил максимальную ошибку в диапазоне, а затем основал на ней шкалу.
Сработало отлично. Я чувствую, что должен написать код в записи блога, чтобы проиллюстрировать это. :-)
person
Community
schedule
24.07.2009