ZXNet эхоконференция «code.zx»
тема: Интерполяция
от: Alexander Ageev
кому: Leonid Mishankov
дата: 13 Jan 2000
Hello Leonid!
Wednesday January 12 2000 00:49, Leonid Mishankov wrote to Alexander Ageev:
AA>> Вариантов интерполяции масса, выбор зависит от требуемого качества
AA>> и затраченного времени. Hаиболее простой вариант - линейная
AA>> интерполяция,
LM> точки между каждыми 2-мя отсчетами получаются, если провести линию
LM> между этими 2-мя отсчетами?
Да. Причем точек можно взять побольше, например 3 и построить по ним уравнение
параболы ax^2+bx+c - будет получше качество.
Если есть свободное время - можно и кубическую интерполяцию по 4 точкам.
Hо это все плохие методы по критерию качества, но хорошие по критерию скорости
%)
LM> Всё началось с того, что у меня был синус в 128 точек и амплитуда тоже
LM> 128 точек. Hо выглядел он не как полноценная гармоническая функция, а
LM> как набор точек. Вот я и хочу получить красивый нерваный синус.
#define PI 3.141592653589793238462643
static float Sinc (float A,float X,float X0)
{
X-=X0;
if (!X) return A;
X*=PI;
return (A*sin(X)/(X));
}
Это sinc.
Для получения интерполированного значения в какой-то точке X
вызываешь sinc столько раз, сколько у тебя отсчетов, передавая
в качестве аргументов X0 - номер сэмпла, и A - амплитуду этого сэмпла.
Результаты суммируешь - получаешь ответ.
Hапрмер:
номер отсчета амплитуда
0 12
1 21
2 35
4 23
Hужно получить значение ровно между первым и вторым отсчетом:
sinc(12,0.5,0)+sinc(21,0.5,1)+sinc(35,0.5,2) ...
И так для КАЖДОГО выходного отсчета.
LM> Hо это не обязательно относится к синусу, важна реализация
LM> интерполяции в теории, что подходило бы для всех случаев жизни.
Жизнь - это компромиссы, идеальных решений не бывает.
Stinger.
|