Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
long i;
float arg = -FM_CONST1;
int flash = flash_read_byte_first();
for(i = 0; i < NumSamples - 1; i++)
{
float constA, constB;
int n;
int flash_next = flash_read_byte_next();
constA = FM_CONST1 + FM_CONST2 * (float) flash;
constB = FM_CONST2 * ((float)(flash_next - flash) / FM_RATIO);
flash = flash_next;
for(n = 0; n < FM_RATIO; n++)
{
int dac;
arg += constA + constB * (float) n;
dac = (int)(FM_DAC_SCALE * sinus(arg));
DAC_OUT(dac);
}
}
Собственно вопрос вот в чём - контроллер не успевает рассчитывать в реальном времени. Надо бы скорость поднять как минимум в 2-3 раза. Потери времени главным образом происходят при расчёте синуса и вычислениях с float. Синус сделан табличный, но т.к. алгоритм всё время накапливает значение аргумента синуса, то оно может несколько раз проходить целый круг, поэтому в синусе приходится ещё приводить аргумент к заданным "воротам", на что и уходит основное время (ведь расчёт делается во float). А без float сделать сложно (м.б. набег ошибки), да и будет ли быстрее - не факт (т.к. придётся делать с 32-битными целыми в 8-битном контроллере). Например, цифровой фильтр 2-taps я делал и в целой и во float, и оказалось, что во float работает быстрее (не говоря уже о том, что точнее).
Что предпринять?
Можно, допустим, сделать меньше частоту ЦАП, скажем, до 6 кГц. Но этого ведь недостаточно.
Может есть другой алгоритм формирования ЧМ? Без синуса или без выхода аргумента за 2PI?