Цитата(blackfin @ Nov 10 2015, 05:17)

Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..
Тогда давайте вместе посчитаем.

Я считал по известной формуле, где расчитываются коэффициенты a, b, c.
Код
// Три бина для 49.9092 Гц, для этой частоты парабола дает точный результат.
x1=15.0F; y1=28.9915F;
x2=16.0F; y2=999.485F;
x3=17.0F; y3=29.052F;
// Коэффициенты параболы.
float a = (y3 - (x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+ x1*x2);
float b = (y2-y1)/(x2-x1) - a*(x1+x2);
float c = (x2*y1 - x1*y2)/(x2-x1) + a*x1*x2;
float x = -b/(2.0F*a);
float f = x*3200.0F/1024.0F;
cout <<"a = " << a << endl;
cout <<"b = " << b << endl;
cout <<"c = " << c << endl;
cout <<"x = " << x << endl;
cout <<"f = " << f << endl; // Искомая частота.
/*
a = -970.463
b = 31054.8
c = -247439
x = 16
f = 50
*/
А что получится у вас?
Кстати, не могли бы вы подкинуть мне методику (или даже код) для аппрроксимации с помощью МНК желатеотно на С или C++, чтобы за приемлемое время можно было подобрать аппроксимирующую кривую. Все пишут "используй МНК", а я не знаю, не помню, как это сделать "на пальцах". Я бы ваш код потестировал и программно и в железе.
PS: Сейчас поискал в этой ветке и нашел, что это вы "из головы" писали выкладки и утверждали, что "это абсолютно точная формула...", я был очень рад, что есть еще люди, способные писать "из головы". И теперь недоумеваю, почему такой высококвалифицированный специалист предложил такой плохой метод, ведь были же выкладки (не каждый способен писать выкладки "из головы").
Вот ссылка на ваш пост
http://electronix.ru/forum/index.php?showt...t&p=1364861Повторюсь, что точное значение по трем точкам удается получить только в случае идеального синуса с постоянной амплитудой (у реального сигнала в электросетях, даже отфильтрованного и при постоянной часоте амплитуда всегда меняется, причем по случайному закону, в зависимости от нагрузки на линию).
Особенно ерундово получается, если средняя точка попадает на ноль. Я тестировал метод для 64-х точечной выборки, каждый раз смещаясь на одну точку. Хотел посмотреть результат на разных участках синусоиды.
Попробовал этот алгоритм в прибор "зашить", так вообще ерунду показывает. Сейчас у меня частота измеряется с помощью компаратора и таймера и "показометр" показывает 49,95...50,05 Гц.
PS: А вот другой метод, ссылку на который предложил Petrov (статья Эрика Якобсена), действительно пригоден для практических расчетов , даже на микроконтроллере (ARM с модулем FPU).
Цитата(blackfin @ Nov 10 2015, 05:17)

Фишка в том, что вы не умеете считать "параболическую аппроксимацию по трем"..
PPS: Если вы не поняли или не захотели вникать в суть метода, то поясню: после расчета 1024-х точечного БПФ мы находим макимальный бин и два его соседних бина, назовем их левый и правый. Т.е. у нас получается три бина. Так вот, если левый бин не равен правому (они отличаются), то метод позволяет по двум бинам определить искомую частоту с точностью 0,03 Гц (как хотите называйте, я называю точностью разницу между заданной частотой и расчетной). Проблемы появляются в случае, когда левый бин почти равен правому, тогда разница равна 0,19 Гц.
Для двух бинов, максимального и следующего за ним формула такая: (16*A16+17*A17)/(A16+A17),
где 16 и 17 - индекс бина, A16 и A17 - амплитуда, соответствующего бина.