[Home]

Табличное вычисление синуса с использованием линейной интерполяции

Оглавление
Точность линейной интерполяции при вычислении значений sin
Минимальный размер таблицы синусов для цифрового синтеза сигнала



Точность линейной интерполяции при вычислении значений sin

На малых участках нелинейную функцию можно приближённо заменить линейной с целью значительного упрощения численных расчётов. Если y1, y2 - значения некоторой функции в достаточно близко расположенных точках x1, x2, то на отрезке [x1, x2] значения функции y(x) могут приближённо вычисляться по формуле:
$$ y(x) \approx y1+\frac{y_2-y_1}{x_2-x_1}(x-x_1), $$ причём в точках x1, x2 формула даёт всегда точные значения y1 и y2.

Такое линейное приближение произвольной функции на отрезке с использованием значений функции на концах этого отрезка и является линейной интерполяцией.

Воспользуемся линейной интерполяцией для вычисления синуса в любой точке, если у нас имеется таблица значений синуса в некоторых точках области [0, 2π) с фиксированным шагом d и оценим допускаемую при этом погрешность. Это, в свою очередь, позволит нам определить максимальный шаг аргумента в таблице синусов, при котором допускаемая погрешность не превысит заданного предельного значения. Сведения о погрешности дадут нам возможность составить и использовать таблицу минимальных размеров, не содержащую избыточной, излишней при требуемом уровне точности информации.

Предположим, что нам требуется определить значение функции sin в точке \(\phi\), которая находится между точками \(\phi_0\) и \(\phi_0+d\), для которых в таблице имеются значения синусов. Тогда, пользуясь линейной интерполяцией, получаем: $$ \sin\phi \approx \sin\phi_0+\frac{\sin(\phi_0+d)-\sin\phi_0}d \Delta \phi, \tag 1 $$ где \(\Delta\phi=\phi-\phi_0, 0 \le \Delta\phi \le d\).

Заменяя точное значение функции на интерполированное, мы допускаем ошибку $$ \Delta s=\sin\phi-\sin\phi_0-\frac{\sin(\phi_0+d)-\sin\phi_0}d \Delta \phi. \tag 2 $$ Из формулы видно, что ошибка обращается в 0 в точках \(\Delta \phi=0\) и \(\Delta \phi=d\) (что вполне естественно, так как в этих точках в качестве интерполированного используется точное табличное значение). Наибольшего по модулю значения ошибка достигает где-то внутри отрезка, в точках максимума либо минимума \(\Delta s\) как функции от \(\Delta \phi\). Найдём точки экстремума из условия равенства нулю производной в этих точках: $$ \cos(\phi_0+\Delta\phi_e)-\frac{\sin(\phi_0+d)-\sin\phi_0}d=0. \tag 3 $$ Применяя формулу разности синусов для преобразования числителя дроби, получаем $$ \sin\alpha-\sin\beta=2\cos\frac{\alpha+\beta}2 \sin\frac{\alpha-\beta}2, \\ \sin(\phi_0+d)-\sin\phi_0=2\cos\frac{2\phi_0+d}2 \sin\frac d 2. $$ Так как шаг изменения аргумента в таблице d - малая величина, \(|d| \ll 1\), то $$ \sin\frac d 2 \approx \frac d 2, $$ тогда (3) можем записать в виде: $$ \cos(\phi_0+\Delta\phi_e)-\cos\left(\phi_0+\frac d 2\right) \approx 0, $$ откуда следует, что максимума абсолютная величина ошибки достигает в точке $$ \Delta\phi_e \approx \frac d 2. $$

Подставляя найденное значение в (2), получим величину наибольшего отклонения интерполяционного приближения от истинного значения функции sin: $$ \Delta s(d/2)=\sin\left(\phi_0+\frac d 2\right)-\sin\phi_0-\frac{sin(\phi_0+d)-\sin\phi_0}2. $$ В дальнейшем будем обозначать эту величину просто как \(\Delta s\), так как нас интересует именно наибольшая величина ошибки.

Применяя формулу для разности синусов, получаем: $$ \Delta s=2\cos\frac{2\phi_0+d/2}2 \sin\frac d 4-\frac 1 2 \left(2\cos\frac{2\phi_0+d}2 \sin\frac d 2\right). $$ С учётом того, что \(\sin\frac d 4 \approx \frac d 4, \sin\frac d 2 \approx \frac d 2\), получаем $$ \Delta s \approx \frac d 2 \cos\left(\phi_0+\frac d 4\right)-\frac d 2 \cos\left(\phi_0+\frac d 2\right). $$ Теперь применяем формулу разности косинусов: $$ \cos\alpha-\cos\beta=-2\sin\frac{\alpha+\beta}2 \sin\frac{\alpha-\beta}2, \\ \Delta s \approx \frac d 2 \left(-2\sin\frac{2\phi_0+3d/4}2 \sin\frac{-d/4}2\right)= \\ =d\sin\left(\phi_0+\frac{3d}8\right)\sin\frac d 8. $$

Опять воспользуемся тем, что синус от малого аргумента примерно равен значению аргумента: $$ \Delta s \approx \frac{d^2}8 \sin\left(\phi_0+\frac{3d}8\right). $$ Видим, что наибольшее отклонение вычисленного путём линейной интерполяции результата от точного значения будет достигаться при \(\sin(\phi_0+3d/8)=\pm 1\), следовательно $$ |\Delta s_{max}|=\frac{d^2}8. $$

Если же от нас требуется, чтобы допускаемая погрешность при интерполяции не превышала по абсолютной величине значения \(\Delta s\), то следует выбирать шаг таблицы из условия $$ d \le \sqrt{8\Delta s}. \tag 4 $$ Таблица значений для аргументов из промежутка [0, 2π) будет содержать L элементов, $$ L \ge \frac{2\pi}d, \\ L \ge \frac{2\pi}{\sqrt{8\Delta s}}. \tag 5 $$

Минимальный размер таблицы синусов для цифрового синтеза сигнала

Предположим, что с помощью микроконтроллера и цифро-аналогового преобразователя (DAC) мы осуществляем генерацию синусоидального сигнала. Требуется оценить, какие размеры должна иметь таблица синусов, чтобы ошибка вычислений не превышала заданной величины.

Пусть используемый DAC имеет однополярный выход с напряжением от 0 до VREF. В таком случае нам потребуется иметь постоянное смещение в сигнале, так как наш DAC не способен сформировать сигналы с отрицательными значениями напряжения. Обозначим постоянное смещение сигнала как a0, амплитуду сигнала a1, сам сигнал будет описываться выражением $$ u=a_0+a_1\sin\phi, \tag 6 $$ здесь \(\phi\) - фаза сигнала, соответствующая данному моменту времени. В соответствии со свойствами нашего DAC, $$ a_0-a_1 \ge 0, \\ a_0+a_1 \le V_{REF}. $$ Отсюда следует, что a1 должно быть в переделах от 0 до VREF/2, а величина a0 может быть задана от a1 до (VREF-a1).

Из (6) видим, что абсолютная ошибка \(\Delta u\), допускаемая при вычислении величины сигнала, при условии что синус вычисляется с ошибкой \(\Delta s\), составляет $$ \Delta u=a_1\Delta s. $$ Нас в первую очередь интересует наибольшая величина ошибки, которая будет при максимальном возможном значении a1=VREF/2: $$ \Delta u=V_{REF}\Delta s/2. \tag 7 $$

Нет смысла добиваться чрезмерно малых значений ошибки вычислений, так как с учётом ограниченной разрядности N преобразователя DAC, напряжение на выходе всё равно будет установлено кратным 1 LSB=VREF/2N. Как правило, точность вычислений в 1/4..1/2 LSB вполне достаточна.

Если зададимся точностью на уровне 1/2 LSB, то из (7) находим соответствующую этому значению допустимую величину ошибки при вычислении синуса: $$ \frac 1 2 \frac{V_{REF}}{2^N}=V_{REF}\Delta s/2, \\ \Delta s=1/2^N. $$ Значит, требуемый размер таблицы синусов в соответствии с (5) $$ L \ge \frac{2\pi}{\sqrt{8/2^N}}=\frac{2\pi}{\sqrt 8} 2^{N/2} \approx 2.22 \cdot 2^{N/2}, \\ L \ge 2.22 \cdot 2^{N/2}. \tag 8 $$ Наиболее простой программная реализация вычислений получается в том случае, если в качестве L выберем ближайшее к (8), большее значение, являющееся степенью 2. Например, генерация синусоиды с использованием 12-разрядного ADC, требует, в соответствии с (8) таблицы синусов из 142 элементов, поэтому выбираем значение L=256=28.

author: hamper; date: 2016-10-25
  @Mail.ru