[Home] | [Donate!] [Контакты] |
Оглавление
Точность линейной интерполяции при вычислении значений 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.